给定向量上的XNA旋转

给定向量上的XNA旋转,xna,rotation,3d,Xna,Rotation,3d,我是XNA的新手,很抱歉这个简单的问题,但我找不到任何解决方案 我有一个简单的模型(类似于平面长方体),我不能改变它(模型本身)。我想创建旋转动画。在这个问题上,我的模型只是一个钢琴的封面。但是,我要旋转的轴被封面的中间带覆盖了。因此,我的模型像涡轮一样旋转,而不是打开和关闭 我想在给定的“线”上旋转我的对象。我找到了Matrix.CreateLookAt(currentPosition,dstPosition,Vector.Up)方法,但仍然不知道如何将旋转与这样的矩阵结合起来。matrix.

我是XNA的新手,很抱歉这个简单的问题,但我找不到任何解决方案

我有一个简单的模型(类似于平面长方体),我不能改变它(模型本身)。我想创建旋转动画。在这个问题上,我的模型只是一个钢琴的封面。但是,我要旋转的轴被封面的中间带覆盖了。因此,我的模型像涡轮一样旋转,而不是打开和关闭


我想在给定的“线”上旋转我的对象。我找到了
Matrix.CreateLookAt(currentPosition,dstPosition,Vector.Up)
方法,但仍然不知道如何将旋转与这样的矩阵结合起来。

matrix.CreateLookAt用于相机,而不是用于操纵模型(尽管我相信一些了解它创建的矩阵类型的聪明人已经这样做了)

您要做的是围绕空间中的任意轴旋转模型。这不是一个动画(那些是在3D建模软件中创建的,不是游戏),而是一个转换。变换是可以移动、旋转和缩放模型的方法,显然是3D游戏图形的关键

对于您的问题,您希望围绕其边缘旋转此扁平件,是吗?为此,将结合平移和轴旋转

首先,要移动模型,以便要旋转的边与原点相交。因此,如果边是Z方向上的一条直线,它将与Z轴完全对齐,并与0,0,0相交。为此,您需要了解模型的尺寸。一旦有了这些,创建一个矩阵:

Matrix originTranslation = Matrix.CreateTranslation(new Vector3(-modelWidth / 2f, 0, 0))
(假设为方形模型。操纵矢量3,直到所需边与原点相交)

现在,我们要做旋转。这取决于边缘的角度。如果您的模型是正方形,因此边在Z方向上是笔直向前的,我们可以绕矢量3.forward旋转。然而,如果你的边是有角度的(就像我想象的钢琴盖一样),你必须自己确定角度,并创建一个具有相同角度的单位向量。现在,您将创建另一个矩阵:

Matrix axisRotation = Matrix.CreateFromAxisAngle(myAxis, rotation)
其中myAxis是表示边的角度的单位向量,旋转是要旋转的弧度数的浮点

最后一点是“动画”的关键。您要做的是根据创建钢琴盖打开的“动画”所花费的时间来改变浮动量。当然,您会希望将其钳制在一个较高的值,否则您的盖子将继续旋转

现在,为了实际转换封面模型,必须将其世界矩阵乘以上述两个矩阵,顺序如下

pianoCover.World *= originTranslation * axisRotation;
然后,如果您愿意,可以将封面向后平移,使其中心位于原点(通过将变换矩阵与向量3值相乘,向量3值与您最初获得的值为负),然后使用另一个变换矩阵将封面平移到空间中需要的任何位置

所以,请注意矩阵是如何在3D游戏中使用的。使用适当的矩阵方法创建矩阵,以创建所需的质量(平移、旋转和轴、比例等)。为每个属性创建一个矩阵。然后按特定顺序将它们相乘(顺序在矩阵相乘中很重要),以根据需要变换模型。通常,如图所示,这些变换是中间的,以获得所需的效果(我们不能简单地将封面移动到需要的位置,然后围绕其边缘旋转;我们必须将边缘移动到原点,旋转,向后移动,等等)

在3D中处理矩阵非常困难。事实上,我可能还没有完全正确(我希望现在我已经足够清楚了,但是…)。你练习得越多,就越能判断如何执行这样的任务。我建议大家阅读这方面的教程。任何在XNA中介绍3D的教程都有这个主题


最后,如果你对3D建模软件有足够的了解,我可能会建议你只制作一个钢琴的真实动画,包括开合,并在游戏中使用该动画模型,而不是同时使用钢琴和封面的模型,并试图将它们保持在一起。

Matrix.CreateLookAt用于相机,而不是用于操纵模型(尽管我相信一些了解它创建的矩阵类型的聪明人已经这样做了)

您要做的是围绕空间中的任意轴旋转模型。这不是一个动画(那些是在3D建模软件中创建的,不是游戏),而是一个转换。变换是可以移动、旋转和缩放模型的方法,显然是3D游戏图形的关键

对于您的问题,您希望围绕其边缘旋转此扁平件,是吗?为此,将结合平移和轴旋转

首先,要移动模型,以便要旋转的边与原点相交。因此,如果边是Z方向上的一条直线,它将与Z轴完全对齐,并与0,0,0相交。为此,您需要了解模型的尺寸。一旦有了这些,创建一个矩阵:

Matrix originTranslation = Matrix.CreateTranslation(new Vector3(-modelWidth / 2f, 0, 0))
(假设为方形模型。操纵矢量3,直到所需边与原点相交)

现在,我们要做旋转。这取决于边缘的角度。如果您的模型是正方形,因此边在Z方向上是笔直向前的,我们可以绕矢量3.forward旋转。然而,如果你的边是有角度的(就像我想象的钢琴盖一样),你必须自己确定角度,并创建一个具有相同角度的单位向量。现在,您将创建另一个矩阵:

Matrix axisRotation = Matrix.CreateFromAxisAngle(myAxis, rotation)
其中myAxis是表示边的角度的单位向量,旋转是