javascript - 三个 JS 从 matrixWorld 获取(世界)旋转

标签 javascript three.js rotation position

如何在 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;

当只有我的最后一个 child 被轮换时,我在添加这一行时得到了我想要的东西

camera.rotation = obj3.rotation;

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

最佳答案

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

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

关于javascript - 三个 JS 从 matrixWorld 获取(世界)旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21557341/

相关文章:

javascript - 错误 : Bootstrap's JavaScript requires jQuery

javascript - 我无法将数据从 Controller 传递到 Sencha Touch 2.4 中的 View

javascript - 运行时添加灯光: materials not updated?

Android surfaceChanged 不正确的宽度/高度值

java - 旋转多个形状并保持关系

javascript - 视差滚动图像超出视野

javascript - 无法显示自定义对话框

javascript - 3D 切片网络应用程序 Javascript 和 Three.js

javascript - 如何使用 Three.js 中的复选框隐藏/显示 STL 模型

Android:我的 imageview 旋转了,但它的触摸区域没有