답변:
가장 간단한 방법은 오일러 통합입니다. 위치 벡터와 속도 벡터를 저장해야합니다. 각 프레임에서 :
( 스칼라의 경우 x , 벡터의 경우 x )
dt 가 작은 지 확인하십시오 ...
| G | 지구의 경우 약 9.8m / s², 달의 경우 약 1.6m / s²입니다.
일반적으로 중력 상호 작용으로 인한 흡수력은 다음과 같습니다.
그것은 각 신체에 영향을 미치며 다른 신체를 향합니다.
G의 스칼라는 매우 유명 중력 상수 가 6.67e-011 N (m / kg)에 관한 ²
가속에 관심이 있기 때문에 :
가속도를 계산하려면 행성의 질량 (m2)과 반경 (r) 만 알면됩니다.
일반적으로 행성을 우주선으로 이동시키는 가속도는 무시할 수 있습니다. 보통 m1은 m2에 비해 무시할 수 있기 때문입니다.
그러나 작은 소행성에 착륙하려는 경우 아마도 두 번째 단계에서 총 힘 벡터에 그 힘을 더하는 일반 공식을 사용해야 할 것입니다.
편집하다:
필요에 따라 구현에 대한 힌트가 있습니다. 필요할 것이예요:
우선 모든 벡터 라이브러리 : 게임은 모노 / 비 / 트리 / 4 ... 차원적일 수 있습니다.
n이 선택한 차원 (경우에 따라 2 또는 3) 인 경우 라이브러리에는 다음이 있어야합니다.
이를 수행하거나 직접 구현하는 라이브러리를 사용할 수 있습니다. 벡터는 구조체 또는 클래스 일 수 있습니다. 선택은 당신의 것입니다.
각 엔진은 다음과 같이 설명해야합니다.
사용자 입력은 각 엔진에 0 (사용하지 않은 엔진)과 1 (최대 출력) 사이의 숫자를 제공하는 데 사용됩니다 (엔진 (사용)).
스러스트 벡터에 엔진 계수를 곱하여 엔진 실제 신뢰를 얻고 사용 가능한 모든 엔진의 모든 결과를 요약합니다. 이것은 당신에게 두 번째 단계 의 F 를 줄 것 입니다.
엔진 팩터를 사용하여 각 엔진의 실제 연료 사용량을 알 수 있습니다. 즉, 엔진 팩터에 연료 사용량과 dt 를 곱하여 순간 연료 사용량을 알 수 있습니다. 총 연료 용량 변수에서이 값을 뺄 수 있습니다 ( 연료 질량이 상당 할 경우 총 질량 m 을 업데이트 할 수 있습니다 ).
이제 통합을 사용하여 새 위치를 계산하고 행성 표면과의 충돌을 점검 할 수 있습니다. 있는 경우 속도 벡터의 길이를 사용하여 착륙이 성공했는지 아니면 재앙인지를 말하십시오.
분명히 다른 충돌 검사를 수행 할 수 있고, 일부 표면 엔티티는 랜딩 포인트로 허용되지 않으므로 모든 충돌은 치명적입니다.
나는 입력을 얻는 방법과 우주선을 당신에게 렌더링하는 방법을 남깁니다. 예를 들어 엔진 요소를 사용하여 엔진 상태를 프레임별로 렌더링 할 수 있습니다.
다른 훌륭한 답변이 약간 이론적으로 보이는 것처럼 간단한 코드 버전은 다음과 같습니다.
// Position of the lander:
var positionX = 100.0;
var positionY = 100.0;
// Velocity of lander
var velocityX = 0.0;
var velocityY = 0.0;
// Acceleration due to gravity
var gravity = 1.0;
// If the player is pressing the thrust buttons
var isThrusting = false;
var isThrustingLeft = false;
var isThrustingRight = false;
// Thrust acceleration
var thrust = -2.0;
// Vertical position of the ground
var groundY = 200.0;
// Maximum landing velocity
var maxLandingVelocity = 3.00;
onUpdate()
{
velocityY += gravity;
positionX += velocityX;
positionY += velocityY;
if (isThrusting)
{
velocityY += thrust;
}
if (isThrustingLeft)
{
velocityX += thrust;
}
else if (isThrustingRight)
{
velocityX -= thrust;
}
if (positionY >= floorY)
{
if (velocityY > maxLandingVelocity)
{
// crashed!
}
else
{
// landed successfully!
}
}
}
불행히도, 여기의 수학은 털이 있습니다. FxIII의 대답은 떨어지는 물체의 일반적인 경우에 적합하지만 로켓에 대해 이야기하고 있으며 로켓은 연료를 태워 버립니다.
나는 그것을하는 코드를 보았지만 완전히 문서화되지 않았으며 그 배후의 수학을 알아낼 수 없었습니다. CPU가 제한되지 않는 한, 나는 그것을 귀찮게하고 단순하게 강제하지 않을 것입니다 .FxIIIs 접근 방식은 아주 짧은 시간 단위로 적용되고 추력을 조정합니다 (또는 연료가 연소하기 위해 로켓이 스로틀되는 것을 막 으면 연료 사용이 유지됩니다) 로켓이 연료를 태울 때 각 반복 사이에 지정된 추력이 아닌 지정된 가속도).