2011-09-08 5 views
3

Obj1과 Obj2를 호출 할 수있는 두 항목이 있습니다 ... 둘 다 현재 위치 pos1과 pos2를가집니다. 또한 현재 속도 벡터 speed1과 speed2가 있습니다 ... 거리가 가까워지면 어떻게 확인할 수 있습니까? (현재 및 다음 거리 확인), 그들은 서로로부터 멀리 이동할 것입니까?2 xna 스프라이트를 서로 동적으로 이동하는 방법은 무엇입니까?

2 개의 벡터 사이의 부호가있는 각도를 제공하는 부호 첨부 각도 함수가 있습니다.이 함수를 사용하여 서로 다른 스프라이트를 이동하기 위해 속도 1과 속도 2를 얼마나 회전시켜야합니까?

public float signedAngle(Vector2 v1, Vector2 v2) 
    { 
     float perpDot = v1.X * v2.Y - v1.Y * v2.X; 

     return (float)Math.Atan2(perpDot, Vector2.Dot(v1, v2)); 
    } 

나는 그런 다음 및 현재 거리를 확인하십시오

float currentDistance = Vector2.Distance(s1.position, s2.position); 

Vector2 obj2_nextpos = s2.position + s2.speed + s2.drag; 
Vector2 obj1_nextpos = s1.position + s1.speed + s1.drag; 

Vector2 s2us = s2.speed; 
s2us.Normalize(); 
Vector2 s1us = s1.speed; 
s1us.Normalize(); 

float nextDistance = Vector2.Distance(obj1_nextpos , obj2_nextpos); 

그런 다음 따라

그들은 점점 여부 크거나 나도 같은 방향에서 자신의 현재 속도를 증가시켜 (그들을 멀리 이동할 작은 또는 내가 더 이상 실패 함) ...

if (nextDistance < currentDistance) 
{  
float angle = MathHelper.ToRadians(180)- signedAngle(s1us, s2us); 
s1.speed += Vector2.Transform(s1us, Matrix.CreateRotationZ(angle)) * esc; 
s2.speed += Vector2.Transform(s2us, Matrix.CreateRotationZ(angle)) * esc; 
} 

아이디어가 있으십니까?

답변

1

오브젝트 A와 B가 가까워지면 오브젝트 구성 요소 (X 또는 Y) 중 하나가 반대입니다. Bx로는 도끼에 반대이 경우

, 그래서 오직 객체 B의 속도 벡터에 도끼를 추가해야하고, Bx로 귀하의 의견에 대한

enter image description here

+0

귀하의 의견을 주셔서 대단히 감사합니다 ..이 공식화해야하고 내 결과를 여기에 회신 해 드리겠습니다 .. 감사 Blau! – JML

1

정확하게 이해했다면, 이것은 상황이며 두 개의 녹색 벡터를 얻고 싶습니다.

situation

빨간 벡터 쉽게 얻을 : redVect = pos1 - pos2. redVect와 greenVect2는 같은 방향을 가리킬 것이므로, 그 길이가 speed2의 것과 같습니다 : finalGreenVect2 = greenvect2.Normalize() * speed2.Length (실제로이 수식에 대해서는 확실하지 않지만) 크기를 조정하는 것이 유일한 단계입니다. greenVect1 = -redVect이므로 finalGreenVect1 = greenVect1.Normalize() * speed1.Length입니다. 그런 다음 speed1 = finalGreenVect1speed2 = finalGreenVect2. 의 o.5f는 회전 속도

angle = signedAngle(speed) + (signedAngle(greenVect) - signedAngle(speed)) * 0.5f; 

당신이 필요로하는 어떤 값으로 조정 :이 방법을 사용하면 매끄러운 회전을 선호하는 경우가 속도 벡터를 회전 할 당신에게 인스턴트 회전을 줄 것이다. 회전 행렬을 만들고이 행렬을 갖는 속도 벡터 Transform()을 생성해야합니다.
호프가 도움이되기를 바랍니다.)

+0

덕분에 너무 많은 개체의 속도 벡터에. . 이것을 공식화해야하고 내 결과를 여기에 회신 해 주겠다 .. 감사합니다! – JML

관련 문제