OpenGL过剩glTranslate glRotate glScale矩阵

时间:2012-05-26 08:22:30

标签: c++ opengl rotation glut translate-animation

我正在寻找矩阵的解释(或图像)以及它在翻译,旋转和缩放时如何变化...(一个单元格带有sin(角度),另一个单元格带有x coord平移)

1 个答案:

答案 0 :(得分:3)

现在,忽略翻译,这比旋转和缩放更简单。

考虑这一点的方法是每个矩阵定义基向量的变化。给定标准坐标系,您的基础向量为(1,0,0)(0,1,0)(0,0,1)。就目前而言,我只是假设一个2D系统,因为概念已经完成,但它的工作量较少。

我也假设专栏。我不记得OpenGL是否实际使用了它,所以请先检查一下,如果需要,可以选择转置矩阵。

如前所述,基矢量可以以矩阵形式存在。这只是将每个向量作为列放在矩阵中。因此,为了从基矢量变换到基矢量(即没有变化),我们将使用以下矩阵。这也称为“单位矩阵”,因为它对输入没有任何作用(类似于* 1是乘法的同一性)。

2D         3D
(1 0)      (1 0 0)
(0 1)      (0 1 0)
           (0 0 1)

为了完整起见,我已经包含了3D版本,但就我将采用3D而言。

刻度矩阵可以看作是“拉伸”轴。如果轴是两倍大,它们之间的间隔将相差两倍,因此,内容将更大。以此为例

(2 0)
(0 2)

这会将基础向量从(1, 0)(0, 1)更改为(2, 0)(0, 2),从而使整个形状代表两倍大​​。图解,见下文。

 Before                   After
6|                        3|
5|                         |
4|                        2|-------|
3|                         |       |
2|--|                     1|       |
1|__|___________           |_______|______
0 1 2 3 4 5 6 7           0   1    2    3

旋转也是如此,相反,我们起诉不同的值,旋转矩阵的值如下:

(cos(x)   -sin(x))
(sin(x)    cos(x))

这将有效地围绕角度x旋转每个轴。要真正理解这一点,请刷新你的trig并假设每一列都是一个新的基础向量;)。

现在,翻译有点棘手。为此,我们在矩阵的末尾添加了一个额外的列,对于所有其他操作,在最后一行上只有1(即它是表单的标识)。对于翻译,我们填写如下:

(1 0 x)
(0 1 y)
(0 0 1)

这是表单中的3D,但不是您将习惯的形式。您可以将其建模为移动Z基坐标(并记住,我们在这里使用2D工作!),假设您的模型存在于Z=1。这有效地扭曲了形状,但同样,当我们在2D中工作时,它被压平,因此我们不会完成第三维。如果我们在这里使用3D,这实际上是第四个维度,可以在这里看到:

(1 0 0 x)
(0 1 0 y)
(0 0 1 z)
(0 0 0 1)

同样,没有看到“第四维”,但我们沿着它移动并展平。首先在2D空间中更容易理解它,然后尝试推断。在3D空间中,此第四维向量称为w,因此您的模型隐含在w=1

希望这有帮助!

编辑:顺便说一句,这个页面帮助我理解翻译矩阵。它有一些像样的图表,所以希望它会更有帮助: http://www.blancmange.info/notes/maths/vectors/homo/