스팀에서 KSP 실행!!
처음으로 게임 내 위성인 뮌(Mun)에 가보겠습니다. 지구로 치면 달이죠.
힘차게 날아오르는 로켓
다 쓴 연료통 세게를 분리하고 가운데 로켓 점화!
둥근 모습의 지평선이 보이네요.
우측 하단에 입이 쭉 벌어진 비행사가 보입니다.
게임 내 행성인 커빈의 대기권을 빠져나오고 있는 로켓.
드디어 우주가 보이기 시작하네요.
눈 앞에 펼쳐진 은하수를 보고 경이로움을 감추지 못하는 조종사...
연료 탱크 분리 후 다음 단에 있는 3개의 로켓을 다시 점화!
속도가 초속 2600m를 넘어섰네요.
태양전지판을 펼쳐서 전기를 충전합니다.
궤도시뮬레이터로 달에 접근하기 위한 궤도를 계산합니다.
지구로부터 유유히 멀어지고 있는 우주선...
달 주위를 도는 궤도를 만들고
궤도를 점점 좁혀가면서 달에 접근합니다.
저 멀리 지구가 보이네요.
달 착륙 시작!!
멀리서 본 우주선의 현재 위치와 궤도
로켓을 역분사해서 속도를 줄여줍니다.
속도가 초속 67m까지 줄어들었네요. 저 멀리 지구도 보입니다.
달 표면에 안착!
주변에서 뒹굴고 있는 부품 두개는 다 쓴 연료통입니다 ㅋ
우주선 밖으로 나와 달 표면에 내려봅시다.
드디어 달에 첫발을 딛는 순간
http://tibyte.kr/179 으로 이어집니다!
1. 플래시
자세한 설명은 아래에 있습니다.
2. 데이터&설명
지구에서 관측되는 화성의 움직임을 플래시로 나타내 본 것입니다.
아래와 같은 조건들을 설정했습니다.
- 공전궤도 모양
원(평면)으로 가정
- 공전궤도 반지름
지구 : 1화성 : 1.5
-공전속도
지구 : 1.88
화성 : 1
- 궤도경사와 승교점경도
지구 : 7.3˚ 349˚화성 : 5.7˚ 50˚
- 천구의 중심
태양 (중심을 지구로 잡으면 투영면이 움직여서 알아보기가 불편하고,
태양으로 잡아도 화성의 역행 움직임이 나타나는 모양을 설명하기에는
큰 차이가 없기 때문에 편의상 태양을 기준으로 함.)
- 관찰자의 고도
황도를 기준으로 pi/13 라디안
지구와 화성의 공전궤도면이 일치하지 않기 때문에
화성이 충 부근에서 역행을 할 때 α모양이나 s모양이 나타나게 됩니다.
예전에 만들었던 것(http://www.tibyte.kr/126)은 두 행성의 공전궤도를 평면상에 둬서
이런 현상을 확인할 수 없었는데 이번에 입체로 구현해보았습니다.
3. 코드 구현
(1)
Vector3D객체에 각 천체들의 위치벡터를 저장한 후
눈으로 직접 보기 위해 Sprite객체를 움직일 때는 아래와 같은 코드를 사용함.
earth.x = earthPoint.x + sunPoint.x;
earth.y = Math.sin(viewAng)*(earthPoint.y)+sunPoint.y +
Math.cos(viewAng)*(earthPoint.z)+sunPoint.z;
viewAng는 시점의 고도이며, 이 값에 따라 위치벡터의 y,z값이 Sprite의 y값에 적용됩니다.
모니터는 2D니까 3차원 좌표를 2차원 좌표로 변환해야 하기 때문임.
(2)
공전궤도를 기울이는 함수 inclineObt()
function inclineObt(vec3D:Vector3D,xy:Number=0, zx:Number=0):Vector3D
{
var transVec3D:Vector3D = new Vector3D();
var matrix:Matrix = new Matrix(0,0,0,0);
matrix.a = vec3D.x;
matrix.b = vec3D.z;
matrix.rotate(zx); //
transVec3D.x = matrix.a;
transVec3D.z = matrix.b;
matrix.a = transVec3D.x;
matrix.b = vec3D.y;
matrix.rotate(xy);
transVec3D.y = matrix.b;
transVec3D.w = vec3D.w;
return transVec3D;
}
궤도경사와 승교점고도 수치에 맞게 공전궤도를 기울인다.
Matrix클래스의 rotate메서드는 이차원 회전행렬
( cos -sin)( sin cos) 를 대상 행렬 앞에 곱함.
(3)
천구면에 투영된 화성의 위치를 구하는 함수
function calcProjPoint(vec1:Vector3D, vec2:Vector3D):Vector3D
var direcVec3D:Vector3D = vec2.clone();
direcVec3D.decrementBy(vec1);
var a:Number = direcVec3D.x;
var b:Number = direcVec3D.y;
var c:Number = direcVec3D.z;
var d:Number = vec1.x;
var e:Number = vec1.y;
var f:Number = vec1.z;
/* 이차방정식의 근의 공식으로 투영된 외행성의 위치를 구한다*/
var product:Number = calcQuadratic(a*a+b*b+c*c, 2*(a*d+b*e+c*f), d*d+e*e+f*f-sphereRad*sphereRad);
direcVec3D.scaleBy(product);
return direcVec3D.add(vec1);
천구면은 편의상 중심점을 태양의 중심으로 맞춤.
sphereRad 는 천구의 반지름값이므로 투영된 화성의 상은 태양으로부터 항상 sphereRad위치에 있게 됨.
천구면에 투영된 화성의 위치벡터는 (지구의위치벡터 + p*지구에서화성을바라보는벡터) 이므로 p값을 먼저 구해야 함.
즉, 지구벡터+p*(화성-지구벡터)의 거리는 sphereRad와 같으므로
거리 = 거리 방정식을 세워보면 위 코드와 같은 방법으로 p(product)값을 구할 수 있다. (calcQuadratic은 근의 공식으로 이차방정식의 (큰)해를 구하는 함수)
(4)
3D천구 뼈대를 그리는 부분
var polygons:Vector.<Vector.<Vector3D>> = new Vector.<Vector.<Vector3D>>(19);
var model2D:Vector.<Vector.<Point>> = new Vector.<Vector.<Point>>(19);
for(var i_lati:int = 0; i_lati<19; i_lati++) {
polygons[i_lati] = new Vector.<Vector3D>(36);
model2D[i_lati] = new Vector.<Point>(36);
for(var j_longi:int = 0; j_longi<36; j_longi++) {
polygons[i_lati][j_longi] = new Vector3D();
model2D[i_lati][j_longi] = new Point();
//초기위치
polygons[i_lati][j_longi].z = radius*Math.sin(getLatitude(i_lati));
polygons[i_lati][j_longi].x = radius*Math.cos(getLatitude(i_lati))*Math.cos(getLongitude(j_longi));
polygons[i_lati][j_longi].y = radius*Math.cos(getLatitude(i_lati))*Math.sin(getLongitude(j_longi));
//시점에따른 변환
model2D[i_lati][j_longi].x = polygons[i_lati][j_longi].x + central.x;
model2D[i_lati][j_longi].y = Math.sin(viewAng)*(polygons[i_lati][j_longi].y)+central.y +
Math.cos(viewAng)*(polygons[i_lati][j_longi].z)+central.z;
function getLatitude(index:int):Number{return (index*10-90)/180*Math.PI;}
function getLongitude(index:int):Number{return (index*10)/180*Math.PI;}
Vector에 Vector3D객체와 Point객체를를 2차원으로 할당하고
Vector3D에는 위도를 10도단위로 한층씩 훑어가면서 경선을 이루게 될 36개의 점의 xyz 3차원 좌표를 저장.
Point에는 2차원인 모니터에 표시하기 위해 위에서 구한 xyz좌표를 xy좌표로 변환 .
2007년에 만들었던 플래시인데 큰 오류가 있어서 약간 수정했습니다. 빨간원 : 태양 파란원 : 지구 초록원 : 화성 하얀원&빨간선 : 천구면에 투영된 화성의 겉보기 경로 천구의 천정(태양계의 위쪽)에서 바라본 시점이라서 아래 플래시에서는 역행할 때 경로가 겹쳐지게 되지만 지구와 화성의 공전궤도면이 일치하지 않기 때문에 실제 지구에서 볼 때는 S자 모양이나 α자 모양이 나타납니다. 나중에 한번 3D로도 만들어 봐야겠네요.. 12.12.6 수정3D로 만든 주소입니다.http://tibyte.kr/141
===============================================================================================