AI를 움직일 때 중력을 고려하는 방법


9

2D 게임을 만들고 있습니다. 현재 플레이어가 조종하는 헬리콥터가 있습니다. 위쪽, 왼쪽 및 오른쪽 화살표 키를 사용하여 제어됩니다.

y 축의 dy속도 는 이고 x 축의 속도는 dx입니다.

물리학은 다음과 같습니다.

때마다 UP 누르지 않은 , dy일정한 가속도로 가속 무기한 아래쪽으로. (중량). dx현재 값으로 유지됩니다.

되면 UP 누를 때 , dy그것은 현재 무엇이든에서 일정한 가속도로 가속 최대 4 (4 속도가 도달 할 때까지 상승). dx현재 값으로 유지됩니다.

왼쪽을 누르면 , dx그것은 현재, 무엇이든에서 일정한 가속에 가속 최대 -4 .

오른쪽을 누르면 , DX를 가속화은 현재, 무엇이든에서 등가 속도에서 최대 4 .

( 내가 말했듯 이 LEFT 또는 RIGHT를 누르고 UP 을 동시에 누르지 않으면dy 중력이 헬리콥터에 영향을 미치기 때문에 점점 작아지고 작아집니다)

이 모든 것이 헬리콥터가 직선이 아닌 공중의 아치를 따라가는 경우가 많습니다.

이것은 매우 현실적으로 보이는 물리를 만듭니다.

내 질문은 :

AI 인 상대 헬리콥터는 동일한 물리 시스템을 사용하여 움직여야합니다.

AI가 현재 위치에서 B 지점으로 가고 싶다고 가정 해 봅시다.

여기에 이미지 설명을 입력하십시오

게임에 중력이없고 점진적인 가속이 없다면 쉬울 것입니다. AI의 위치에서 B까지의 벡터를 간단히 그려 AI가 그것을 따르도록 만들 것입니다.

그러나 중력과 점진적인 가속 있기 때문에 AI는 거의 직선으로 움직일 수 없습니다 . 가능한 한 시간 효율적으로 AI를 B 지점으로 옮기는 가장 좋은 방법은 무엇입니까?

AI를 특정 목적지로 이동할 때 중력을 어떻게 고려할 수 있습니까?

(설명하기가 더 쉬운 경우, 점 B는 대각선이 아니라 AI와 y 축에서 같은 수준에있는 것으로 간주하십시오.)

감사


AI가 움직이는 동안 물리를 비활성화 할 수 있습니까? 그렇다면 포인트를 향해 이동하는 동안 비활성화하고 도달했을 때 활성화 할 수 있습니다.
Zhafur

@Zhafur AI의 움직임을 비현실적으로 보이게하거나 최소한 플레이어의 움직임과 다르게 보일 것입니다. AI의 움직임이 플레이어의 움직임과 동일하게 보이기를 원합니다.
user3150201

답변:


4

tl; dr :

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

y와 동일합니다. 속도를 제로와 최대 속도 사이로 제한해야합니다. 적이 어느 시점에서 속도가 매우 느리고 정지하려고하면 반대 방향으로 움직이기 시작할 수 있습니다. 허용하지 마십시오. 속도가 느려지고 속도가 1 * Acc 인 경우 중지하십시오.

긴 버전 : 장애물이없는 경우 y 축의 이동은 x 축의 이동과 전혀 관련이 없으며 영향을 미치지 않습니다. 따라서 당신이 묘사하는 질문은 두 가지 질문으로 나눌 수 있습니다.

  1. x 축으로 이동
  2. 그리고 y 축으로 이동합니다.

CS.x& CS.y는 x 및 y 축의 현재 속도입니다.

TS.x& TS.y관련 축에서 현재 속도를 고려할 때 수직 또는 수평으로 만 정지하는 데 걸리는 시간입니다.

D.x& D.y는 각 축의 거리입니다.

tl; dr : 다음 조건에 해당하는 지점에 도달 할 때까지 x 축에서 (가능한 경우 [최고 속도에 도달하지 않은 경우]) 계속 가속합니다.

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

y와 동일합니다.


2

비슷한 문제에 사용한 한 가지 방법은 먼저 대상에 벡터를 그린 다음 현재 속도 방향과 비교하는 것입니다.

따라서 속도 벡터와 목표 벡터 사이의 부호가있는 각도를 취하고 벡터 크기에 상대적인 추력을 적용하십시오.

따라서 빨간색 속도 벡터와 녹색 목표 벡터 사이 의 각도 a 가 음수이면 양의 추력을 적용하고, 그렇지 않으면 추력을 적용하지 않고 중력으로 분류하십시오.여기에 이미지 설명을 입력하십시오

대상이 다르게 나타날 수있는 4 개의 사분면을 처리해야합니다 (대상이 왼쪽 상단 모서리에있는 것처럼 양의 각도로 추력을 적용해야 함).

또한 목표 속도와의 편차에 대한 추력 량을 적용하십시오.

기술적으로 이것은 중력을 고려하지 않고 현재 상태를 보상하며 AI 헬리콥터가 대상으로 직선으로 비행하지는 않지만 조금 흔들릴 수 있음을 의미합니다. 게임에서 작동하거나 작동하지 않을 수 있습니다.


1
감사. 이것에 대한 몇 가지 질문 : 1- "... 벡터 의 크기에 상대적인 추력을 적용하십시오 " . 당신은하셨습니까 "의 크기 각도를 " ? 2- '서명 된 각도'란 양수 또는 음수를 의미합니까? 그렇다면 갈색 선 위에 있으면 각도보다 양수이고 갈색 선 아래에 있으면 음수입니다. 권리? 3- 올바르게 이해하면 의미는 다음과 같습니다. 모든 프레임에서 현재 속도 벡터와 현재 벡터 사이의 각도를 목표에 가져옵니다. 그런 다음 dx와 dy에서 더하거나 빼십시오. 이 올바른지?
user3150201

@ user3150201 앵글 질문에 예. 예 / 부호없는 질문에서 atan2는 두 벡터 사이의 부호있는 각도를 제공 할 수 있습니다. 내 요점을 이해 한 것 같습니다. 확실하지 않은 경우 사과드립니다.
bornander

1

각 X 프레임의 움직임을 간단히 다시 계산할 수 있습니다. 사이에 너무 많은 프레임을 넣지 않아도 충분하므로 성능에 영향을 미치지 않는다고 가정하면 헬리콥터의 중력은 궤도 변화를 실제로 볼 수있을만큼 강하지 않아야합니다. 또한 플레이어는 같은 방식으로 움직일 수 있으며 이동하면서 계획을 세우지 않고도 중력에 적응할 수 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.