【问题标题】:Three.js camera turning leftside rightThree.js 相机左转右转
【发布时间】:2014-08-14 08:32:47
【问题描述】:

在 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 和 y 旋转时导致故障,然后 x 突然出现这种反转行为。

我应该如何解决这个问题?

【问题讨论】:

    标签: javascript camera rotation three.js


    【解决方案1】:

    您遇到的问题称为Gimbal lock。您需要使用四元数来解决它。你可以在这里阅读https://gamedev.stackexchange.com/questions/45292/how-is-the-gimbal-locked-problem-solved-using-accumulative-matrix-transformation

    【讨论】:

    • 请原谅我的无知和可能的愚蠢,但我不太明白这是如何锁定万向节,因为看起来好像我没有失去旋转轴,而是相机变得混乱。你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 2013-07-15
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 2012-02-15
    相关资源
    最近更新 更多