낙하 및 가속 속도를 계산하는 방법은 무엇입니까? 않고 착륙 해야하는 착륙선 게임을 생각하고

우주선을 조종하고 충돌하지 않고 착륙 해야하는 착륙선 게임을 생각하고 있습니다. 작업 시간 엔진과 관련하여 낙하 속도 또는 가속 속도를 계산하는 간단한 공식은 무엇입니까?



답변

가장 간단한 방법은 오일러 통합입니다. 위치 벡터와 속도 벡터를 저장해야합니다. 각 프레임에서 :

  • 마지막 통합 단계 이후 경과 된 시간 측정 : dt
  • 엔진으로 인한 힘 vecor 계산 : F
  • 가속도 벡터 계산 : A = F / m 여기서 m은 우주선 질량입니다.
  • 중력 벡터를 추가 = + G가 있는지 확인하는 G의 행성의 중심을 향해 점
  • 속도 벡터 업데이트 V = V + A · dt
  • 위치 벡터 업데이트 X = X + V · dt

( 스칼라의 경우 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) 인 경우 라이브러리에는 다음이 있어야합니다.

  • 벡터 저장 개체 (각 벡터에 대한 n 개의 부동 소수점 숫자 목록)
  • 합계 연산자 (구성 요소 별 합계 구성 요소)
  • 스칼라 곱셈 연산자 (각 구성 요소에 float를 곱한 값)
  • 벡터 사이의 점의 곱셈 (성분에 성분을 곱하고 모두 합산)
  • 벡터 길이 (자체로 점이 찍힌 벡터의 제곱근)

이를 수행하거나 직접 구현하는 라이브러리를 사용할 수 있습니다. 벡터는 구조체 또는 클래스 일 수 있습니다. 선택은 당신의 것입니다.

각 엔진은 다음과 같이 설명해야합니다.

  • 추력 및 방향을 나타내는 벡터
  • 최대 전력 사용시 초당 연료 사용량을 나타내는 스칼라;

사용자 입력은 각 엔진에 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 접근 방식은 아주 짧은 시간 단위로 적용되고 추력을 조정합니다 (또는 연료가 연소하기 위해 로켓이 스로틀되는 것을 막 으면 연료 사용이 유지됩니다) 로켓이 연료를 태울 때 각 반복 사이에 지정된 추력이 아닌 지정된 가속도).