返回

手把手带你入门OpenGL (4):旋转、跳跃,闭着眼

前端

了解了向量的基本概念之后,我们再来看矩阵,矩阵是二位数组,也可以说就是一个表格,它有两行,两列,或者三行,三列,或者更多。那么矩阵可以拿来干嘛?如果你熟悉线性代数的话,你肯定会想到矩阵乘法。没错,矩阵乘法是非常重要和有用的。

事实上,在OpenGL中,我们通过矩阵来定义一个变换,然后把顶点数据乘以这个矩阵,就可以得到新的顶点数据,这个新的顶点数据就代表了变换后的顶点。

我们知道,一个点在三维空间中有三个坐标值,分别是x、y、z,如果我们把这三个值写成一个列向量,那么这个列向量就可以表示这个点。

[x]
[y]
[z]

我们再来看矩阵,如果我们把矩阵写成一个3x3的矩阵,那么这个矩阵就可以表示一个变换。

[a11 a12 a13]
[a21 a22 a23]
[a31 a32 a33]

当我们把列向量乘以矩阵时,我们会得到一个新的列向量,这个新的列向量就代表了变换后的点。

[x'] = [a11 a12 a13] * [x]
[y'] = [a21 a22 a23] * [y]
[z'] = [a31 a32 a33] * [z]

我们可以看到,矩阵乘法就是把列向量中的每个元素分别乘以矩阵中的每个元素,然后把结果相加。

在OpenGL中,我们使用矩阵来定义各种各样的变换,比如平移、旋转、缩放等等。我们也可以把这些变换组合起来,形成更复杂的变换。

例如,我们可以先把一个物体平移到某个位置,然后把它旋转某个角度,最后再把它缩放某个比例。

[x'] = [T11 T12 T13] * [x]
[y'] = [T21 T22 T23] * [y]
[z'] = [T31 T32 T33] * [z]
[x''] = [R11 R12 R13] * [x']
[y''] = [R21 R22 R23] * [y']
[z''] = [R31 R32 R33] * [z']
[x'''] = [S11 S12 S13] * [x'']
[y'''] = [S21 S22 S23] * [y'']
[z'''] = [S31 S32 S33] * [z'']

这样,我们就得到了一个新的点,这个点就是经过平移、旋转和缩放后的点。

矩阵乘法在OpenGL中非常重要,它可以帮助我们实现各种各样的变换。如果你想学习OpenGL,那么你必须掌握矩阵乘法。

旋转

旋转是一种围绕固定轴旋转对象的变换。在OpenGL中,旋转可以通过旋转矩阵来实现。旋转矩阵是一个3x3的矩阵,它可以表示围绕x轴、y轴或z轴的旋转。

旋转矩阵:

围绕x轴旋转:

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


围绕y轴旋转:

[cos(theta) 0 sin(theta)]
[0 1 0]
[-sin(theta) 0 cos(theta)]
围绕z轴旋转:

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


其中,theta是旋转角度。

要将旋转矩阵应用于顶点数据,我们需要将顶点数据乘以旋转矩阵。

[x'] = [R11 R12 R13] * [x]
[y'] = [R21 R22 R23] * [y]
[z'] = [R31 R32 R33] * [z]

这样,我们就得到了一个新的点,这个点就是经过旋转后的点。

跳跃

跳跃是一种沿着固定轴平移对象的变换。在OpenGL中,跳跃可以通过平移矩阵来实现。平移矩阵是一个3x3的矩阵,它可以表示沿着x轴、y轴或z轴的平移。

平移矩阵:

沿着x轴平移:

[1 0 0]
[0 1 0]
[tx 0 1]


沿着y轴平移:

[1 0 0]
[0 1 0]
[0 ty 1]
沿着z轴平移:

[1 0 0]
[0 1 0]
[0 0 tz]


其中,tx、ty和tz是平移距离。

要将平移矩阵应用于顶点数据,我们需要将顶点数据乘以平移矩阵。

[x'] = [T11 T12 T13] * [x]
[y'] = [T21 T22 T23] * [y]
[z'] = [T31 T32 T33] * [z]

这样,我们就得到了一个新的点,这个点就是经过平移后的点。

闭着眼

闭着眼是一种缩放对象的变换。在OpenGL中,闭着眼可以通过缩放矩阵来实现。缩放矩阵是一个3x3的矩阵,它可以表示沿x轴、y轴或z轴的缩放。

缩放矩阵:

沿x轴缩放:

[sx 0 0]
[0 1 0]
[0 0 1]


沿y轴缩放:

[1 0 0]
[0 sy 0]
[0 0 1]
沿z轴缩放:

[1 0 0]
[0 1 0]
[0 0 sz]


其中,sx、sy和sz是缩放因子。

要将缩放矩阵应用于顶点数据,我们需要将顶点数据乘以缩放矩阵。

[x'] = [S11 S12 S13] * [x]
[y'] = [S21 S22 S23] * [y]
[z'] = [S31 S32 S33] * [z]

这样,我们就得到了一个新的点,这个点就是经过缩放后的点。

结论

在OpenGL中,我们可以通过矩阵来实现各种各样的变换,包括旋转、跳跃和闭着眼。通过学习矩阵乘法,我们可以创建更复杂、更动态的3D图形。