Вот мои рабочие предположения:
- Система координат (x, y, z) такова, что положительное значение x направо, положительное значение y направлено вниз, а z - оставшееся направление. В частности, y = 0 является земной плоскостью.
- Объект в точке (0,0,0), обращенный в настоящее время к (0,0,1), поворачивается лицом к (x, y, z).
- Для этого будет вращение вокруг оси x, за которым следует вращение вокруг оси y. Наконец, вокруг оси z есть поворот, чтобы все было в вертикальном положении.
(Терминология «рыскание», «тангаж» и «крен» может вводить в заблуждение, поэтому я хотел бы избегать его использования, но, грубо говоря, соответствие «x = pitch, y = yaw, z = roll».)
Вот моя попытка решить вашу проблему с этой настройкой:
rotx = Math.atan2( y, z )
roty = Math.atan2( x * Math.cos(rotx), z )
rotz = Math.atan2( Math.cos(rotx), Math.sin(rotx) * Math.sin(roty) )
Надеюсь, это правильно, вплоть до знаков. Я думаю, что самый простой способ исправить знаки - это методом проб и ошибок. Действительно, вы, кажется, правильно поняли знаки rotx
и roty
- включая небольшую проблему с z - поэтому вам нужно только исправить знак на rotz
.
Я ожидаю, что это будет нетривиально (возможно, в зависимости от того, в каком октанте вы находитесь), но, пожалуйста, попробуйте несколько вариантов, прежде чем сказать, что это неправильно. Удачи!
Вот код, который наконец-то сработал для меня.
Я заметил эффект «переворота», который произошел, когда объект переместился из любого переднего квадранта (положительный Z) в любой задний квадрант. В передних квадрантах передний объекта всегда будет направлен к точке. В задних квадрантах назад объекта всегда обращен к точке.
Этот код исправляет эффект отражения, поэтому передняя часть объекта всегда обращена к точке. Я столкнулся с этим методом проб и ошибок, поэтому я действительно не знаю, что происходит!
rotx = Math.atan2( y, z );
if (z >= 0) {
roty = -Math.atan2( x * Math.cos(rotx), z );
}else{
roty = Math.atan2( x * Math.cos(rotx), -z );
}