Math OpenGL中的矩阵

Math OpenGL中的矩阵,math,opengl,3d,Math,Opengl,3d,因此,我学习OpenGL作为主要资源,拥有“红皮书”。我在读矩阵代数,旋转/缩放/变换矩阵,所有的东西都很棒,但我没有一件简单的东西。假设函数glLoadIdentity()。它将默认矩阵设置为4x4。所以它设置了3个顶点和1个点:(1,0,0)(0,1,0)(0,0,1)顶点,(0,0,0)点。但我的问题是,它们对应什么?一般来说,在OpenGL中矩阵对应什么?我知道这是轴的方向。但是什么的轴心呢?摄影机?OpenGL矩阵仅对应于变换,将一个坐标空间中定义的对象、向量和点移动到另一个坐标空间。

因此,我学习OpenGL作为主要资源,拥有“红皮书”。我在读矩阵代数,旋转/缩放/变换矩阵,所有的东西都很棒,但我没有一件简单的东西。假设函数glLoadIdentity()。它将默认矩阵设置为4x4。所以它设置了3个顶点和1个点:(1,0,0)(0,1,0)(0,0,1)顶点,(0,0,0)点。但我的问题是,它们对应什么?一般来说,在OpenGL中矩阵对应什么?我知道这是轴的方向。但是什么的轴心呢?摄影机?

OpenGL矩阵仅对应于变换,将一个坐标空间中定义的对象、向量和点移动到另一个坐标空间。如果在一个坐标空间中有一个矩阵M(m11-m44,如下所示)和一个向量V(v1-v4),那么乘以M将在不同的坐标空间中将V向量(可以描述运动向量、对象位置或对象顶点)转换为W(w1-w4):

| m11 m12 m13 m14 |   | v1 |     | w1 |
| m21 m22 m23 m24 |   | v2 |     | w2 |
| m31 m32 m33 m34 | X | v3 |  =  | w3 |
| m41 m42 m43 m44 |   | v4 |     | w4 |
其中:

w1 = m11 * v1 + m12 * v2 + m13 * v3 + m14 * v4
w2 = m21 * v1 + m22 * v2 + m23 * v3 + m24 * v4
w3 = m31 * v1 + m32 * v2 + m33 * v3 + m34 * v4
w4 = m41 * v1 + m42 * v2 + m43 * v3 + m44 * v4
因此,如果我们将v1-v3视为旧的x、y和z坐标,并将v4设置为1,那么我们可以将w1-w3视为新的x、y和z坐标。我们可以看到以下几点:
m11是从旧x坐标到新x坐标的乘数,因此它用于缩放变换(m22和m33也是如此)
m14乘以1并添加到新的x坐标,以便用于平移(m24和m34也是如此)


旋转更难概念化,但它们是通过将其他矩阵值设置为适当的值来实现的。您可以在此处阅读更多内容:

OpenGL矩阵仅对应于变换,将一个坐标空间中定义的对象、向量和点移动到另一个坐标空间。如果在一个坐标空间中有一个矩阵M(m11-m44,如下所示)和一个向量V(v1-v4),那么乘以M将在不同的坐标空间中将V向量(可以描述运动向量、对象位置或对象顶点)转换为W(w1-w4):

| m11 m12 m13 m14 |   | v1 |     | w1 |
| m21 m22 m23 m24 |   | v2 |     | w2 |
| m31 m32 m33 m34 | X | v3 |  =  | w3 |
| m41 m42 m43 m44 |   | v4 |     | w4 |
其中:

w1 = m11 * v1 + m12 * v2 + m13 * v3 + m14 * v4
w2 = m21 * v1 + m22 * v2 + m23 * v3 + m24 * v4
w3 = m31 * v1 + m32 * v2 + m33 * v3 + m34 * v4
w4 = m41 * v1 + m42 * v2 + m43 * v3 + m44 * v4
因此,如果我们将v1-v3视为旧的x、y和z坐标,并将v4设置为1,那么我们可以将w1-w3视为新的x、y和z坐标。我们可以看到以下几点:
m11是从旧x坐标到新x坐标的乘数,因此它用于缩放变换(m22和m33也是如此)
m14乘以1并添加到新的x坐标,以便用于平移(m24和m34也是如此)


旋转更难概念化,但它们是通过将其他矩阵值设置为适当的值来实现的。您可以在此处阅读更多内容:

默认矩阵只是单位矩阵:

/1 0 0 0\
|0 1 0 0|
|0 0 1 0|
\0 0 0 1/
在更一般的情况下(忽略透视图和其他可能的奇异变换)

…转换坐标系的组件如下所示:

         /a\
X-axis = |b|
         \c/

         /d\
Y-axis = |e|
         \f/


         /g\
Z-axis = |h|
         \i/

         /j\
Origin = |k|
         \l/
如果将这些关联到单位矩阵,则可以看到“3个顶点和1个点”的来源


除了单位矩阵之外,这还适用于任何变换(旋转、平移等),使底部行保持在(01),并提供了一种可视化此类变换的简单方法。只需将上述四个组件视为表示轴(1 0 0)、(0 1 0)、(0 0 1)和原点(0 0 0)在通过矩阵变换后结束的位置(请记住,轴不是绝对的,而是相对于原点的)。

默认矩阵只是单位矩阵:

/1 0 0 0\
|0 1 0 0|
|0 0 1 0|
\0 0 0 1/
在更一般的情况下(忽略透视图和其他可能的奇异变换)

…转换坐标系的组件如下所示:

         /a\
X-axis = |b|
         \c/

         /d\
Y-axis = |e|
         \f/


         /g\
Z-axis = |h|
         \i/

         /j\
Origin = |k|
         \l/
如果将这些关联到单位矩阵,则可以看到“3个顶点和1个点”的来源


除了单位矩阵之外,这还适用于任何变换(旋转、平移等),使底部行保持在(01),并提供了一种可视化此类变换的简单方法。只需将上述四个组件视为表示轴(100)、(01)、(01)和原点(00)在通过矩阵变换后结束的位置(请记住,轴不是绝对的,而是相对于原点)。

噢,因此通过调用glLoadIdentity()我们只需将矩阵重置为一(恒等矩阵),向量的哪个多重性将导致相同的向量?换句话说,不会以任何方式影响对象吗?我们这样做是因为draw函数使用当前加载的矩阵绘制对象?我理解的对吗?哦,那么通过调用glLoadIdentity()我们只需将矩阵重置为一(identity matrix),向量的哪个重数将产生相同的向量?换句话说,不会以任何方式影响对象吗?我们这样做是因为draw函数使用当前加载的矩阵绘制对象?我理解得对吗?