【问题标题】:Three.js: re-orient axis of rotationThree.js:重新定位旋转轴
【发布时间】:2014-12-28 01:37:05
【问题描述】:

我有一个飞机网格,它的尾巴在 (0,0,0),鼻子在 (a,b,c)。我想将鼻子指向(e,f,g)并将尾巴留在(0,0,0)。不应引入任何无关的旋转,只需一个简单的旋转即可重新指向平面。

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

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

【问题讨论】:

    标签: javascript rotation three.js


    【解决方案1】:

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

    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

    【讨论】:

    • 我可以在网格 (object3d) 上调用 applyMatrix() 而不是几何,对吗?这正是我所期待的,现在我正在挠头想看看有什么不同。
    • 通过首先对几何体应用变换,几何体按需要定向,mesh.rotation 保持在( 0, 0, 0 )
    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 2015-06-15
    • 2019-02-08
    • 2012-07-23
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多