귀환 미사일이 목표물을 공전하는 것을 어떻게 방지 할 수 있습니까?


78

마찰이없는 2D 우주 게임을 개발 중이며, 원점 미사일 궤도를 목표물로 만드는 것이 매우 쉽다는 것을 알게되었습니다. 반 궤도 전략에 대해 궁금합니다.

간단한 예로는 목표를 향해 직접 가속하는 원점 미사일이 있습니다. 만약 그 목표물이 미사일의 궤도에 수직으로 이동하고 정지한다면, 목표물을 향한 미사일의 가속도는 그 자체의 속도를 극복하기에 충분하지 않으며, 미사일은 도시 된 바와 같이 목표 주위의 궤도로 구동 될 수 있습니다 :

궤도 문제

  • 프레임 1에서 미사일은 문제없이 목표를 향해 직진하고 있습니다.
  • 프레임 2에서 대상은 시연 한대로 새 위치로 이동했습니다. 미사일은 목표 속도 (빨간색)를 향해 계속 가속하면서 기존 속도로 인해 목표물이 검은 색으로 계속 움직입니다.
  • 프레임 3에서 미사일의 속도는 목표 측면을 향해 미사일을 계속 운반하는 반면 (흑색) 가속도 벡터는 목표를 향해 미사일을 필사적으로 당기려고합니다.
  • 프레임 4 이상에서 미사일은 대상 주위의 잠재적으로 안정적인 궤도로 떨어지며 목표에 결코 도달하지 않습니다. 검은 색 화살표는 속도 벡터를 나타내고 빨간색 선은 같은 순간의 가속도 벡터를 나타냅니다.

우주에 마찰이 없다는 것을 고려하면 미사일의 속도를 늦추고 궤도를 붕괴시키는 것은 아무것도 없습니다. 가능한 해결책은 목표를 "뒤에"조준하는 것이며 궤도를 닫을 수는 있지만 프로그래밍 관점에서 어떻게 수행됩니까?

귀환 미사일이 목표물에 어떻게 도달합니까?


9
이것은 실제로 궤도를 만드는 매우 멋진 방법입니다.
데릭

이것은 오일러 통합을 생각 나게합니다. 당신이해야 할 일은 시간 단계를 무한히 작게 만들고 문제를 해결하는 것입니다!
Jeff

게임에서이 효과를 구현하고 싶습니다! : D
Zolomon


6
@Deza 궤도의 정의 입니다. 궤도 물체는 다른 물체의 중심을 향해 구심력으로 가속됩니다.
bobobobo

답변:


49

우선, 미사일의 기준 프레임에 적용 할 가속도에 대한 모든 계산을해야 합니다 (미사일이 정지되어 있고 그 주위로 이동하는 모든 것, 종종 게임 엔진에서 "개체 좌표"또는 "로컬 좌표"라고도 함). 우리의 경우에는 속도가 정확히 0이되기를 원합니다).

아이디어는 목표물을 목표로하는 것이 아니라 목표물이 예상 된 영향을받는 시간을 목표로하는 장소를 목표로하는 것입니다. 따라서 일반적인 알고리즘은 다음과 같습니다.

  1. 미사일이 목표에 도달하는 데 걸리는 시간을 추정하십시오. 목표물이 직접 목표를 향해 비행하는 경우 (미사일이 정지 된 것을 기억하십시오 ), 거리 / 속도 를 계산하는 것만 큼 간단 할 수 있으며 , 다른 경우에는 더 복잡 할 수 있습니다. 목표가 회피하고 회피 할 수 있다면 어쨌든 완벽한 추정치를 할 수 없으므로 매우 정확하지 않아도됩니다.

  2. 목표물의 일정 속도 (1 차 추정) 또는 일정 가속 (2 차 추정)을 가정하여 위의 예상 시간이 어디인지 계산하십시오.

  3. 미사일이 동시에 거의 같은 지점에있게하는 가속도를 계산하십시오.

  4. 미사일의 기준 프레임에서 전체를 기준으로 가속도를 다시 투영하십시오.

여기서 중요한 부분은 거친 야구장에서 시간을 예상하고 미사일의 가속 기능을 잊지 않는 것입니다. 예를 들어, "목표는 우리보다 앞서 있고 우리의 방향으로 날아간다"에 대한 더 나은 추정은 방정식을 푸는 것입니다.

거리 = 속도 x 시간 + 1/2 x 가속 x 시간 2

...에 대한 시간 (직선 비행 물체에 대한 부정적인 속도 사용 거리 미사일에서)를 솔루션으로 당신은 표준 사용을 찾고 차 공식 인을 ...

시간 = (√ ( 속도 2 + 2 x 가속 x 거리 )- 속도 ) / 가속

예를 들어 드래그와 같은 추가 매개 변수를 추가하면 대수 솔루션이없는 미분 방정식으로 빠르게 전환됩니다. 이것은 로켓 과학 그렇게 열심히 이유입니다.


나는 이것이 내가 꼭 필요한 것이라고 생각합니다. 나는 지금까지 지역 좌표로 생각하지 않았습니다.
존 맥도날드

5
좋은 대답입니다. 참고로, 많은 추적 미사일은 다음과 같은 조건에서 자동으로 폭발하도록 설계되었습니다. 1) 트랙의 특정 거리 내에 도달하고 2) 트랙까지의 거리가 증가하고 있습니다. 적은 비용으로 약간의 좋은 동작을 추가 할 수 있습니다.
Patrick Hughes

1
이것은 좋은 대답입니다. 나는 무기에 일정한 가속을 사용하여 끝났고 (가장 현실적이라고 생각했다), 도착하는데 걸리는 시간을 추정했다 (d = v t + 1/2 * a t * t를 재정렬 하고 t를 풀었다). 비밀 소스는 목표물에 현재 속도와 영향을받는 예상 시간이 주어질 곳을 예상하기 위해 예상 시간을 피드백하는 데있었습니다. 잘 작동합니다.
bobobobo

1
나는이 유형 추측 추측 항법 (dead-reckoning)의 알고리즘
bobobobo

42

@Martin Sojka는 이미 무엇을해야하는지 말해주었습니다. 그의 반응을 향상시키는 대신, 나는 당신에게 또 다른 간단한 방법을 제안하고 싶습니다 : DELOCK

내가 차량의 예상 궤도 에서 말했듯이 ? 조향 능력이 제한된 물체는 직접 조향을 통해 도달 할 수없는 두 영역 (높은 치수의 원환 및 원뿔)을 생성합니다.

목표물이 그러한 조향 그림자 중 하나에 들어가는 것을 볼 때 목표물 원점을 멈추고 제한된 시간 동안 다른 방향을 유지할 수 있습니다.

잠금 해제 트리거는 토리를 (더블) 원뿔로 근접시켜 쉽게 계산할 수 있습니다.

잠금 해제 트리거

(정규화 된) 방향 벡터와 목표 변위 벡터 사이의 스칼라 곱을 간단히 계산해야합니다 ( Target - Object / | Target - Object |).

스칼라 곱이 0이되면 목표 방향이 방향에 수직이되어 원형 궤도 **가됩니다. 대상이 청록색 영역으로 떨어지면 조향 방향을 뒤집어 도달 할 수없는 영역 밖에 놓고 다시 집어 넣을 수 있습니다.

* 솔직히 말하면 이것은 원뿔이 아닙니다 ... 교차점을 통과하고 이등분선에 수직 인 축을 중심으로 두 개의 비 평행선의 (반) 회전에 의해 생성 된 다른 종류의 룰드 표면입니다. 2D 평면에서의 투영은 이중 원뿔과 동일하지만 회전 축은 원뿔을 생성하는 것과 수직입니다.

** 그 궤도는 원형이거나 타원형이거나 닫히지 않을 것입니다. 궤적은 2D의 경로 (hypotrochoid) 나 3 차원 이상의 다른 몬스터와 같은 폐 활판을 따라갈 가능성이 있습니다. 어쨌든 그러한 커브의 중심에 도달 할 수 없으며 "원형"궤적 인 원처럼 보입니다.


+1 미사일의 가속도 벡터가 이동 방향에 수직으로 제한되는 경우 좋은 생각입니다. 나는 이것이 이것이이 질문의 경우라고 생각하지 않습니다.
Martin Sojka

@Martin Sojka 가속 벡터는 방사형과 방향에 접하는 두 가지 구성 요소로 나눌 수 있습니다. 첫 번째는 얼마나 많이 돌릴 수 있는지, 두 번째는 얼마나 많이 가속 / 감속 할 수 있는지 알려줍니다.
FxIII

1
그렇습니다. 상대 강도를 서로 독립적으로 자유롭게 선택할 수있는 경우 (즉, 가속도 벡터의 방향과 강도가 이동 벡터와 무관 한 경우) "제외 원"이 사라집니다.
Martin Sojka

@Martin Sojka 가속 강도에 대한 제약이 없습니까?
FxIII

1
+1 정말 멋지다. 나는 전에 그런 생각을 한 적이 없습니다. 아마 @ 도착하게의 대답과 함께 이것을 사용하려고합니다
존 맥도날드에게

8

안내 시스템은 목표를 향해 직접 가속하면 결국 물체가 충돌하는 것으로 가정합니다. 그 가정이 거짓이기 때문에, 그 가정에 근거한지도 AI도 마찬가지로 실패합니다.

따라서 목표를 향해 직접 가속하지 마십시오 . 대상의 위치가 미사일의 운동 방향에 어느 정도 수직인지 감지하는 논리를 추가하십시오. 그렇다면 미사일은 목표를 향해 가속해야 할뿐만 아니라 전진 속도를 늦추어 야합니다. 따라서 목표 방향으로 직접 이동하지 않고 가속 방향을 바이어스하여 동작 방향의 현재 속도가 느려집니다.

또한 너무 느리지 않도록 트리거가 필요합니다. 따라서 임계 값 속도를 추가하여 임계 값 미만인 경우 바이어스를 중지합니다.

마지막으로, 안내 시스템이 완벽하지는 않습니다. 미사일이 현실에서 목표물을 가로 챌 수있는 이유는 목표물이 미사일 자체보다 훨씬 느리게 이동하고 목표물이 특히 민첩하지 않기 때문입니다 (상대적으로 말하면). 당신의 미사일이 쫓는 목표보다 몇 배 빠르지 않으면, 그들은 많이 그리워합니다.


2
"목표는 특히 민첩하지 않다".. 그렇지 않습니까?
bobobobo

5

게임 (및 실제)에서이를 위해 사용하는 가장 단순하고 진보 된 방법은 비례 탐색입니다.

CBDR (Constant Bearing Decreasing Range) 로직에서 두 물체 (미사일과 목표물)가 서로 가시선을 변경하지 않고 동일한 방향으로 이동 하면 충돌합니다.

시선 또는 시선 (LOS)은 미사일과 목표 사이의 가상 선으로, 미사일 위치와 목표 위치 사이의 벡터입니다. 이 LOS의 각도 변화율은 LOS 회전율입니다.

LOS 회전 속도가 0이되면 가시선이 더 이상 변경되지 않습니다. 두 개체가 이제 충돌 과정에 있습니다. 축구 / 축구를하는 동안 누군가를 쫓는 것으로 생각하십시오. 그의 시신이 당신의 시야에서 "얼어 붙은"모습으로 그를 이끌게되면 (당신과 그 사이의 시선은 더 이상 변하지 않습니다), 당신의 몸이 얼어 붙는 것을 유지하기 위해 달리기 가속을 유지하는 한 그와 충돌 할 것입니다 당신의 견해.

PN (Proportional Navigation)에서 미사일은 LOS 회전 속도보다 "N"배 빠릅니다. 이렇게하면 LOS 회전 속도가 0이 될 때까지 미사일이 목표를 이끈다. 즉, 미사일과 목표는 더 이상 시선이 변하지 않는 상태에서 얼어 붙은 것처럼 보인다. 변수 "N"은 탐색 상수 (상수 승수)로 알려져 있습니다.

미사일의지도 명령은 다음과 같이 주어져야합니다 :

가속도 = 결산 속도 * N * LOS 비율

LOS 속도는 LOS 벡터 (목표 위치-미사일 위치)를 측정하고 변수를 저장하여 쉽게 도출 할 수 있습니다. 새 프레임 (LOS1)의 LOS 벡터를 기존 프레임 (LOS0)의 LOS 벡터에서 빼서 LOS 델타를 생성합니다. 이제 기본 LOS 회전 속도를 갖습니다.

Closing Velocity를 단순화하기 위해 현재 LOS 벡터를 대신 사용할 수 있습니다.

가속도 = (target_pos-missile_pos) * LOS_delta * N

N은 내비게이션 상수입니다. 실제 세계에서는 일반적으로 3에서 5 사이로 설정되지만 게임에서 실제 실행 가능한 수치는 LOS 속도 / 델타를 도출하는 샘플링 속도에 따라 약간 다릅니다. 임의의 숫자 (3부터 시작)를 시도하고 게임에서 원하는 선행 효과가 나타날 때까지 최대 1500, 2000 등으로 늘리십시오. 항법 상수가 높을수록 미사일은 비행 초기에 LOS 속도 변화에 더 빨리 반응합니다. 귀환 로켓 시뮬레이션 모델이 다소 현실적인 경우 과도한 항법 상수는 미사일의 공기 역학적 기능에 과부하를 줄 수 있으므로 시행 착오에 따라 균형 잡힌 숫자를 사용해야합니다.


4

Martin과 Nicol의 다른 답변에 따르면 미사일을 목표물로 직접 유도하는 것이 아니라 나중에 목표물과 충돌하게 만드는 방법을 원할 것입니다. 그러나 Martin이 기술 한 방법은 복잡하고 Nicol이 기술 한 방법은 비효율적입니다.

미사일을 유도하는 가장 간단한 방법이지만 여전히 효율적인 방법은 미사일과 대상 간의 각도 변화에 따라 각도를 조정하는 것입니다. 모든 틱에서 미사일에서 대상까지의 각도를 계산하고 이전 틱의 각도와 비교합니다. 차이점은 미사일 각도에서 만들고자하는 정확한 차이입니다. 따라서 각도가 한 눈금에서 0.77이고 다음 눈금에서 0.75 인 경우 미사일 각도를 -0.02로 조정하려고합니다. 이 방법은 간단하며, 목표물이 미사일의 "앞에"있는 한, 선택된 경로 측면에서 매우 효율적입니다. 또한 2D뿐만 아니라 여러 치수에도 적용됩니다.

그러나 명심하십시오.

  • 이 방법은 미사일과 목표물이 정확히 같은 속도이고 평행하게 움직일 경우 중단됩니다. 글쎄, 이론적으로 미사일에 대한 충돌 과정을 꾸미고, 무한 시간이 걸립니다 :) 실제로 미사일은 항상 목표보다 빠르지 만 속도가 같으면 코너 케이스를 추가하여 평행인지 여부를 식별해야합니다 .

  • 목표와 미사일이 정확히 같은 선에서 반대 방향으로 비행하는 경우 방법이 중단됩니다. 현실에서는 실제로 일어날 수는 없지만 개별 게임에서는 그렇게 드물지 않습니다. 이를 테스트하려면 위 알고리즘에 코너 케이스 체크를 추가해야합니다.

  • 만약 당신의 미사일이 회전 능력이 제한되어 있다면, 그보다 더 많은 회전이 필요할 때마다 최대 회전을하십시오. 미사일이 충분하면 여전히 작동합니다. 너무 가까이 있으면 마지막 글 머리표를 참조하십시오.

  • 충돌을 확인할 때 관대해야합니다. 실제 세계에서는 많은 미사일이 탄두를 사용하여 "킬존"을 생성하므로 실제로는 충돌하지 않고 목표물에 가까이 접근하면됩니다.

  • 마지막으로, 미사일 이 여전히 그리워 질 수 있으므로 원래 질문으로 되돌아갑니다. 좋은 방법은 실제로 몇 번의 틱에 대한 원점 복귀를 비활성화하여 약간의 거리를 확보 한 다음 다시 원점 복귀시키는 것입니다. fxiii에서 데드 존을 식별하기 위해 제안한 방법은 원점 복귀를 꺼야 할 때를 감지하는 좋은 방법이라고 생각합니다.


1

과거에 내가 해왔 던 게임에 대해 '충분한'것으로 밝혀진 몇 가지 간단한 옵션이 있습니다.

1) 당신이보고있는 장면의 해상도가 그것을 허용한다면, 물체가 목표 근처에있을 때 폭발 할 수 있습니다. 선회 범위가 물체 크기의 약 2 배인 경우, 나쁘게 보일 수 있으므로 작동하지 않을 수 있습니다.

솔루션의 최종 목표가 단순히 미사일이 목표물에 도달하도록하는 것이라면 목표물에 명중시키는 것입니다. 다시 말하지만 이것은 솔루션의 모양에 달려 있습니다.

2) 미사일이 목표와 직각을 이루는 것을 발견하면 이것이 자물쇠가 깨지는 지점이 될 수 있으며, 미사일이 목표가 다시 미사일 앞에 닿지 않는 한 미사일은 똑바로 움직입니다.

가능한 한 항상 간단한 솔루션을 선호합니다. 귀환 미사일이 사용되는 무기 중 하나 인 게임을 만드는 경우 플레이어가 살 보를 발사하고 가능한 한 빨리 끊임없는 교전 무기로 교체 할 수 있기 때문에 이러한 무기를 피할 수 있습니다. 그러나 만약 당신이 미사일 시뮬레이션을하고 있다면 분명히 다른 해답 중 하나가 더 나은 선택입니다.

도움이 되었기를 바랍니다.


0

이미 언급했듯이 목표물이있는 곳이 아니라 목표물이 도착할 때 목표물이있는 위치에 미사일을 조준해야합니다. 이렇게하면 대부분의 미사일 이 궤도로 진입하는 것을 막을 수 있지만 목표물이 제대로 회피되면 여전히 궤도가 가능합니다. 항공기 조종사가 들어오는 미사일을 피하기 위해 사용하는 합법적 인 전술입니다. 미사일은 회전 반경이 더 크고 오른쪽 순간에 급격한 충돌이 발생하기 때문에 훨씬 빠르게 진행되기 때문입니다. (근접 폭발로 인해 위험에 처할 수는 있지만)

FxIII의 포스트가 이야기하는 영역 중 하나를 대상으로 회피하면 궤도를 추적 할 수 있고 여전히 추격 할 수있는 미사일을 다루고 있기 때문에.

그러나 나는 그 문제에 대한 그의 해결책에 동의하지 않는다. 대신, 나는 미사일을 다음과 같이 프로그래밍합니다.

만약 미사일이 90도에서 360 도의 움직임 라인에 밀려들었다면 당신은 궤도에있는 것입니다. 운동 라인에서 추력을 120 도로 조정합니다. 미사일의 궤도는 심하게 회전하지 않고 넓어 지지만 미사일도 느려져서 더 잘 조종 할 수 있습니다. 목표 범위가 데드 존 직경의 1.25 배로 열리면 (이 직경은 단순하고 미사일의 속도에만 기반하고 런타임에 복잡한 계산이 필요하지 않음) 미사일은 정상적인 추적 동작으로 돌아갑니다.

또는 멍청한 추적자 헤드를 사용하십시오.


0

나는 이것이 오래된 질문이라는 것을 알고 있지만, 지금까지 주어진 답변에서 놓친 것이 있다고 생각합니다. 원래 질문에서, 미사일 (또는 무엇이든)은 목표의 위치를 ​​향해 가속하라는 지시를 받았다. 몇 가지 대답은 이것이 잘못되었다고 지적했으며 나중에 목표가있을 것으로 예상되는 방향으로 가속해야합니다. 이것은 더 좋지만 여전히 잘못되었습니다.

실제로하고 싶은 것은 목표를 향해 가속 하는 것이 아니라 목표를 향해 움직이는 것입니다. 이것에 대해 생각하는 방법은 목표 (또는 목표 위치의 투영)를 향한 원하는 속도를 설정 한 다음 어떤 가속을 적용 할 수 있는지 (즉, 미사일이 가속 할 수없는 제한을 가짐) 원하는 속도를 달성하려면 (속도가 벡터임을 기억하십시오).

다음은 오늘 아침에 구현 한 예제입니다. 제 경우에는 플레이어가 상대를 쫓아 가려고하는 스포츠 시뮬레이션 게임의 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으로 설정하면 타임 스텝 이후 플레이어 목표 거리의 최소값을 가속 각도의 함수로 찾게됩니다. 흥미롭게도 가속 속도는 원래 방정식에 있었지만 실제로 가속 할 수있는 양에 관계없이 최적의 방향을 만드는 것을 취소합니다.


일부 시나리오에서는 속도를 직접 설정하는 것이 좋습니다.하지만 대부분 힘에 의존하는 물리 시스템과 통합하기가 어려울 수 있습니다. "도징"이 주목할만한 게임 메카니즘이 아닌 미사일이 정기적으로 발사되는 게임 인 경우, 물리가 방해받지 않는 작은 위험을 피하고 플레이어가 예상 한대로이 메카닉이 작동하도록 할 수 있습니다 매번. 이것은 우주 액션 게임보다 RTS에서 더 의미가 있습니다.
Katana314

0

일정한 회전 속도를 사용하고 있습니다. 그것이 바로 완벽한 원형 궤도를 일으키는 원인입니다.

안내 시스템에 대한보다 현실적인 접근 방식은 목표 거리를 반대로하여 거리를 줄이면됩니다 (거리가 적을수록 회전 속도가 더 큼). 이것은 궤도보다는 나선을 제공하고 느린 대상과의 충돌을 보장합니다.

또한 훨씬 현실적인 비행 경로를 제공합니다. 일정한 회전 속도는 자연스럽게 완벽합니다. 난류를 시뮬레이션하기 위해 회전율에 임의의 변형을 추가 할 수도 있습니다. 다시 한 번 더 현실적이고 정상 상태 궤도 시나리오를 피할 수 있습니다.

부분 방정식이 필요하지 않습니다.

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