#javascript #camera #rotation #three.js
#javascript #камера #вращение #three.js
Вопрос:
В Three.js Я пытаюсь реализовать орбитальную камеру, которую можно вращать вокруг осей x и y. Я использую эти две функции:
function rotateX(rot) {
var x = camera.position.x,
y = camera.position.y,
z = camera.position.z;
camera.position.x = x * Math.cos(rot) z * Math.sin(rot);
camera.position.z = z * Math.cos(rot) - x * Math.sin(rot);
camera.lookAt(scene.position);
}
function rotateY(rot) {
var x = camera.position.x,
y = camera.position.y,
z = camera.position.z;
camera.position.z = z * Math.cos(rot) y * Math.sin(rot);
camera.position.y = y * Math.cos(rot) - z * Math.sin(rot);
camera.lookAt(scene.position);
}
Теперь поворот x работает нормально, а поворот y — нет. Как только я перехожу к верхней части модели, так как положение z камеры становится отрицательным, то внезапно метод LookAt поворачивает камеру на величину PI по оси Z, и внезапно левая сторона модели оказывается справа, и наоборот. Теперь я могу исправить это, проверив отрицательный Z, а затем просто зафиксировав поворот камеры, но это приводит к сбою при одновременном использовании поворота x и y, затем x внезапно получает это инвертирующее поведение.
Как мне это исправить?
Ответ №1:
Проблема , с которой вы столкнулись , называется Gimbal lock
. Вам нужно использовать кватернионы, чтобы решить эту проблему. Вы можете прочитать об этом здесь https://gamedev.stackexchange.com/questions/45292/how-is-the-gimbal-locked-problem-solved-using-accumulative-matrix-transformation
Комментарии:
1. Простите мое невежество и возможную глупость, но я не совсем понимаю, как это блокировка кардана, потому что кажется, что я не теряю ось вращения, а скорее камера запутывается. Не могли бы вы, пожалуйста, просто объяснить мне это?