2010-12-07 4 views
1

Ive는 소형 tank-shooter-minigame을 만들었으며 현재 다른 탱크의 CPU 제어를 담당하고 있습니다.목표를 향해 가장 짧은 방법은?

  • 자체 외장
  • 자신의 위치를 ​​향하는 방향으로는 (X와 Y)
  • 그 목표 위치 (X 및 Y)
:

는 CPU 탱크는 다음을 알

필자는 y가 양수 y가 위쪽이 아닌 아래쪽이되도록 만들었습니다. 양의 x 방향은 왼쪽에서 오른쪽입니다.

어떻게하면 CPU 탱크가 표적을 가리 키도록 회전해야하는 가장 짧은 방법을 계산합니까?

탱크가 (3,3), 90도 (왼쪽에서 왼쪽), Im이 (4,7)을 향하게합니다. 계산은 무엇입니까?

답변

1

쉬운 방법이없는 것은 확실하지 않지만 2 차원 삼각 솔루션이 더 적합하더라도 3 차원 벡터 수학으로 자주 되돌아가는 경향이 있습니다. 귀하의 질문에 2d에서 일하고 있음을 의미하지만 3d 수학은 여전히 ​​효과가 있습니다. 바라건대, 누군가 당신을위한 더 쉬운 알고리즘을 생각해 낼 것입니다. 그러나 그렇지 않다면 여기에 뭔가가 있습니다.

각도 측정에서 가장 짧은 길이라고 가정합니다. 이 코드에서 최단 경로가 CCW이면 결과는 양수 값이되고 CW이면 음의 각도 값이됩니다.

Vector2 targetPosition = new Vector2(3, 3); 
Vector2 myPosition = new Vector2(4, 7); 
Vector2 myFacingDirection2D = new Vector2(-1, 0);//facing straight left 
Vector3 directionToTarget3D = Vector3.Normalize(new Vector3(targetPosition - myPosition, 0)); 
Vector3 myFacingDirection3D = Vector3.Normalize(new Vector3(myFacingDir2D, 0); 
Vector3 crossResult = Vector3.Cross(myFacingDirection3D, directionToTarget3d); 
float dotFactor = Vector3.Dot(myFacingDirection3D, directionToTarget3D) < 0 ? MathHelper.Pi : 0f; 

float angleToTarget = (dotFactor - (float)Math.Sin(crossResult.Length())) * Math.Sign(crossResult.Z); 

역순으로 표시되는 경우 (양수/음수) 교차 기능에서 매개 변수의 순서를 반대로하십시오.

관련 문제