Joh*_*idy 9 opengl projection perspective
我对透视投影感到困惑.
这是令我困惑的场景.我的frustrum的前平面基本上位于正z轴,背平面位于负轴,并沿着正z轴旋转大约几度.
现在,每当我通过示例时,我都会看到近平面和远平面都存在于负z轴上.
在这种情况下我的方法基本上是这样的:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustrum(-xval,+xval,-yval,+yval,-10,+10);
gluLookAt(); // some point lying on this axis of symmetry about the point
glMatrixMode(GL_MODELVIEW);
Run Code Online (Sandbox Code Playgroud)
所以,在上面的例子中,对于zie的负值和正值,我应该期待的行为是什么,在这种情况下为-10到+10.
视图体积定义了您实际看到的世界的多少,视图体积外的每个对象都不可见,并且内部的所有内容都可能是可见的(如果没有被前面的对象遮挡).
视图体积的形状由您使用的投影类型决定.
有两种类型的投影ortographic和透视投影.
Ortographic不考虑观察者的距离(不自然但对CAD软件等有用)和透视投影,其考虑到观察者的距离,因此更远的物体看起来更小.
在ortographic投影中,视图体积是立方体,并且在透视投影中,视图体积具有平截头体的形状(近剪切平面小于远剪切平面).
在任何一种情况下,视图体积的内容都"投射"到近剪裁平面上.
当然,这个过程比简单的projection_matrix乘法与视图体积中的每个顶点相关得多; 但它几乎在每本OpenGL相关书籍中都有解释.
该视图体积形状模型相机性能在一定程度上......你有多宽看到多远你看等.
该红皮书介绍了这口井在观赏烟花的篇章.
在谈论平截头体时,你暗示你正在使用透视投影.
要构造平截头体,您需要8个点,并且您通常希望构建对称平截头体,这简化了投影矩阵.
你不会直接手动指定8个点,而是使用诸如gluPerspective(fovy,aspect_ratio,near,far)之类的辅助方法 ,它们使用"更直观"的参数来构造平截头体; 它基本上是一个围绕glFrustum的包装器,它为你计算8个点,然后调用glFrustum而不是你.
对于OpenGL 3.0及更高版本,您将提供自己的gluPerspective实现,您可以简单地谷歌代码.
只需记住投影使3D成为2D.
关于观看,OpenGL使用右手坐标系(x轴指向左,y轴指向上,z轴指向屏幕外.); DirectX使用左手坐标系.
请记住,在3D空间中,您只有2个坐标系方向(左手和右手).
区别在于z轴的方向; 如果你使z轴向内指向它是一个左手系统,或者如果你把z指向外,它就是一个右手系统.
z轴的任何其他方向都不会使z轴垂直于x和y轴,因此您将没有坐标系.
用手确定正向旋转发生的方向等等.
您的相机位于原点(0,0,0),默认情况下朝向-z轴 ; 直到你不应用某种转换为止.
您的视锥体围绕观察方向构建,并且近剪裁平面位于距离最初位于原点的相机的z =附近.
当您指定glFrustum的near和far为正值时,您没有指定它们的z位置,因为相邻剪裁平面位于z = -near,因为相机沿负z轴的默认方向,并且因为相机是在原点(0,0,0)开始,你的近裁剪平面总是接近从又名摄像机位置的观众眼球的位置了.
每当您更改视图(更改摄像机位置或更改摄像机方向或两者)时,您的视锥体仍将"围绕新视图方向"并且近剪裁平面仍将"靠近"远离新摄像机位置.
希望你能得到这个概念.
Frustum定义了多少.
无论相机站在哪里并指向.
\n\n\n现在,每当我浏览示例时,我都会看到近平面和远平面都出现在 -ive z 轴上。
\n
当然。否则你会得到这样的东西
\n\n:
所有投影都相对于原点 0 进行。近和远确定剪裁平面距原点的距离。左和右定义平截头体与近平面的张角。如果将“近”平面和远平面放置在原点的相反方向上,则投影空间的形状会像沙漏一样。
\n\n\n\n\nRun Code Online (Sandbox Code Playgroud)\nglMatrixMode(GL_PROJECTION); \nglLoadIdentity();\nglFrustrum(-xval,+xval,-yval,+yval,-10,+10);\ngluLookAt(); // some point lying on this axis of symmetry about the point\nglMatrixMode(GL_MODELVIEW);\n
投影并不意味着放置视图。投影有点像虚拟相机的“镜头”。您可以使用它来倾斜和移动镜头并设置“焦距”。但这并不意味着“放置你的相机”。这应该通过模型视图矩阵发生。
\n\n\n\n\n那么,在上面的情况下,我应该期望 glFrustum 的行为是什么,在这种情况下 zie 的值为负值和正值 -10 到 +10。
\n
从远平面到“近”平面,物体在接近 0 时会变大,对于 Z=0,它们处于奇点并无限爆炸,然后接近近平面时它们会变小,但会反转,即绕Z轴旋转180\xc2\xb0,并且深度值被翻转,即通过深度测试进行深度排序将拒绝接近于0的片段。
\n