在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方法在Z轴上以PI量旋转相机,并且突然模型的左侧在右侧,反之亦然。现在我可以通过检查负Z来解决这个问题,然后只修复相机的旋转,但这会在同时使用x ad y旋转时导致故障,然后x会突然出现这种反转行为。
我该如何解决这个问题?
答案 0 :(得分:1)
您遇到的问题称为Gimbal lock
。您需要使用四元数来解决它。你可以在这里阅读https://gamedev.stackexchange.com/questions/45292/how-is-the-gimbal-locked-problem-solved-using-accumulative-matrix-transformation