Opengl glFrustum函数的作用是什么?

Opengl glFrustum函数的作用是什么?,opengl,graphics,vector-graphics,Opengl,Graphics,Vector Graphics,根据MSDN,我们将当前矩阵与透视矩阵相乘。我们在说什么矩阵?同样来自MSDN: glFrustum函数将当前矩阵乘以此矩阵,结果替换当前矩阵。也就是说,如果M是当前矩阵,F是平截头透视矩阵,则glFrustum将M替换为M•F 现在,根据我目前的12级微积分知识(我现在在这里),M是一个向量,M点积F返回一个标量,那么如何用标量替换向量呢 我也不确定什么是“剪裁”平面,以及如何通过一个浮点值引用它们 请用参数和概念来表达你的答案。我真的很感激 我正试图通过本教程学习openGL:。它实际上不是

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

glFrustum函数将当前矩阵乘以此矩阵,结果替换当前矩阵。也就是说,如果M是当前矩阵,F是平截头透视矩阵,则glFrustum将M替换为M•F

现在,根据我目前的12级微积分知识(我现在在这里),M是一个向量,M点积F返回一个标量,那么如何用标量替换向量呢

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

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


我正试图通过本教程学习openGL:。它实际上不是很好,因为它没有解释任何东西,或者它假设一个人知道openGL。我真的很感谢你给我一个教程的链接,否则,我真的很感谢你的时间和回复!我相信我能克服困难,解决问题。

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

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


剪裁平面是剪切世界部分的平面,因此它们不必渲染。平截头体描述了平面在空间中的位置。其侧面定义了视图体积。

glFrustum
生成透视投影矩阵

该矩阵将一部分空间(“视锥体”)映射到屏幕上。有很多注意事项(标准化的设备坐标、透视图划分等),但这就是想法

让您困惑的部分是不推荐使用的OpenGL API的遗留部分。您可以放心地忽略它,因为通常您会对单位投影矩阵应用
gludrustum()
,因此文档中提到的乘法没有任何效果

也许更容易理解的做事方式是:

// 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
投影矩阵:45°视场,4:3比率,显示范围:0.1单位100单位 glm::mat4投影=glm::透视图(45.0f、4.0f/3.0f、0.1f、100.0f); //或者,对于正交摄影机: //glm::mat4投影=glm::正交(-10.0f,10.0f,-10.0f,10.0f,0.0f,100.0f);//在世界坐标中 //摄像机矩阵 glm::mat4视图=glm::注视( vec3(4,3,3),//摄像机位于(4,3,3),在世界空间中 glm::vec3(0,0,0),//并查看原点 glm::vec3(0,1,0)//头部向上(设置为0,-1,0以倒置) ); //模型矩阵:标识矩阵(模型将位于原点) glm::mat4模型=glm::mat4(1.0f); //我们的ModelViewProjection:3个矩阵的乘法 glm::mat4 MVP=投影*视图*模型;//记住,矩阵乘法是另一种方法 在这里,我使用了
glm::perspective
(相当于老式的glupperspective()),但您也可以使用gluprustum

关于函数的参数,文档的这一部分对其进行了最好的解释:

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


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

“它实际上不是很好,因为它没有解释任何东西,或者假设您了解openGL。”那么,您为什么要使用自己承认不好的教程呢?你可以在谷歌上搜索“OpenGL教程”并找到更好的东西。谢谢你的建议。我们这周实际上在学习矩阵。我会回来重读定义并给出最好的答案!我只是想说你的教程一定是我读过的关于矩阵变换的最好的描述。荣誉