【问题标题】:XNA rotation over given vectorXNA 在给定向量上的旋转
【发布时间】:2012-01-07 00:59:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: xna rotation 3d


    【解决方案1】:

    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 是表示边缘角度的单位向量,rotation 是要旋转的弧度数的浮点数。

    最后一点是“动画”的关键。您要做的是根据经过多长时间来创建钢琴盖随时间打开的“动画”来改变浮动量。当然你会想把它固定在一个上限,否则你的盖子会一直旋转。

    现在,为了真正转换你的封面模型,你必须按顺序将它的世界矩阵乘以上述两个矩阵。

    pianoCover.World *= originTranslation * axisRotation;
    

    然后,如果您希望可以将封面向后平移,使其中心位于原点(通过将变换矩阵与 Vector3 值与您最初拥有的值相乘),然后随后将您的封面平移到它的任何位置需要在空间中使用另一个变换矩阵到该点。

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

    在 3D 中处理矩阵非常困难。事实上,我可能还没有完全正确(我希望现在我已经足够了解了,但是......)。你得到的练习越多,你就能更好地判断如何执行这样的任务。我建议阅读有关该主题的教程。任何涉及 XNA 中 3D 的教程都会有这个主题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多