【问题标题】:Determine quaternion from coordinate system rotated at origin (three new unit vectors given)从原点旋转的坐标系确定四元数(给出三个新的单位向量)
【发布时间】:2021-05-28 19:01:07
【问题描述】:

我有一个基本坐标系 x、y、z。具有相同原点的第二个正交系统 b、n、t(副法线、法线、切线)在动画中动态确定。一个对象要相对于这个系统对齐。

如何从三个归一化向量b、n、t中确定系统x、y、z中对应的四元数?

前段时间,我创建了一个可视化的轴、角度和四元数在两个方向上的转换。但是,这对指定三个系统单位向量的问题没有帮助。

见说明https://discourse.threejs.org/t/quaternion-axis-angle-visualization/1358

https://hofk.de/main/threejs/quaternion/quaternion_axisangle.html

另请参阅文档https://threejs.org/docs/index.html?q=qu#api/en/math/Quaternion

更新:

从旋转矩阵到四元数的变换已经发表过好几次了。另请参阅下面我自己的解决方案中的链接。

向量基到四元数的转换不相同,我找不到出版物。

下面描述的解决方案是基于以新基作为初始基的轮换。从这里你很容易得到一个旋转矩阵(在这种情况下是转置)。

如果现在将其与众所周知的变换旋转矩阵连接到四元数,则可以得到正确的算法。

特别注意标志。

【问题讨论】:

标签: math quaternions


【解决方案1】:

我自己找到了解决方案。

基于 http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm

我得到以下算法。 (JavaScript)

class Quaternion {

    setFromBasis( e1, e2, e3 ) {
        
        const   m11 = e1.x, m12 = e1.y, m13 = e1.z,
                m21 = e2.x, m22 = e2.y, m23 = e2.z,
                m31 = e3.x, m32 = e3.y, m33 = e3.z,
                trace = m11 + m22 + m33;
    
        if ( trace > 0 ) {
    
            const s = 0.5 / Math.sqrt( trace + 1.0 );
    
            this._w = 0.25 / s;
            this._x = -( m32 - m23 ) * s;
            this._y = -( m13 - m31 ) * s;
            this._z = -( m21 - m12 ) * s;
    
        } else if ( m11 > m22 && m11 > m33 ) {
    
            const s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );
    
            this._w = ( m32 - m23 ) / s;
            this._x = -0.25 * s;
            this._y = -( m12 + m21 ) / s;
            this._z = -( m13 + m31 ) / s;
    
        } else if ( m22 > m33 ) {
    
            const s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );
    
            this._w = ( m13 - m31 ) / s;
            this._x = -( m12 + m21 ) / s;
            this._y = -0.25 * s;
            this._z = -( m23 + m32 ) / s;
    
        } else {
    
            const s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );
    
            this._w = ( m21 - m12 ) / s;
            this._x = -( m13 + m31 ) / s;
            this._y = -( m23 + m32 ) / s;
            this._z = -0.25 * s;
    
        }
        
        this._onChangeCallback();

        return this;

    }

}

在那里你可以看到用法。 https://discourse.threejs.org/t/quaternion-method-setfrombasis-e1-e2-e3/27407

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 2013-09-20
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多