首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >glFrustum函数是做什么的?

glFrustum函数是做什么的?
EN

Stack Overflow用户
提问于 2013-05-28 23:16:32
回答 2查看 21.9K关注 0票数 8

根据MSDN,我们将当前矩阵与透视矩阵相乘。我们说的是什么矩阵?也来自MSDN:

glFrustum函数将当前矩阵乘以这个矩阵,结果取代了当前矩阵,即如果M是当前矩阵,F是锥透视矩阵,则glFrustum用M·F代替M。

现在,根据我目前对12年级微积分的认识,M是向量,M点积F返回标量,那么如何用标量代替向量呢?

我也不确定什么是“裁剪”平面,以及如何通过一个浮点值引用它们。

请用参数和概念表达你的答案。我会很感激的。

我正试图通过本教程学习openGL:http://www.youtube.com/watch?v=WdGF7Bw6SUg。它实际上并不是很好,因为它没有解释任何东西,或者假设一个人知道openGL。我会非常感谢链接到一个教程,否则,我真的很感谢您的时间和回应!我相信我能挺过来想办法解决问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-29 00:57:01

你误解了它的意思。M是一个矩阵。因此,M·F也是一个矩阵。它构造了一个透视矩阵。有关如何构造以及何时使用glFrustum()gluPerspective()的说明,请参见glFrustum()

glFrustum()和gluPerspective()都生成透视投影矩阵,您可以使用这些矩阵从眼睛坐标空间转换为剪辑坐标空间。两者的主要区别在于,glFrustum()更通用,允许离轴投影,而gluPerspective()只生成对称(轴上)投影。实际上,您可以使用glFrustum()来实现gluPerspective()。

剪裁的飞机是切割世界的部分的飞机,所以它们不需要渲染。圆柱体描述了飞机在太空中的位置。它的侧面定义视图卷。

票数 14
EN

Stack Overflow用户

发布于 2013-05-29 10:34:40

glFrustum生成透视投影矩阵。

此矩阵将空间的一部分(“成果”)映射到屏幕上。许多注意事项都适用(标准化的设备坐标、透视划分等),但这就是其中的想法。

令您困惑的部分是被废弃的OpenGL API的遗物。您可以安全地忽略它,因为通常在恒等投影矩阵上应用gluFrustum(),所以doc中提到的乘法没有任何效果。

一种可能更容易理解的做事方法是:

代码语言:javascript
运行
复制
// 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。

至于函数的参数,最好用doc的这一部分来解释:

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

如果您不熟悉转换矩阵,我编写了一个教程这里;“投影矩阵”部分尤其应该对您有所帮助。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16803044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档