낙하 및 가속 속도를 계산하는 방법은 무엇입니까?


9

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

답변:


28

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

  • 마지막 통합 단계 이후 경과 된 시간 측정 : 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 을 업데이트 할 수 있습니다 ).

이제 통합을 사용하여 새 위치를 계산하고 행성 표면과의 충돌을 점검 할 수 있습니다. 있는 경우 속도 벡터의 길이를 사용하여 착륙이 성공했는지 아니면 재앙인지를 말하십시오.

분명히 다른 충돌 검사를 수행 할 수 있고, 일부 표면 엔티티는 랜딩 포인트로 허용되지 않으므로 모든 충돌은 치명적입니다.

나는 입력을 얻는 방법과 우주선을 당신에게 렌더링하는 방법을 남깁니다. 예를 들어 엔진 요소를 사용하여 엔진 상태를 프레임별로 렌더링 할 수 있습니다.


그것은 훌륭하지만 코드에서 그것을 비추는 방법은 훌륭 할 것입니다.
Dvole

1
물리학을 배우는
Ming-Tang

이 사람은 그의 물리학을 알고 있습니다!
MGZero

7

다른 훌륭한 답변이 약간 이론적으로 보이는 것처럼 간단한 코드 버전은 다음과 같습니다.

// 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!
        }
    }
}

2
간단하게 유지하십시오. 나는 이것이 그가 찾고있는 선을 따라야한다고 생각합니다.
Beska

2

불행히도, 여기의 수학은 털이 있습니다. FxIII의 대답은 떨어지는 물체의 일반적인 경우에 적합하지만 로켓에 대해 이야기하고 있으며 로켓은 연료를 태워 버립니다.

나는 그것을하는 코드를 보았지만 완전히 문서화되지 않았으며 그 배후의 수학을 알아낼 수 없었습니다. CPU가 제한되지 않는 한, 나는 그것을 귀찮게하고 단순하게 강제하지 않을 것입니다 .FxIIIs 접근 방식은 아주 짧은 시간 단위로 적용되고 추력을 조정합니다 (또는 연료가 연소하기 위해 로켓이 스로틀되는 것을 막 으면 연료 사용이 유지됩니다) 로켓이 연료를 태울 때 각 반복 사이에 지정된 추력이 아닌 지정된 가속도).


연료에서 나가는 것은 떨어지는 파라미터를 나타냅니다. 단순히 값이 감소하는 벡터 힘입니다. 내가 잘못? 간단한 경우에는 F에 대한 G가 있습니다. 여기서 F는 로켓의 엔진이고 G는 지구의 중력입니다. 물체에 G를 벡터 힘으로 적용해야합니다. F> = G 인 한 "객체"는 F 방향으로 움직여야합니다.
daemonfire300

2
@ daemonfire300 : 당신은 오해합니다. 나는 연료 부족의 효과가 아니라 연료 연소의 효과에 대해 이야기하고 있습니다. 엔진의 일정한 스로틀 설정은 지속적으로 상승하는 가속도를 생성하고 일정한 가속은 지속적으로 연료 연소율을 감소시킵니다. 이것은 FxIII가 제공하는 간단한 계산이 잘못된 연료 사용 수치를 산출 함을 의미합니다.
Loren Pechtel

연료가 연소 될 때 A = F / M으로부터의 가속 이득의 양은 차량에 대한 연료 질량의 비율이 터무니없이 높거나 연료 연소율이 유사하지 않으면 무시할만한 값이 될 것이다. 결국 이것은 게임이다.
Patrick Hughes

@ 패트릭 휴즈 : 실제 로켓 착륙선에 의해 운반되는 연료량 (화성 에어로 브레이크 / 로켓 하이브리드 사례는 포함하지 않음)은 총 중량의 상당 부분을 차지합니다. 연료 : 가속 비를 고정한다고 가정하면 매우 잘못된 답을 얻을 수 있습니다.
Loren Pechtel

1
이것은 질문에 대한 답변이 아니라 @FxIII의 답변에 대한 주석입니다.
Jonathan Connell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.