XNA / OpenGL使用左手矩阵吗?

时间:2015-03-31 13:59:07

标签: opengl math matrix xna

据我了解,默认情况下,OpenGL和XNA都使用右手坐标系。

但看起来这两个库生成的旋转矩阵都是左撇子。

我之所以这样认为,正向Z旋转会产生像这样计算的矩阵(此表示中的行主要部分):

cos  |  sin  |  0
-sin |  cos  |  0
  0  |   0   |  1

根据我发现的来源,这是一个左手Z旋转矩阵(http://www.cprogramming.com/tutorial/3d/rotationMatrices.html

我的问题是:

  1. 我说错了吗?矩阵是左手但是坐标系是对的吗?
  2. 对于XNA / OpenGL的所有矩阵方法都是如此吗?
  3. 如果我是对的,这有什么关系?为什么不把一切都做对了?

1 个答案:

答案 0 :(得分:2)

在像OpenGL这样的图形API中,没有一个单一的坐标系。在通过管道进行转换时,顶点可以多次转换。由于线性变换与坐标系的变化实际上是相同的,因此您可以描绘每个变换引入新的坐标系。

基于此,应用程序可以在很大程度上决定他们想要使用的坐标系。对于当前版本的OpenGL中使用的可编程管道尤其如此,但在某种程度上也可以使用传统的固定管道。

让我详细说明一下这个问题,它应该涵盖你对OpenGL案例的质疑。

规范化设备坐标

标准化设备坐标(NDC)是顶点处理完成后顶点所在的坐标系。您可以将此视为OpenGL的“原生”3D坐标系。对于所有3个坐标,它的范围为[-1.0,1.0],并且左手

固定管道

在旧版固定管道中,顶点最初在对象坐标中指定(请参阅http://www.glprogramming.com/red/chapter03.html)。模型视图矩阵将它们转换为眼睛坐标,投影矩阵将其转换为剪辑坐标。透视划分后,他们成为NDC。

最常见的是对象坐标使用右手坐标系。使用保持手性的模型视图矩阵,这导致眼睛坐标仍然是右手的。投影矩阵翻转z轴的方向,产生左手剪辑坐标和NDC。

如果您选择这样,您可以轻松使用左手物体坐标,并使用翻转手性的模型视图矩阵,这样您最终会再次使用右手眼睛坐标。

可编程管道

使用可编程管道,您可以完全自由地在顶点着色器中使用所需的任何坐标系。假如你的原始顶点是用球坐标指定的,这根本不是问题。您只需要在着色器代码中相应地处理它们。顶点着色器需要生成剪辑坐标(如前所述左手)作为输出,但之前的所有内容都是完全打开的。

轮作

当前版本的OpenGL没有任何旋转概念或内置功能来创建旋转矩阵。

对于与旧版固定管道一起使用的glRotatef()函数,矩阵不是您在问题中的内容。围绕z轴的旋转由该矩阵定义:

[ cos(a)  -sin(a)  0  0 ]
[ sin(a)  cos(a)   0  0 ]
[ 0       0        1  0 ]
[ 0       0        0  1 ]

你可以在http://www.glprogramming.com/red/appendixf.html上找到这个矩阵的一半。

所以这是右手坐标系的旋转矩阵。这与我在上面“固定管道”中描述的常见用法相匹配。

编号问题的答案

根据这些材料,以下是最后编号问题的答案:

  1. 否。旋转矩阵(至少由不推荐的固定函数API调用构造)构建为使用右手坐标系。虽然“原生”坐标系(NDC)是左撇子。
  2. 对于模型变换,它只对旋转产生影响,假设它们在右手坐标系中运行。投影矩阵从右手翻转到左手。
  3. 左手与右手事项,例如,如果您正在查看三角形的缠绕顺序,或者您正在使用交叉积来计算法线。为什么NDC是左撇子......我不知道。它在开始时被定义为这样(我怀疑它甚至可能从GL转移到OpenGL)。一旦它被定义为一种方式,你就不能在不破坏兼容性的情况下改变它。