三个JS从matrixWorld获得(世界)旋转 [英] THREE JS get (world) rotation from matrixWorld

查看:348
本文介绍了三个JS从matrixWorld获得(世界)旋转的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How do I get the world rotation of an Object3D in three.js? I know how to get the world position of an Object3D from object.matrixWorld, but how do I get the world rotation of an object?

对于以下问题,我需要这样做:我有一个像这样的分层对象结构:

I need this for the following problem: I have a hierarchical Object structure like this:

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.当我的对象"不旋转时,其工作方式如下:

Now I want to make my camera look at obj3 orthogonally in a certain distance. When My Objects are not rotated, this works like this:

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

仅当最后一个孩子旋转时,添加此行即可得到所需的内容

When only my last child is rotated I get what I want when I add this line

camera.rotation = obj3.rotation;

但是,当所有父元素旋转时,这将不起作用.因此,我正在寻找一种获取3D对象的世界方向"的方法. 谢谢.

But when all parent Elements are rotated this is not working. So I'm looking for a way to get the world "orientation" of my 3D object. Thanks.

推荐答案

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

One way to get the "world" rotation is as follows:

var position = new THREE.Vector3();
var quaternion = new THREE.Quaternion();
var scale = new THREE.Vector3();

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

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

You can then set your camera orientation like so:

camera.quaternion.copy( quaternion );

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

Important: if you are going to access matrixWorld directly, you have to make sure it is updated. The renderer typically does this for you in the render loop. If, however, you are between render calls, and need to force an update of the matrix, you can do so with

mesh.updateMatrixWorld( true );

现在有一种新方法可用.检查源代码,以查看其作用.

There is a new method that is now available. Check the source code so you see what it is doing.

Object3D.getWorldQuaternion( optionalTarget );

three.js r.69

three.js r.69

这篇关于三个JS从matrixWorld获得(世界)旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆