Math 从原点旋转的坐标系确定四元数(给出三个新的单位向量)

Math 从原点旋转的坐标系确定四元数(给出三个新的单位向量),math,quaternions,Math,Quaternions,我有一个基本坐标系x,y,z。具有相同原点的第二个正交系统b、n、t(副法线、法线、切线),在动画中动态确定。对象将与此系统对齐 如何从三个归一化向量b,n,t确定系统x,y,z中相应的四元数 不久前,我创建了一个在两个方向上的轴、角度和四元数的可视化转换。但是,这无助于解决指定三个系统单位向量的问题 见说明 另见文件 更新: 从旋转矩阵到四元数的转换已经发表了好几次。请参见下面我自己的解决方案中的链接 向量基到四元数的转换不完全相同,我找不到出版物 下面描述的解决方案是基于将新基作为初始基

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

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

不久前,我创建了一个在两个方向上的轴、角度和四元数的可视化转换。但是,这无助于解决指定三个系统单位向量的问题

见说明

另见文件

更新:

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

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

下面描述的解决方案是基于将新基作为初始基的旋转。从这里你很容易得到一个旋转矩阵(在这个例子中是转置)

如果我们现在将其与著名的四元数变换旋转矩阵相连接,我们将得到正确的算法


特别注意这些迹象。

我自己也能找到解决办法

基于

我得到下面的算法。(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;

    }

}