2010-11-09 51 views
4

我正在XNA的基礎上植入2D遊戲。我已經實施了Craig Reynold的植絨技術,現在我想動態地指派一名領導人加入該團隊,以引導他們走向一個目標。2D中的XNA視野

爲此,我想找到一個沒有任何其他代理的遊戲代理,並使其成爲領導者,但我不確定這個數學。

目前我有:

Vector2 separation = agentContext.Entity.Position - otherAgent.Entity.Position; 

float angleToAgent = (float) Math.Atan2(separation.Y, separation.X); 
float angleDifference = Math.Abs(agentContext.Entity.Rotation - angleToAgent); 
bool isVisible = angleDifference >= 0 && angleDifference <= agentContext.ViewAngle; 

agentContext.ViewAngle那就是我曾用起了弧度值,試圖得到正確的效果,但這種效果主要是在所有的代理商被指定爲領導者。

任何人都可以指出我在正確的方向來檢測一個實體是否在另一個實體的視圖「錐」內?

+0

angleDifference> = 0永遠是正確的,因爲angleDifference是ABS功能的結果。 – Empyrean 2010-11-11 03:32:26

回答

1

您需要將輸入標準化爲Atan2函數。在減去角度時也要小心,因爲結果可能超出pi到-pi範圍。我更喜歡使用方向矢量而不是角度,所以您可以使用點積操作來處理這類事情,因爲這樣做往往更快,您不必擔心規範範圍之外的角度。

下面的代碼應該達到的結果你是後:

double CanonizeAngle(double angle) 
    { 
     if (angle > Math.PI) 
     { 
      do 
      { 
       angle -= MathHelper.TwoPi; 
      } 
      while (angle > Math.PI); 
     } 
     else if (angle < -Math.PI) 
     { 
      do 
      { 
       angle += MathHelper.TwoPi; 
      } while (angle < -Math.PI); 
     } 

     return angle; 
    } 

    double VectorToAngle(Vector2 vector) 
    { 
     Vector2 direction = Vector2.Normalize(vector); 
     return Math.Atan2(direction.Y, direction.X); 
    } 

    bool IsPointWithinCone(Vector2 point, Vector2 conePosition, double coneAngle, double coneSize) 
    { 
     double toPoint = VectorToAngle(point - conePosition); 
     double angleDifference = CanonizeAngle(coneAngle - toPoint); 
     double halfConeSize = coneSize * 0.5f; 

     return angleDifference >= -halfConeSize && angleDifference <= halfConeSize; 
    } 
1

我想你想測試+/-角度,而不僅僅是+(即angleDifference >= -ViewAngle/2 && angleDifference <= ViewAngle/2)。或者使用絕對值。