Opengl glFrustum函数的作用是什么?
根据MSDN,我们将当前矩阵与透视矩阵相乘。我们在说什么矩阵?同样来自MSDN: glFrustum函数将当前矩阵乘以此矩阵,结果替换当前矩阵。也就是说,如果M是当前矩阵,F是平截头透视矩阵,则glFrustum将M替换为M•F 现在,根据我目前的12级微积分知识(我现在在这里),M是一个向量,M点积F返回一个标量,那么如何用标量替换向量呢 我也不确定什么是“剪裁”平面,以及如何通过一个浮点值引用它们 请用参数和概念来表达你的答案。我真的很感激Opengl glFrustum函数的作用是什么?,opengl,graphics,vector-graphics,Opengl,Graphics,Vector Graphics,根据MSDN,我们将当前矩阵与透视矩阵相乘。我们在说什么矩阵?同样来自MSDN: glFrustum函数将当前矩阵乘以此矩阵,结果替换当前矩阵。也就是说,如果M是当前矩阵,F是平截头透视矩阵,则glFrustum将M替换为M•F 现在,根据我目前的12级微积分知识(我现在在这里),M是一个向量,M点积F返回一个标量,那么如何用标量替换向量呢 我也不确定什么是“剪裁”平面,以及如何通过一个浮点值引用它们 请用参数和概念来表达你的答案。我真的很感激 我正试图通过本教程学习openGL:。它实际上不是
我正试图通过本教程学习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教程”并找到更好的东西。谢谢你的建议。我们这周实际上在学习矩阵。我会回来重读定义并给出最好的答案!我只是想说你的教程一定是我读过的关于矩阵变换的最好的描述。荣誉