[Решено] Как получить правильный угол?
|
|
urbemAngeli | Дата: Суббота, 12 Мая 2018, 13:42 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Всем привет! Не могу разобраться с углами объекта. На картинке показан игрок, который может вращаться по часовой или против часовой стрелки. Углы которые подписаны (на первом скрине), я получил при помощи transPlayer.localEulerAngles.x. Мне нужно получить углы как показаны на втором скрине. Как я только не пробовал рассчитывать эти углы, однако если угол поворота игрока был ниже горизонтальной оси, рассчитанный угол становился неправильным. Может есть у кого какие идеи, как получить результат согласно второму скрину? Скрин 1:
Скрин 2:
Вот решение, может кому-то пригодится:
public float Get360Angle(Vector3 a, Vector3 b) { float angle = Vector3.Angle(a, b); return Vector3.Cross(a, b).z <= 0.0f ? angle : 360.0f - angle; }
Сообщение отредактировал urbemAngeli - Воскресенье, 13 Мая 2018, 13:32 |
|
| |
drcrack | Дата: Суббота, 12 Мая 2018, 16:54 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Как-то так
Код float AddAngle(float original, float angle){ var r = original + angle; if(r < 0) r = 360 + r; if(r > 360) r -= 360; return r; }
var playerAngle = 0f;
Console.WriteLine(AddAngle(playerAngle, 45)); Console.WriteLine(AddAngle(playerAngle, 135)); Console.WriteLine(AddAngle(playerAngle, 225)); Console.WriteLine(AddAngle(playerAngle, 315));
|
|
| |
Abel399 | Дата: Суббота, 12 Мая 2018, 17:02 | Сообщение # 3 |
Surpass your limits. Right now.
Сейчас нет на сайте
| drcrack, для большей точности я бы заменил if на while...
Ninja Slayer - 2D Physics Puzzle [cancelled]
|
|
| |
drcrack | Дата: Суббота, 12 Мая 2018, 18:04 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| я не стал ставить while потому что это усложнило бы понимание кода для новичков
|
|
| |
urbemAngeli | Дата: Суббота, 12 Мая 2018, 18:15 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| drcrack, вы похоже меня не поняли. Попробую по другому объяснить. На первом скрине показан игрок с исходной позицией. При его повороте против часовой стрелки угол должен увеличиваться от 0 к 360, при вращении по час. стрелки уменьшаться. Сейчас же у меня, где выделено синим угол "обнуляется", хотя должен быть 180 град. Так вот, как получить угол поворота игрока вокруг своей оси от 0 к 360 ?, если transPlayer.localEulerAngles.x не тот угол показывает. А ваш метод добавляет к текущему углу еще значение, чего мне не нужно
Сообщение отредактировал urbemAngeli - Суббота, 12 Мая 2018, 18:19 |
|
| |
drcrack | Дата: Суббота, 12 Мая 2018, 18:20 | Сообщение # 6 |
старожил
Сейчас нет на сайте
| Если в момент, когда угол по нужной оси обнуляется после 179.99, в других осях тоже резко меняются углы, то дело в неоднозначности преобразования кватернионов в углы эйлера Проверь это
Сообщение отредактировал drcrack - Суббота, 12 Мая 2018, 18:22 |
|
| |