2

オイラートリプレットと回転順序から 4x4 アフィン変換行列を作成しようとしています。結果のマトリックスが回転を外部的に表すようにしたい(つまり、固定フレーム)。私のアプリケーションでは、左手座標フレームと列ベクトルを使用しています。

ウィキペディアVectorAlgebraによって提供される数学に従うと、方程式は次のようになります。

ここに画像の説明を入力

ただし、zAxis で任意の量を回転すると、次の yAxis または zAxis 回転がオブジェクトのローカルの同等の軸で実行されます。これは私が望むものの反対です!

私が使用しているコードは以下のとおりです。

Matrix4f Sy_3dMath::createRotationMatrix( Axis axis, float radians )
{
    float c = cos( radians );
    float s = sin( radians );

    if ( axis == X ) {
        return ( Matrix4f() << 1.0f, 0.0f,  0.0f, 0.0f,
                               0.0f, c,    -s,    0.0f,
                               0.0f, s,     c,    0.0f,
                               0.0f, 0.0f,  0.0f, 1.0f ).finished();
    } else if ( axis == Y ) {
        return ( Matrix4f() <<  c,    0.0f, s,    0.0f,
                                0.0f, 1.0f, 0.0f, 0.0f,
                               -s,    0.0f, c,    0.0f,
                                0.0f, 0.0f, 0.0f, 1.0f ).finished();
    } else {
        return ( Matrix4f() << c,   -s,    0.0f, 0.0f,
                               s,    c,    0.0f, 0.0f,
                               0.0f, 0.0f, 1.0f, 0.0f,
                               0.0f, 0.0f, 0.0f, 1.0f ).finished();
    }
}

Matrix4f Sy_3dMath::matrixFromEulerAngles( const Vector3f& euler,
                                           Sy_3dMath::RotationOrder order )
{
    EulerData ed = getEulerData( order );
    return createRotationMatrix( static_cast< Axis >( ed.k ), euler( ed.k ) ) *
           createRotationMatrix( static_cast< Axis >( ed.j ), euler( ed.j ) ) *
           createRotationMatrix( static_cast< Axis >( ed.i ), euler( ed.i ) );
}

EulerDataインデックスを表す 3 つの int を含む単純な構造体ですAxis(つまり、2 == zAxis == k, 0 == xAxis == i)。

誰かが私のコードや理解の欠陥を見ることができますか? 線形代数は、私にとって自然にできるものではありません...

4

1 に答える 1