답변:
사전 계산 된 궤적이 아니라 프레임 단위 (대상이 움직일 수있는) 것으로 가정하면 실제로는 매우 간단합니다.
모든 프레임에서 미사일의 속도-벡터를 벡터 (위치 목표 -위치 미사일 ) 와 비교하십시오. 즉, 미사일에서 목표를 가리키는 벡터입니다. 모든 프레임이 두 벡터의 방향이 같지 않으면 속도 벡터를 다른 벡터쪽으로 조금 회전 시키므로 모든 프레임이 미사일이 대상을 바라 보는 데 조금 더 가까워집니다.
두 벡터 사이의 교차 곱의 부호를 보면 시계 방향 또는 반 시계 방향으로 회전할지 여부를 결정할 수 있습니다.
[편집] XNA-ish 코드 (테스트 할 XNA는 없습니다) :
//Once a frame:
//Get vector spanning from missile to target
Vector2 vectorToTarget = target.Position - missile.Position;
//Convert to Vector3 to do cross-product
Vector3 vectorToTarget3 = new Vector3(vectorToTarget, 0);
Vector3 missileVelocity3 = new Vector3(missile.Velocity, 0);
//Rotate clockwise/counter-clockwise is determined by sign of cross-product
int crossProductSign = Vector3.Cross(missileVelocity3, vectorToTarget3).Z;
//Positive cross-product means rotate counter-clockwise, negative is clockwise
double rotationAngle = 0;
if(crossProductSign > 0)
rotationAngle = -0.05;
else if(crossProductSign < 0)
rotationAngle = 0.05;
//I'm not sure how to do rotation in XNA, but the internets tell me it's something like this:
missile.velocity = Vector2.Transform(missile.velocity, Matrix.CreateRotationZ(rotationAngle))
때문에, 그 주 rotationAngle
에만 세 가지 값의 가능한 모든 값이 Matrix.CreateRotationZ(rotationAngle)
당신이 매 프레임마다 호출 할 필요가 없습니다 캐시 할 수 있습니다.
가능한 두 가지 기술이 있습니다.
첫 번째 기술은 프레임 기반 시뮬레이션 을 수행하는 것 입니다. 게임 플레이에서 원점 미사일과 같은 일을한다면 목표를 정확하게 맞출 필요가 없습니다.
이 경우 물체의 위치와 속도를 추적하려고합니다. 각 프레임은 목표 방향과 현재 이동 방향을보고 속도를 적절하게 조정합니다.
속도를 즉시 맞추면 미사일이 항상 목표물에 부딪칩니다. 그러나 각 프레임마다 소량 씩 속도를 조정하면 미사일이 목표를 향해 곡선을 이루며 천천히 곡선을 그리면 대상이 피할 수 있습니다.
두 번째 기술은 파라 메트릭 방법 을 사용하는 것입니다. 타겟을 정확하게 명중하고 싶을 때 애니메이션에 유용합니다. 이 경우 일반적으로 "시간"을 매개 변수로 사용하여 일종의 함수에 넣습니다.
특히 유용한 기능 세트는 고등학교 물리학에서 배운 운동 방정식입니다 . 이를 두 축에 적용하면 탄도 궤적을 얻을 수 있습니다. 약간의 수학으로 대상을 예측할 수있는 초기 매개 변수를 예측할 수 있습니다.
XNA는 또한 여러 보간 및 곡선 모션 기능을 제공합니다. 상기 살펴보세요 에 대한 문서 Vector2
및 위해를MathHelper
. 이것들은 당신이 사용하고 심지어 흥미로운 것들을하기 위해 결합 할 수있는 보간 함수를 제공합니다. 예를 들어, 미사일 발사 : Lerp
(선형 보간) 미사일의 시작점에서 목표 위치까지, 그리고 초기 목표에서 목표 물체의 실제 (변경) 위치까지 목표 위치를 뛰어 넘습니다. 이렇게하면 멋진 "잠금"효과가 나타납니다.
곡선을 생성하는 기능도 있습니다 (예 : CatmulRom
,) Hermite
. 움직이는 대상에서 성공적으로 사용하기가 더 어려울 수 있습니다.
애니메이션의 맥락에서 "쉬운 상태"를 살펴보면 가속과 같은 흥미로운 효과를 줄 수있는보다 흥미로운 보간 함수를 얻을 수 있습니다.
이제이 기술이 타겟이 움직일 때 이상한 결과를 가져 온다고 말할 수 있습니다. 그러나 실제로 발사체가 목표보다 빠르게 움직이면 일반적으로 괜찮습니다. 그것이 문제라면 어쨌든 프레임 기반 기술을 사용해야 할 것입니다.
사인 파나 베 지어 곡선 을 찾아 볼 수 있습니다 . 사인파 접근 방식이 정상적인 지 모르겠지만 왜 그렇게 나쁜지 알 수 없습니다.
Craig Reynolds가 정의한 Steering Behaviors를 살펴볼 수 있습니다. http://red3d.com/cwr/steer/
이것은 AI에서 NPC가 목표를 향해 나아가도록하는 데 종종 사용됩니다.