我正在尝试从欧拉三元组和旋转顺序创建一个 4x4 仿射变换矩阵。我希望得到的矩阵在外部表示旋转(即固定框架)。我的应用程序使用左手坐标系和列向量。
按照Wikipedia和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 个表示Axis
索引的整数(即 2 == zAxis == k,0 == xAxis == i)。
任何人都可以看到我的代码或理解中的缺陷吗?线性代数对我来说并不是自然而然的......