【问题标题】:THREE JS get (world) rotation from matrixWorld三个 JS 从 matrixWorld 获取(世界)旋转
【发布时间】:2014-02-28 17:00:47
【问题描述】:

如何在 three.js 中获得 Object3D 的世界旋转? 我知道如何从object.matrixWorld 获取 Object3D 的世界位置,但是如何获得对象的世界旋转?

我需要这个来解决以下问题:我有一个像这样的分层对象结构:

var obj1 = new THREE.Object3D();
obj1.x = 200;
obj1.rotation.x = 0.1;
scene.add(obj1);

var obj2 = new THREE.Object3D();
obj2.y = -400;
obj2.rotation.y = 0.21;
obj1.add(obj2);

var obj3 = new THREE.Object3D();
obj3.z = -200;
obj3.rotation.x = 0.1;
obj3.rotation.y = -0.1;
obj2.add(obj3);

现在我想让我的相机在一定距离内正交地看 obj3。当我的对象不旋转时,它的工作原理如下:

var relativeCameraOffset = new THREE.Vector3(0, 0, 500); // 500 is z-distance from my object
var cameraOffset = relativeCameraOffset.applyMatrix4(obj3.matrixWorld);
camera.position = cameraOffset;

当只有我的最后一个孩子被旋转时,当我添加这一行时,我得到了我想要的

camera.rotation = obj3.rotation;

但是当所有父元素都旋转时,这不起作用。所以我正在寻找一种方法来获得我的 3D 对象的世界“方向”。 谢谢。

【问题讨论】:

    标签: javascript three.js rotation position


    【解决方案1】:

    获得“世界”旋转的一种方法如下:

    var position = new THREE.Vector3();
    var quaternion = new THREE.Quaternion();
    var scale = new THREE.Vector3();
    
    mesh.matrixWorld.decompose( position, quaternion, scale );
    

    然后您可以像这样设置相机方向:

    camera.quaternion.copy( quaternion );
    

    重要提示:如果您要直接访问matrixWorld,您必须确保它已更新。渲染器通常在渲染循环中为您执行此操作。但是,如果您在渲染调用之间,并且需要强制更新矩阵,则可以使用

    mesh.updateMatrixWorld( true );
    

    编辑:现在有一种新方法可用。检查源代码,看看它在做什么。

    Object3D.getWorldQuaternion( optionalTarget );
    

    three.js r.69

    【讨论】:

    • 谢谢!我正在使用它从移动和旋转的对象中为相机设置动画。使用getWorldQuaternion 方法很紧张,你提到的第一种方法很顺利。仅供参考:)
    【解决方案2】:

    如果你只想将相机与obj3链接,你可以这样做:

    obj3.add(camera);
    

    【讨论】:

      【解决方案3】:

      使用mesh.getWorldPosition() 获取世界位置,使用mesh.getWorldRotation() 获取它的旋转。

      【讨论】:

        猜你喜欢
        • 2017-10-26
        • 2013-02-04
        • 2021-10-22
        • 2019-10-18
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 2014-05-07
        相关资源
        最近更新 更多