Тест FOV обнаруживает игрока перед и позади
У меня странная проблема. Я реализовал поле зрения для своих врагов, так что, когда игрок путешествует внутри обнаруживаемой области (120-градусный конус впереди), его преследует плохой парень, пока он не выйдет за пределы поля зрения.
Проблема в том, что из-за врагов в ответ выходит конус 120 FOV, поэтому есть два конуса, один спереди, один сзади, я хочу использовать только один спереди. Единственное, о чем я могу думать, это то, что я переполнен пройденным ПИ? Я действительно не уверен.
Я использовал этот учебник для реализации этого с использованием векторной математики. Точечный продукт раздел. 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;
это утверждение, которое делает противника лицом к игроку после обнаружения
EnemyAnimation.Angle = (float)Math.PI / -2 + (float)Math.Atan2(Position.Y - player.Position.Y, Position.X - player.Position.X);
Мне интересно, почему мне нужно добавить -PI/2 для его работы, я думаю, что это может быть связано с проблемой. Любая помощь очень ценится!
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 позаботится о знаке правильного угла... хотя вы будете проверять новые рассчитанные углы, чтобы выбрать подходящий диапазон...