三个JS从matrixWorld获得(世界)轮换

时间:2014-02-04 16:03:39

标签: 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;

当我的最后一个孩子被轮换时,我在添加这条线时得到了我想要的东西

camera.rotation = obj3.rotation;

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

3 个答案:

答案 0 :(得分:14)

获得“世界”轮换的一种方法如下:

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

答案 1 :(得分:0)

如果您只想将相机与obj3相关联,您可以这样做:

obj3.add(camera);

答案 2 :(得分:0)

使用mesh.getWorldPosition()获取世界排名,mesh.getWorldRotation()使其获得轮换。