オイラートリプレットと回転順序から 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)。
誰かが私のコードや理解の欠陥を見ることができますか? 線形代数は、私にとって自然にできるものではありません...