создать вектор из величины и угла - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь протестировать некоторый код для создания Vector2 из его угла и расстояния от позиции игрока. Я посмотрел в Интернете, как это сделать, и нашел функцию Vector2.Angle, чтобы получить угол между двумя векторами, и функцию Vector2.Distance, чтобы найти расстояние между двумя векторами, и я подумал, что смогу воссоздать original (check_points [i]) Вектор, использующий эти значения, но когда я запускаю этот код, это то, что я получаю (белые линии - от позиции до check_points [i], а красные линии - от позиции до другого, то есть вектора Я пытаюсь создать из значений):

enter image description here

Я бы ожидал, что красные и белые линии будут одинаковыми, как я могу сделать их таким образом?

float angle = Vector2.Angle(position, check_points[i]) * Mathf.Deg2Rad;
float dist = Vector2.Distance(position, check_points[i]);
Vector2 other = new Vector2(Mathf.Cos(angle) * dist, Mathf.Sin(angle) * dist);

Debug.DrawLine(position, check_points[i], Color.white);
Debug.DrawLine(position, other, Color.red);

Смысл этого состоит в том, чтобы отслеживать углы препятствий, чтобы я мог генерировать меня sh из треугольников, сделанных между углами и игроком, для проверки линии обзора , Ранее я заставлял его работать, просто отбрасывая луч для каждой степени поворота (0-360), но я прочитал этот учебник и пытаюсь реализовать отслеживание углов, чтобы он выглядел более плавно: https://ncase.me/sight-and-light/

1 Ответ

0 голосов
/ 24 марта 2020

Таким образом, проблема в том, что ваши position и check_point[i] являются обеими позициями .. вы на самом деле здесь не берете указания.

Как отмечалось в комментариях, например, позиция 0,0,0 не будет работать вообще, так как этот вектор не имеет направления, поэтому любой угол между этой и другой позицией должен быть неопределенным.

То, что вы хотите сделать, это взять направления, такие как Vector2.right и check_points[i] - position.

Следующая проблема заключалась в том, что Vector2.Angle всегда положителен, поэтому вы хотите использовать SignedAngle здесь!

float angle = Vector2.SignedAngle(Vector2.right, check_points[i] - position)  * Mathf.Deg2Rad;
float dist = Vector2.Distance(position, check_points[i]);

Затем отметим, что вектор позиции имеет еще один компонент, а не только угол и расстояние ( который один только направление): A StartPoint . Вы хотите использовать этот вектор и начать с вашей позиции (которая теперь также может быть 0,0,0), например

Vector2 other = position + new Vector2(Mathf.Cos(angle) * dist, Mathf.Sin(angle) * dist);

Debug.DrawLine(position, check_points[i], Color.white);
Debug.DrawLine(position, other, Color.red);

Как вы можете видеть, белые линии точно покрыты красными, поэтому вы см. только красные линии, пересчитанные с угла и расстояния

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...