Three.js:重新定向旋转轴

时间:2014-12-27 03:10:16

标签: javascript rotation three.js

我有一个飞机网,尾巴位于(0,0,0),鼻子位于(a,b,c)。我想将鼻子指向(e,f,g)并将尾巴留在(0,0,0)处。不应该引入无关的旋转,只需要一次简单的旋转来重新定位飞机。

也许另一种说法:我想在计算飞机的旋转时使用不同的坐标系。在我的例子中(e,f,g)理想情况下是(1,0,0)所以我可以更简单地计算一些旋转。

这可能更像是一个纯粹的数学问题,但我试图在three.js中实现它,并且想知道影响这个结果的最佳调用系列是什么。

1 个答案:

答案 0 :(得分:2)

首先,创建所需的四元数:

var vFrom = new THREE.Vector3( a, b, c ).normalize();
var vTo = new THREE.Vector3( e, f, g ).normalize();

var quaternion = new THREE.Quaternion().setFromUnitVectors( vFrom, vTo );

如果几何定向使飞机面向正z轴,您会发现很方便。

因此,请将( e, f, g )定义为( 0, 0, 1 )

现在,将四元数应用于网格的几何体:

geometry.applyMatrix( new THREE.Matrix4().makeRotationFromQuaternion( quaternion ) );

此时,飞机的机头应指向矢量vTo的方向,在您的情况下,它将是正z轴。 (希望飞机在这一点上保持水平。如果不是,你将不得不应用另一个变换来修复它。)

要使用自然偏航,俯仰和滚转重新定位飞机,请设置

mesh.rotation.order = 'YXZ'. // the default is `XYZ`

现在您可以像这样设置飞机的方向:

mesh.rotation.set( pitch_radians, yaw_radians, roll_radians );

一切都应该非常直观。

three.js r.69