JavaFX Вращающаяся камера вокруг оси
В прошлом году я опубликовал похожий вопрос, но из-за того, что он не очень описательный и в целом беспорядок, я решил полностью переписать его.
Я делаю простой 3D-редактор в JavaFX с движением камеры, похожим на Blender или почти любым другим. Я добавил вращение вокруг оси x, а затем, используя тригонометрические функции, рассчитал два других вращения (ось y и z). Поворот по оси x и y выполняется относительно точки поворота, но поворот z всегда выполняется относительно экрана / камеры, а не относительно точки поворота.
Для лучшего понимания проблемы я набросал, где находится ось и где я хотел бы иметь их:
Вот как применяются углы в данный момент:
Вот как я бы хотел, чтобы они были:
Вот часть кода, которую я использую для вычисления углов (хотя из моих наблюдений это кажется неуместным для моей проблемы):
//variables angleY and angleX are calculated according to mouse drags on the screen
rotateY.setAngle(angleY);
rotateX.setAngle(angleX*Math.cos(Math.toRadians(angleY)));
rotateZ.setAngle(angleX*Math.sin(Math.toRadians(angleY)));
Чтобы облегчить тестирование, я загрузил код на Pastebin.
Изменить: я мог бы добиться того же эффекта, вращая все, кроме камеры (что в любом случае делает движение камеры) и используя ось X для повышения, но я ищу более элегантное решение.
1 ответ
Я решил использовать решение, которое я упомянул выше. Я создал группу для каждого отдельного элемента, но камеру, а затем повернул элементы по оси Y. Для возвышения (ось X) я вращаю камеру. Это оказалось очень хорошим решением для моей проблемы.
Изменить: так как это не совсем ответ на вопрос, который я задал выше, я решил выяснить, что действительно пошло не так. Я поигрался с преобразованиями и обнаружил, что они применяются в том же порядке, в каком вы добавляете их в массив преобразований. Реальная проблема заключалась в том, что я применил повороты в XYZ -порядке, поэтому вращение по оси X было сделано до вращения по оси Y, поэтому оно не было относительно него. Изменение порядка преобразований с XYZ на YXZ устранило все проблемы.