我有一个飞机网,尾巴位于(0,0,0),鼻子位于(a,b,c)。我想将鼻子指向(e,f,g)并将尾巴留在(0,0,0)处。不应该引入无关的旋转,只需要一次简单的旋转来重新定位飞机。
也许另一种说法:我想在计算飞机的旋转时使用不同的坐标系。在我的例子中(e,f,g)理想情况下是(1,0,0)所以我可以更简单地计算一些旋转。
这可能更像是一个纯粹的数学问题,但我试图在three.js中实现它,并且想知道影响这个结果的最佳调用系列是什么。
答案 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