8

根据 MSDN,我们将当前矩阵与透视矩阵相乘。我们在这里谈论的是什么矩阵?同样来自 MSDN:

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

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

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

请根据参数和概念来表达您的答案。我真的很感激。

我正在尝试通过本教程学习 openGL:http ://www.youtube.com/watch?v=WdGF7Bw6SUg 。它实际上并不是很好,因为它什么也没解释,或者它假设一个人知道 openGL。我真的很感激一个教程的链接,否则我真的很感激你的时间和回复!我相信我可以努力解决问题。

4

2 回答 2

14

你误解了它在说什么。M是一个矩阵。M•F 因此也是一个矩阵。它构造了一个透视矩阵。有关它的构造方式以及何时要使用vs.的说明,请参阅本文glFrustum()gluPerspective()

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

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

于 2013-05-29T00:57:01.097 回答
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。

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

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

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

于 2013-05-29T10:34:40.230 回答