我怎样才能检索2的Vector3D 3个欧拉角?
谢谢
CEDRE
dim vector1 = new Vector3D(0, 0, 1);
dim vector2 = new Vector3D(0.33, 0.45, 0.49);
dim myEuler = GetEulerFrom2Vector(vector1,vector2); // ?????
我在一个直角工件坐标系,我使用ZYX欧拉惯例
我怎样才能检索2的Vector3D 3个欧拉角?
谢谢
CEDRE
dim vector1 = new Vector3D(0, 0, 1);
dim vector2 = new Vector3D(0.33, 0.45, 0.49);
dim myEuler = GetEulerFrom2Vector(vector1,vector2); // ?????
我在一个直角工件坐标系,我使用ZYX欧拉惯例
我们可以假设这两个向量垂直于彼此vector1.Dot(vector2)==0
? 如果是,那么找到第三矢量形成的坐标系
vector1 = vector1.Normalized();
vector2 = vector2.Normalized();
vector3 = VectorCross(vector1,vector2).Normalized();
其中VectorCross
是3D矢量叉积,和Normalized()
返回一个单位矢量。
现在你的旋转矩阵E
是
| vector1.x vector2.x vector3.x |
| vector1.y vector2.y vector3.y |
| vector1.z vector2.z vector3.z |
现在,您可以从旋转矩阵欧拉使用的角度去这里的说明 。
PS。 如果vector2
不垂直于vector1
你可以把它垂直的vector2 = CrossProduct(vector3, vector1).Normalized()
之后vector3
计算。
下面是我使用两轴的旋转矩阵去的代码:
public static mat3 AlignZX(vec3 unit_z, vec3 unit_x)
{
unit_x=unit_x.Normalized();
unit_z=unit_z.Normalized();
vec3 unit_y=unit_z.Cross(unit_x);
unit_x=unit_y.Cross(unit_z);
return mat3.Combine(unit_x, unit_y, unit_z);
}
public static mat3 AlignXY(vec3 unit_x, vec3 unit_y)
{
unit_x=unit_x.Normalized();
unit_y=unit_y.Normalized();
vec3 unit_z=unit_x.Cross(unit_y);
unit_y=unit_z.Cross(unit_x);
return mat3.Combine(unit_x, unit_y, unit_z);
}
public static mat3 AlignYZ(vec3 unit_y, vec3 unit_z)
{
unit_y=unit_y.Normalized();
unit_z=unit_z.Normalized();
vec3 unit_x=unit_y.Cross(unit_z);
unit_z=unit_x.Cross(unit_y);
return mat3.Combine(unit_x, unit_y, unit_z);
}
我用一个旋转矩阵:
R11 R12 R13
R21 R22 R23
R31 R32 R33
与R = RY RZ的Rx
if (R31 <> ±1)
y1 = -sin-1(R31)
y2 = pi + sin-1(R31)
x1 = atan2 (R32/cos y1,R33/cos y1)
x2 = atan2 (R32/cos y2,R33/cos y2)
z1 = atan2( R21/cos y1,R11/cos y1)
z2 = atan2( R21/cos y2,R11/cos y2)
Else
z= anything; can set to 0
if (R31 = -1)
y = -pi / 2
x = z + atan2(R12,R13)
Else
y = -pi / 2
x = -z + atan2(-R12,-R13)
End If
End If
https://truesculpt.googlecode.com/hg-history/38000e9dfece971460473d5788c235fbbe82f31b/Doc/rotation_matrix_to_euler.pdf
或一个简单的版本
result.X = Math.Atan2(R32, R33) * (180.0 / Math.PI)
result.Y = Math.Atan2(-1 * R31, Math.Sqrt(R32 * R32 + R33 * R33)) * (180.0 / Math.PI)
result.Z = Math.Atan2(R21, R11) * (180.0 / Math.PI)