2012-05-01 1 views
0

A weirrrrd problem 나는 여기에 있습니다. 내 원수를위한 시야를 구현 했으므로 플레이어가 탐지 영역 (120도 전방에있는 원뿔) 안쪽으로 이동할 때 FOV 외부로 나갈 때까지 나쁜 사람에게 쫓기게됩니다.FOV 테스트는 infront AND 뒤에있는 플레이어를 감지합니다.

문제는 두 개의 원뿔을 앞쪽과 뒤쪽에서 볼 수 있기 때문에 앞쪽에있는 원뿔을 사용하고 싶을뿐입니다. 내가 생각할 수있는 건 내가 지나친 PI가 넘쳤다는거야? 나는 정말로 확신하지 못한다.

이 튜토리얼을 벡터 수학을 사용하여 구현하기 위해 사용했습니다. 점 제품 섹션. http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

여기에 FOV 관련 코드가 있습니다.

Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle)); 

     //normalize 
     Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle); 
     Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position); 

     //check angle 
     float CheckAngle = (float)Math.Acos(Vector2.Dot(EnemyFacingN, EnemytoPlayer)); 

if ((CheckAngle >= 60) && (CheckAngle <= 120) 
following = true; 

이 TEH 플레이어를 향해 적의 얼굴을 만드는 문이 한 번 내가이 일을 위해 내가 -PI/2를 추가해야하는 이유 궁금하네요

EnemyAnimation.Angle = (float)Math.PI/-2 + (float)Math.Atan2(Position.Y - player.Position.Y, Position.X - player.Position.X); 

을 감지, 나는이 수 생각 문제와 관련이있다. 어떤 도움이라도 대단히 감사합니다!

답변

1

저는 Math.PI/-2를 추가하면 텍스처를 90º 회전한다고 생각합니다.

당신은 ATAN2를 사용해야합니다

Vector2 EnemyVecAngle = new Vector2((float)Math.Cos(EnemyAnimation.Angle), (float)Math.Sin(EnemyAnimation.Angle)); 

    //normalize 
    Vector2 EnemyFacingN = Vector2.Normalize(EnemyVecAngle); 
    Vector2 EnemytoPlayer = Vector2.Normalize(player.Position - Position); 

    //check angle 
    float CheckAngle = (float) (Math.Atan2(EnemyFacingN.Y, EnemyFacingN.X) 
           - Math.Atan2(EnemytoPlayer.Y, EnemytoPlayer.X)); 

을 충분히해야한다는과 함께 ... Atant2이 ... 를 직각 기호 돌볼 것입니다 당신이 adecuate을 선택하는 새로운 계산 된 각도를 검사합니다하지만 범위 ...