【问题标题】:XNA and MatricesXNA 和矩阵
【发布时间】:2010-08-28 16:59:51
【问题描述】:

因此,多亏了这个董事会的许多回复,我对幕后的一些内容有了更好的理解,但我只需要再多一点点才能得到一个坚定的理解。所以我在这里阅读了 Riemer 的部分教程:

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Matrices.php

我将使用马车示例,因为它相当简单。

所以马车的一系列变换是这样的:

1: Matrix.Identity;
2: Matrix.CreateTranslation(xPos, yPos, 0)
3: Matrix.CreateScale(playerScaling)
4: Matrix.CreateTranslation(0, -carriage.Height, 0)

所以我的问题是:

里默说:

1:如果我们只渲染图像 就像它一样(或:与身份 转换),它将被渲染 左上角的原始大小 屏幕一角。

  1. 我不知道这适用于什么情况。他只是指在抽签之前,所有图像都从世界原点0,0开始吗?或者他是说当这些转换生效时,对象的原点现在将被放置在左上角并转换回世界原点?

2:首先,移动车厢图像,使其左上角位于 SpriteBatch.Draw 方法中指定为第二个参数的位置。

  1. 好的,他是说这是在 draw 方法期间发生的事情的幕后情况,还是他只是传递与您发送给 draw 方法的参数相同的参数?

4:最后,这是最具挑战性的一步:图像在 Y 轴上移动,因为在我们的 SpriteBatch.Draw 方法中,我们已将 (0,carriageTexture.Height) 指定为原点。非常重要:它在自己的 Y 轴上移动, 已按比例缩小。因此,马车不会移动超过 39 个屏幕像素,而是垂直移动超过 39*0.4=16 像素像素(因为carriageTexture.Height = 39 和 playerScaling = 0.4)。

  1. 好的,所以我们一直在使用这些矩阵在我们的世界/屏幕空间中定位事物。当您缩小某些东西时,我不明白为什么它现在会开始根据对象的本地空间移动。例如,我们的第一个平移矩阵根据世界/屏幕空间移动,但现在他说“它在自己的 Y 轴上移动”。

  2. 为什么单位矩阵是可选的?

因此,我无法将 draw 方法与这些矩阵乘法连接起来,对象去世界原点的处理方式是什么,以及为什么创建转换会改变其行为。

【问题讨论】:

  • 您可能还想在 creators.xna.com 论坛上问这个问题。

标签: xna linear-algebra


【解决方案1】:

1.1:本系统默认在左上角绘制图像。并非所有系统都是这样,因此值得在文档中指出这一点。因此,如果没有应用任何转换(或者只有身份转换,它不做任何事情),它将在左上角绘制。

2.1:一旦您在第 2 行应用了转换,它将在屏幕上平移(移动)图像 xPos、yPos。它何时发生并不重要,但它可能会在绘图时由显卡应用。

4.1:不,你一直是按局部空间定位的。只是直到第 3 行,局部空间的大小与全局空间的大小相同。现在本地空间被缩放了,所以翻译也会被缩放。

4.2:大多数系统将矩阵初始化为单位矩阵。根据定义,单位矩阵没有任何作用(如果将它与矩阵 A 相乘,您将再次得到矩阵 A)。因此,如果您忽略它,那也没关系。它对于显式或稍后重置矩阵很有用。

【讨论】:

  • 那么当它缩放/旋转和平移时,draw 方法是否会在底层为我应用转换?如果我首先使用矩阵进行缩放,然后在绘图中指定一个位置,绘图会根据现在缩放的局部空间还是屏幕/世界空间移动?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多