我们可以假设这两个向量相互垂直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 |
现在您可以使用instructions here 从旋转矩阵转到欧拉角。
PS。如果vector2 与vector1 不垂直,则可以在计算vector3 后使其垂直于vector2 = CrossProduct(vector3, vector1).Normalized()。
这是我用来从两个轴转到旋转矩阵的代码:
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);
}