XNA在给定向量上旋转

时间:2012-01-05 18:37:49

标签: xna rotation 3d

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

我有简单的模型(类似于扁平的长方体),我无法改变(模型本身)。我想创建旋转动画。在这个特殊问题中,我的模型只是钢琴的封面。但是,我将要旋转的轴被覆盖的中位数覆盖。结果,我的模型像涡轮一样旋转,而不是打开和关闭。

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

1 个答案:

答案 0 :(得分:3)

Matrix.CreateLookAt适用于相机,而不是用于操纵模型(虽然我确信一些聪明的人会理解它创建的矩阵类型)。

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

对于你的问题,你想要将这个平片旋转到它的边缘,是吗?为此,您将组合平移和轴旋转。

首先,您要移动模型,使您想要旋转的边与原点相交。因此,如果边缘是Z方向上的直线,它将与Z轴完美对齐并且与0,0,0相交。为此,您需要了解模型的尺寸。完成后,创建一个矩阵:

Matrix originTranslation = Matrix.CreateTranslation(new Vector3(-modelWidth / 2f, 0, 0))

(这假设是一个正方形模型。操纵Vector3直到你想要的边与原点相交)

现在,我们想要进行旋转。这取决于边缘的角度。如果您的模型是正方形,因此边缘在Z方向上是直线向前,我们可以围绕Vector3.Forward旋转。但是,如果您的边缘是倾斜的(因为我想要钢琴罩),您必须自己确定角度并创建具有相同角度的单位矢量。现在,您将创建另一个矩阵:

Matrix axisRotation = Matrix.CreateFromAxisAngle(myAxis, rotation)

其中myAxis是表示边缘角度的单位矢量,旋转是旋转弧度数的浮点数。

最后一点是你的'动画'的关键。您想要做的是根据创建钢琴罩随时间开放的“动画”所花费的时间而改变浮动量。当然你会想要把它夹在一个较高的值,否则你的封面就会继续旋转。

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

pianoCover.World *= originTranslation * axisRotation;

然后,如果你希望你可以翻转封面,使其中心位于原点(通过乘以变换矩阵,Vector3值与你第一次拥有它们相反),然后将封面翻译到任何地方需要使用另一个变换矩阵到达空间。

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

使用3D矩阵非常困难。事实上,我可能没有那么正确(我希望现在我知道这一点,但......)。你获得的练习越多,你就越能判断如何执行这样的任务。我建议阅读有关该主题的教程。任何涵盖XNA中3D的教程都将有这个主题。

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