glFrustum函数是什么?

8
根据MSDN,我们正在将当前矩阵与透视矩阵相乘。这里讨论的是哪个矩阵?同样来自MSDN:
“glFrustum函数将当前矩阵乘以此矩阵,并用结果替换当前矩阵。也就是说,如果M是当前矩阵,F是截锥透视矩阵,则glFrustum将M替换为M•F。”
现在,从我目前对12年级微积分的了解来看(我正在学习中),M是一个向量,M点积F返回一个标量,那么如何用标量替换向量呢?
我也不确定“裁剪”平面是什么以及如何通过一个浮点值引用它们。
请按照参数和概念的要求回答。我真的很感激。
我正在尝试通过这个教程学习openGL:http://www.youtube.com/watch?v=WdGF7Bw6SUg。实际上,这个教程并没有很好地解释,或者它假设你已经了解了openGL。否则,我真的感谢您的时间和回应!我相信我可以努力挣扎并找出问题所在。

2
“这个教程其实并不好,因为它没有解释任何东西,或者假设读者已经了解OpenGL。”那么你为什么要使用一个你自己承认不好的教程呢?你可以在谷歌上搜索“OpenGL教程”,找到更好的资源。 - Nicol Bolas
2个回答

14
您误解了它的含义。M是一个矩阵。因此,M•F也是一个矩阵。它构建了一个透视矩阵。有关如何构建以及何时要使用glFrustum()gluPerspective()的说明,请参见这篇文章

glFrustum()gluPerspective()都会生成透视投影矩阵,您可以使用它们将眼坐标空间转换为裁剪坐标空间。两者之间的主要区别在于,glFrustum()更通用,允许斜向投影,而gluPerspective()仅产生对称(轴上)投影。事实上,您可以使用glFrustum()来实现gluPerspective()

裁剪平面是切除世界部分以避免渲染的平面。截锥描述了平面在空间中的位置。其侧面定义了视图体积。


我们这周正在学习矩阵。我会回来重新阅读定义并给出最佳答案! - user2316667

12

glFrustum生成透视投影矩阵。

此矩阵将空间的一部分(“棱台”)映射到屏幕上。许多注意事项适用于(归一化设备坐标,透视除法等),但这就是基本思想。

你感到困惑的部分是已弃用的OpenGL API的遗留物。你可以安全地忽略它,因为通常你会在单位投影矩阵上应用gluFrustum(),所以文档中提到的乘法没有任何效果。

也许更易理解的方法如下:

// Projection matrix : 45° Field of View, 4:3 ratio, display range : 0.1 unit <-> 100 units
glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
// Or, for an ortho camera :
//glm::mat4 Projection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,0.0f,100.0f); // In world coordinates

// Camera matrix
glm::mat4 View       = glm::lookAt(
                            glm::vec3(4,3,3), // Camera is at (4,3,3), in World Space
                            glm::vec3(0,0,0), // and looks at the origin
                            glm::vec3(0,1,0)  // Head is up (set to 0,-1,0 to look upside-down)
                       );
// Model matrix : an identity matrix (model will be at the origin)
glm::mat4 Model      = glm::mat4(1.0f);
// Our ModelViewProjection : multiplication of our 3 matrices
glm::mat4 MVP        = Projection * View * Model; // Remember, matrix multiplication is the other way around

这里使用了glm::perspective(相当于旧式的gluPerspective()),但你也可以使用gluFrustum。

至于函数的参数,最好通过文档中的这一部分来解释:

左下角和右上角-nearVal指定近剪裁平面上被映射到窗口左下角和右上角的点,假设眼睛位于(0,0,0)。

如果您不熟悉变换矩阵,我在这里写了一个教程;特别是“投影矩阵”部分应该对您有所帮助。


2
只是想说,你的教程一定是我读过的最好的矩阵变换描述。赞! - Mark McKenna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接