XNA中的这种旋转行为是什么?

时间:2010-08-20 01:13:31

标签: xna

我刚刚开始在XNA中提出有关轮换的问题。当您将矢量乘以XNA中的旋转矩阵时,它会逆时针旋转。我明白了。

但是,让我举一个例子,说明我没有得到的。假设我将随机艺术资产加载到管道中。然后我创建一些变量,以便在更新方法运行时将每个帧递增2弧度(testRot + = 0.034906585f)。我困惑的主要是,资产在这个屏幕空间顺时针旋转。这让我感到困惑,因为旋转矩阵将逆时针旋转矢量。

另外一件事,当我指定我的位置矢量的位置,以及我的起源时,我明白我在旋转原点。我是否假设有垂直轴穿过该资产的来源?如果是这样,轮换从哪里开始?换句话说,我是从Y轴顶部还是从x轴开始旋转?

2 个答案:

答案 0 :(得分:11)

XNA SpriteBatch适用于客户端空间。 “up”是Y-,而不是Y +(如笛卡尔空间,投影空间,以及大多数人通常选择的世界空间)。这使得旋转显示为顺时针(不像在笛卡尔空间中那样逆时针)。旋转产生的实际坐标是相同的。

轮换是相对的,因此它们并不真正从任何指定的位置“开始”。

如果您使用sincosatan2等数学函数,则绝对角度始终从X +轴开始为零弧度,并且正旋转方向朝Y +方向旋转。


SpriteBatch的操作顺序如下所示:

  1. Sprite以四边形开始,左上角为(0,0),其大小与其纹理大小相同(或SourceRectangle)。
  2. 将精灵转换回原点(因此将其原点放在(0,0))。
  3. 缩放精灵
  4. 旋转精灵
  5. 按其位置翻译精灵
  6. 应用SpriteBatch.Begin
  7. 中的矩阵

    这会将精灵放在客户空间中。

    最后,将矩阵应用于每个批处理,将客户空间转换为GPU使用的投影空间。 (投影空间从视口左下角的(-1,-1)到右上角的(1,1)。)

答案 1 :(得分:2)

由于您是XNA的新手,请允许我介绍一个可以帮助您学习的图书馆。它被称为XNA调试终端,是一个开源项目,允许您在运行时运行任意代码。因此,您可以看到您的变量是否具有您期望的值。所有这些都发生在游戏顶部的终端显示中,而不会暂停游戏。它可以在http://www.protohacks.net/xna_debug_terminal下载 它是免费的,非常容易设置,所以你真的没有什么可失去的。