두 점 사이의 곡선 이동


15

곡선 모양의 멋진 움직임으로 물체를 움직일 수있는 좋은 기술은 무엇입니까?

원점 복귀 미사일의 궤도와 같은 끝 위치도 움직일 수 있습니다.

답변:


11

사전 계산 된 궤적이 아니라 프레임 단위 (대상이 움직일 수있는) 것으로 가정하면 실제로는 매우 간단합니다.

모든 프레임에서 미사일의 속도-벡터를 벡터 (위치 목표 -위치 미사일 ) 와 비교하십시오. 즉, 미사일에서 목표를 가리키는 벡터입니다. 모든 프레임이 두 벡터의 방향이 같지 않으면 속도 벡터를 다른 벡터쪽으로 조금 회전 시키므로 모든 프레임이 미사일이 대상을 바라 보는 데 조금 더 가까워집니다.

두 벡터 사이의 교차 곱의 부호를 보면 시계 방향 또는 반 시계 방향으로 회전할지 여부를 결정할 수 있습니다.


[편집] 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)당신이 매 프레임마다 호출 할 필요가 없습니다 캐시 할 수 있습니다.


이 모든 것을 처음 접했을 때 의사 코드를 제공 할 수 있습니까? 나는 현재 2 차원에서만 일하고있어 일부 합병증을 제거합니다.
anonymouse

@anonymouse : 확실히, 이것을 시도해라
BlueRaja-Danny Pflughoeft

15

가능한 두 가지 기술이 있습니다.

첫 번째 기술은 프레임 기반 시뮬레이션 을 수행하는 것 입니다. 게임 플레이에서 원점 미사일과 같은 일을한다면 목표를 정확하게 맞출 필요가 없습니다.

이 경우 물체의 위치와 속도를 추적하려고합니다. 각 프레임은 목표 방향과 현재 이동 방향을보고 속도를 적절하게 조정합니다.

속도를 즉시 맞추면 미사일이 항상 목표물에 부딪칩니다. 그러나 각 프레임마다 소량 씩 속도를 조정하면 미사일이 목표를 향해 곡선을 이루며 천천히 곡선을 그리면 대상이 피할 수 있습니다.

두 번째 기술은 파라 메트릭 방법 을 사용하는 것입니다. 타겟을 정확하게 명중하고 싶을 때 애니메이션에 유용합니다. 이 경우 일반적으로 "시간"을 매개 변수로 사용하여 일종의 함수에 넣습니다.

특히 유용한 기능 세트는 고등학교 물리학에서 배운 운동 방정식입니다 . 이를 두 축에 적용하면 탄도 궤적을 얻을 수 있습니다. 약간의 수학으로 대상을 예측할 수있는 초기 매개 변수를 예측할 수 있습니다.

XNA는 또한 여러 보간 및 곡선 모션 기능을 제공합니다. 상기 살펴보세요 에 대한 문서 Vector2 및 위해를MathHelper . 이것들은 당신이 사용하고 심지어 흥미로운 것들을하기 위해 결합 할 수있는 보간 함수를 제공합니다. 예를 들어, 미사일 발사 : Lerp(선형 보간) 미사일의 시작점에서 목표 위치까지, 그리고 초기 목표에서 목표 물체의 실제 (변경) 위치까지 목표 위치를 뛰어 넘습니다. 이렇게하면 멋진 "잠금"효과가 나타납니다.

곡선을 생성하는 기능도 있습니다 (예 : CatmulRom,) Hermite. 움직이는 대상에서 성공적으로 사용하기가 더 어려울 수 있습니다.

애니메이션의 맥락에서 "쉬운 상태"를 살펴보면 가속과 같은 흥미로운 효과를 줄 수있는보다 흥미로운 보간 함수를 얻을 수 있습니다.

이제이 기술이 타겟이 움직일 때 이상한 결과를 가져 온다고 말할 수 있습니다. 그러나 실제로 발사체가 목표보다 빠르게 움직이면 일반적으로 괜찮습니다. 그것이 문제라면 어쨌든 프레임 기반 기술을 사용해야 할 것입니다.


3

사인 파나 베 지어 곡선 을 찾아 볼 수 있습니다 . 사인파 접근 방식이 정상적인 지 모르겠지만 왜 그렇게 나쁜지 알 수 없습니다.


B- 스플라인 과 함께 베 지어 곡선을 사용하면 모든 곡선을 상당히 정확하게 표현할 수 있습니다. 정밀도가 필요한 경우 Cubic Hermit 스플라인 이 약간 더 정확합니다. 명심하십시오. 때로는 부정확성이 유기성을 환영합니다.
doppelgreener

베 지어 곡선의 경우 +1 설명 된 용도로는 아마도 가장 쉽고 가장 제어하기 쉬울 것입니다.
ggambett

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