glFrustum函数有什么作用?

use*_*667 6 opengl graphics vector-graphics

根据MSDN,我们将当前矩阵与透视矩阵相乘.我们在这里讨论什么矩阵?也来自MSDN:

"glFrustum函数将当前矩阵乘以此矩阵,结果替换当前矩阵.即,如果M是当前矩阵而F是平截头体透视矩阵,则glFrustum将M替换为M•F".

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

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

请根据参数和概念说明您的答案.我真的很感激.

我正在尝试通过本教程学习openGL:http://www.youtube.com/watch?v = WDGF7Bw6SUg .它实际上并不是很好,因为它没有解释任何东西,或者它假设一个人知道openGL.我非常感谢教学链接,我非常感谢您的时间和回复!我相信我可以挣扎并解决问题.

use*_*321 12

你误解了它的含义.M是一个矩阵.M•F因此也是一个矩阵.它构造了一个透视矩阵.请参见本文为你想要它是如何构成,当使用一个解释glFrustum()gluPerspective():

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

剪切平面是切割世界各个部分的平面,因此不必渲染它们.平截头体描述了飞机在太空中的位置.它的边定义了视图体积.


Cal*_*602 9

glFrustum生成透视投影矩阵.

此矩阵将空间的一部分("fustum")映射到屏幕.许多警告适用(标准化设备坐标,透视分割等),但这就是主意.

困惑你的部分是已弃用的OpenGL API的遗留物.您可以放心地忽略它,因为通常您在身份投影矩阵上应用gluFrustum(),因此doc中提到的乘法无效.

可能更容易理解的做法是:

// 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果你不熟悉转换矩阵,我在这里写了一个教程; "投影矩阵"部分特别应该对您有所帮助.

  • 只是想说你的教程必须是我读过的矩阵变换的最佳描述.奖励! (2认同)