C# 如何求给定方向向量和上方向向量的x、y和z旋转角?
我有一个超类对象,它表示场景中的模型。该对象包含一个3D矢量,C# 如何求给定方向向量和上方向向量的x、y和z旋转角?,c#,vector,matrix,xna,transformation,C#,Vector,Matrix,Xna,Transformation,我有一个超类对象,它表示场景中的模型。该对象包含一个3D矢量,position表示其位置,以及三个变量x、y和z,用于描述其围绕这些轴的旋转。其变换矩阵计算如下: Matrix.CreateRotationX(x) * Matrix.CreateRotationY(y) * Matrix.CreateRotationZ(z) * Matrix.CreateTranslation(position) 这一切都很正常,但在某些情况下,我需要根据归一化方向向量和上方向向量计算x、y和z的值。我该怎么
position
表示其位置,以及三个变量x
、y
和z
,用于描述其围绕这些轴的旋转。其变换矩阵计算如下:
Matrix.CreateRotationX(x) *
Matrix.CreateRotationY(y) *
Matrix.CreateRotationZ(z) *
Matrix.CreateTranslation(position)
这一切都很正常,但在某些情况下,我需要根据归一化方向向量和上方向向量计算
x
、y
和z
的值。我该怎么做呢?我自己不知道怎么做,但Matrix.CreateLookAt不能满足您的需要吗
Matrix.CreateLookAt(new Vector3(0, 0, 0), new Vector3(x, y, z), yourUpVector)
* Matrix.CreateTranslation(position);
将矩阵转换为四元数:
Quaternion q=Quaternion.CreateFromRotationMatrix(矩阵)代码>
然后复制粘贴并在其中运行四元数。与ClassicThunder的答案相同(具有相同的限制,它为您提供了所需的矩阵,而不是角度),只是它比使用CreateLookAt
(这实际上是用于制作视图矩阵)要好一点
()
在我看来,您可能不应该使用或存储对象的Euler旋转。()我不完全确定你在问什么,但是如果你想知道如何对向量进行归一化,你可以使用Vector3.Normalize()来确认:你是在问,对于给定的向量,如何确定围绕三个轴的等效旋转?@lzcd是的,对于给定的向量,我想要x
中所有三个轴的旋转,y
和z
变量,以便我以后可以使用Matrix
类的CreateRotation…
方法计算旋转矩阵。除了超类将x
、y
和z
组件单独存储,而不是使用矩阵
。
Matrix.CreateWorld(position, direction, up);