나는 이것이 오래된 질문이라는 것을 알고 있지만, 지금까지 주어진 답변에서 놓친 것이 있다고 생각합니다. 원래 질문에서, 미사일 (또는 무엇이든)은 목표의 위치를 향해 가속하라는 지시를 받았다. 몇 가지 대답은 이것이 잘못되었다고 지적했으며 나중에 목표가있을 것으로 예상되는 방향으로 가속해야합니다. 이것은 더 좋지만 여전히 잘못되었습니다.
실제로하고 싶은 것은 목표를 향해 가속 하는 것이 아니라 목표를 향해 움직이는 것입니다. 이것에 대해 생각하는 방법은 목표 (또는 목표 위치의 투영)를 향한 원하는 속도를 설정 한 다음 어떤 가속을 적용 할 수 있는지 (즉, 미사일이 가속 할 수없는 제한을 가짐) 원하는 속도를 달성하려면 (속도가 벡터임을 기억하십시오).
다음은 오늘 아침에 구현 한 예제입니다. 제 경우에는 플레이어가 상대를 쫓아 가려고하는 스포츠 시뮬레이션 게임의 AI 플레이어입니다. 움직임은 표준 '킥 드리프트'모델에 의해 제어되며, 속도를 업데이트하기 위해 타임 스텝 시작시 가속을 적용한 다음 타임 스텝 기간 동안 해당 속도로 오브젝트가 드리프트합니다.
나는 이것의 파생을 게시 할 것이지만이 사이트에서 지원되는 수학 마크 업이 없다는 것을 알았습니다. 우우! 가속 방향에 대한 제한이 없으며 미사일 유형 객체의 경우가 아니므로 추가 제약이 필요하다는 최적의 솔루션이라는 것을 신뢰해야합니다.
코드는 파이썬으로되어 있지만 모든 언어 배경에서 읽을 수 있어야합니다. 간단히하기 위해 각 시간 단계의 길이가 1이라고 가정하고이를 반영하기 위해 속도와 가속도를 적절한 단위로 표현합니다.
self.x = # current x co-ordinate
self.y = # current y co-ordinate
self.angle = # current angle of motion
self.current_speed = # current magnitude of the velocity
self.acc # Maximum acceleration player can exert on themselves
target_x = # x co-ordinate of target position or projection of it
target_y = # y co-ordinate of target position or projection of it
vx = self.current_speed * math.cos(self.angle) # current velocity x component
vy = self.current_speed * math.sin(self.angle) # current velocity y component
# Find best direction to accelerate
acc_angle = math.atan2(self.x + vx - target_x,self.y + vy - target_y)
atan2 (a, b) 함수는 a / b의 역 탄젠트를 계산하지만 각도가 원의 올바른 사분면에 있도록합니다. a와 b의 부호를 모두 알아야합니다.
제 경우에는 가속을 가하면 속도를 업데이트하기 위해 적용합니다.
vx_new = vx + self.acc * math.cos(acc_angle)
vy_new = vy + self.acc * math.sin(acc_angle)
self.current_speed = math.sqrt( vx_new**2 + vy_new**2)
self.angle = math.atan2(vy_new,vx_new)
또한 플레이어 종속 최대 속도와 비교하여 새로운 속도를 확인하고 그 속도를 제한합니다. 미사일, 자동차 또는 최대 회전 속도 (틱당 각도)를 가진 물체의 경우 계산 된 이상과 비교하여 현재 동작 각도를 간단히 볼 수 있으며이 변화가 허용보다 큰 경우에는 다음과 같이 각도를 변경하십시오. 가능한 이상으로 향합니다.
이것의 도출에 관심이있는 사람이라면, 나는 초기 단계, 속도, 가속도 속도 및 가속 각 측면에서 팀 스텝 후 플레이어와 목표 사이의 거리를 기록한 다음 가속 각도와 관련하여 미분을 취했습니다. 이 값을 0으로 설정하면 타임 스텝 이후 플레이어 목표 거리의 최소값을 가속 각도의 함수로 찾게됩니다. 흥미롭게도 가속 속도는 원래 방정식에 있었지만 실제로 가속 할 수있는 양에 관계없이 최적의 방향을 만드는 것을 취소합니다.