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

6

我刚开始学习XNA,有一个关于旋转的问题。在XNA中,当您将向量与旋转矩阵相乘时,它会逆时针旋转。这一点我理解。

然而,让我举一个我不理解的例子。假设我将一个随机的艺术资源加载到管道中。然后我创建一个变量,在更新方法运行时每帧增加2弧度(testRot += 0.034906585f)。最令我困惑的是,在这个屏幕空间中,该资源顺时针旋转。这使我感到困惑,因为旋转矩阵会将向量逆时针旋转。

另外一件事情是,当我指定我的位置向量以及我的起点时,我知道我是围绕起点旋转的。那么我应该假定该资源的起点也经过垂直轴吗?如果是的话,旋转从哪里开始呢?换句话说,我是从Y轴的顶部开始旋转还是从x轴开始旋转呢?


@llya - 你应该接受你其他问题的答案,这样别人才会想回答你的问题。 - TheCloudlessSky
2个回答

11

XNA SpriteBatch在“客户端空间”中工作。在这个空间中,“上方”是Y-而不是Y +(如笛卡尔空间,投影空间以及大多数人通常选择的世界空间)。这使得旋转看起来是顺时针的(在笛卡尔空间中应该是逆时针的)。实际坐标旋转产生的是相同的。

旋转是相对的,因此它们不会从任何指定的位置“开始”。

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


SpriteBatch的操作顺序类似于以下内容:

  1. Sprite作为一个四边形开始,左上角位于(0,0),其大小与其纹理大小相同(或SourceRectangle)。
  2. 将精灵沿其原点平移回来(从而将其原点放置在(0,0))。
  3. 缩放精灵
  4. 旋转精灵
  5. 将精灵按其位置平移
  6. 应用来自SpriteBatch.Begin的矩阵

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

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


1
哇,谢谢你啊。讲得非常好。我搜了很多教程和书籍,但它们只是浅显地谈论这些内容而已,没有深入探讨。 - Ilya

2

由于您是XNA的新手,让我介绍一个可以在您学习过程中大大帮助您的库。它被称为XNA Debug Terminal,是一个开源项目,允许您在运行时运行任意代码。因此,您可以查看您的变量是否具有您期望的值。所有这些都发生在游戏顶部的终端显示屏上,并且不会暂停您的游戏。它可以从http://www.protohacks.net/xna_debug_terminal下载。它是免费的并且非常容易设置,因此您真的没有什么损失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接