从matrixWorld中获取(世界)旋转的THREE JS方法

4

如何在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对象的世界“方向”。 谢谢。

3个回答

19

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

const position = new THREE.Vector3(); // create one and reuse it
const quaternion = new THREE.Quaternion();
const scale = new THREE.Vector3();

mesh.matrixWorld.decompose( position, quaternion, scale );

你可以像这样设置相机的方向:

camera.quaternion.copy( quaternion );

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

mesh.updateWorldMatrix( true, false );

编辑:现在有另一种可用的方法。查看源代码,以便了解它在做什么。

Object3D.getWorldQuaternion( targetQuaternion );

three.js r.147


谢谢!我正在使用它来从移动和旋转的对象中对相机进行动画处理。使用 getWorldQuaternion 方法会出现抖动,而你提到的第一种方法则很平滑。这只是给其他人的一个提示 :) - Kus

0
如果你只想将相机与obj3链接,你只需要这样做:
obj3.add(camera);

0
使用 mesh.getWorldPosition() 获取物体的世界坐标,使用mesh.getWorldRotation()获取物体的旋转。

据我所知,getWorldRotation不在API中。它可能在2018年的时候存在过,但现在已经不存在了。 - Kyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接