Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 三个JS从matrixWorld获取(世界)旋转_Javascript_Three.js_Rotation_Position - Fatal编程技术网

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

Javascript 三个JS从matrixWorld获取(世界)旋转,javascript,three.js,rotation,position,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; obj

如何在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);
var relativeCameraOffset = new THREE.Vector3(0, 0, 500); // 500 is z-distance from my object
var cameraOffset = relativeCameraOffset.applyMatrix4(obj3.matrixWorld);
camera.position = cameraOffset;
现在,我想让我的相机在一定距离内正交地观察obj3。当我的对象不旋转时,其工作原理如下:

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);
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对象的世界“方向”。 谢谢。

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

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

如果您只想将摄像头与obj3链接,可以执行以下操作:

obj3.add(camera);

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

谢谢!我用它从一个移动和旋转的物体上为相机设置动画。使用
getWorldQuaternion
方法时,它非常紧张,您提到的第一个方法是平滑的。仅供其他人参考:)