我想确定opengl中相机的坐标是什么。 所以我只是在窗口中绘制一个球体,代码是这样的:
glutSolidSphere (1.0, 20, 16); //draw a sphere, its radius is 1
//I use glOrtho to set the x,y coordinate
//1
glOrtho(-1,1,-1,1,-0.99,-1.0);
//2
glOrtho(-1,1,-1,1,-1.0,-0.99);
//3
glOrtho(-1,1,-1,1,1.0,0.99);
//5
glOrtho(-1,1,-1,1,1.0,1.0);
//6
glOrtho(-1,1,-1,1,10,10);
//7
glOrtho(-1,1,-1,1,0.0,0.0);
//8
glOrtho(-1,1,-1,1,-0.5,0.5);
//9
//glOrtho(-1,1,-1,1,0.0,0.1);
在案例1,2,3,4中,图片如下: a small circle
在案例5,6,7中,球体大小相同 窗户。
在案例8中,图片如下: like a torus,strange
根据glOrtho描述:
void glOrtho( GLdouble left,
GLdouble right,
GLdouble bottom,
GLdouble top,
GLdouble nearVal,
GLdouble farVal);
假设摄像机的坐标固定在opengl中。 从案例1开始,似乎相机处于(0,0,0);
1)但如果那时,案例2,3,4如何与案例1相同?
2)案例5,6,7如何出来?
3)案例8如何出来?
答案 0 :(得分:3)
你好像混淆了几件事。
从概念上讲,默认的glOrtho
和glFrustum()/gluPerspecitve()
函数假定相机处于眼睛空间原点并且看向负z
方向。如果您已将ModelView矩阵保留为idendity(默认值),则表示您的对象空间与眼睛空间相同,因此您直接在眼睛空间中绘图。
OpenGL定义了一个三维观看量。这意味着您的视口/窗口大小不仅限制了2D矩形,而且还有芦荟近和远剪裁平面。该查看体积在_normalized设备坐标中被描述为轴对齐的立方体-1 <= x,y,z <= 1
。
投影矩阵的目的是转换一些
查看该规范化多维数据集的卷。使用正交投影,将没有透视效果。远处的物体看起来不会变小。因此,您可以将ortho矩阵解释为在眼睛空间中定义轴对齐的长方体,这定义了屏幕上可见的空间部分。请注意,您可以设置该投影,以便可以看到实际位于“相机”背后的内容(使用near
或far
的相关值。)
您的案例1-4看起来完全相同,因为您只删除了一小部分z in [0.99, 1]
或z in [-1, -0.99]
。与球体的交点将仅显示为光盘。如果你翻转范围并不重要,因为它只会翻转前面或后面的内容。没有灯光,你基本上只看到了silhuette,所以你看不出差异。
您的案例5,6和7只是无效,参数near
和far
必须不相同。该代码将只生成GL错误并且根本不创建正交矩阵,这意味着投影矩阵保留为标识 - 然后,您可以获得[-1,1] ^ 3查看量。由于您绘制的半径为1的球体位于原点的中心,因此它将完全适合。
案例8只是-0.5 <= z <= 0.5
内的一个切口,即交叉点。