OpenGL帮助了解透视中的坐标

时间:2011-11-13 16:56:15

标签: c++ opengl

这让我很长一段时间感到沮丧 (几十个小时)在电脑前面谷歌,但我仍然 还没有解决它。我是openGL的新手,我开始阅读教程 在网上过去2-3个月以及试验一些代码。 我的主要问题是,当我从正投影投影转向透视 我一直在爆破如何在屏幕上管理和绘制一个简单的形状。我对矩阵知之甚少,但事实就是在Orthographic中 投影我指定对象的x,y,z坐标,那些是 窗口坐标。在透视中我还没有看到一个如何坐标的东西 适用。我已经看到范围从-1到1,甚至-20到20等。我读到你可以在openGL上指定坐标,但我应该怎么做呢? 在Orthographic中,我这样做:

窗口大小为800x600 我希望盒子成为整个窗口 所以,

glVertex2i( 0, 600 );
glVertex2i( 0, 0 );
glVertex2i( 800, 0 );
glVertex2i( 800, 600 );

但投影怎么样? 当我把它放在窗口的末尾,并且在开始时为-1。 opengl如何决定窗口的开始/结束以及为什么它为-1到1 ??? 如果有人能帮助我,我真的很感激,这真是令人困惑。 谢谢。

1 个答案:

答案 0 :(得分:1)

首先设置3D投影的投影和模型视图矩阵:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, ratio, near_clip, far_clip);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eyex, eyey, eyez, lookatx, lookaty, lookatz, upx, upy, upz);

gluLookAt需要3个向量,摄像机“眼睛”的位置,一个点和一个“向上矢量”。如果你调用gluLookAt(0.0,0.0,-10.0,0,0,0,0,1,0)这意味着摄像机位于0,0,-10并沿z轴看起源0,0,0并且“向上”沿着正y轴。如果你为一个四边形做一个简单的opengl绘制调用,它应该出现在你的渲染中:

glColor3f(1.0f,1.0f,1.0f); //set white color (or any contrast to your background)
glBegin(GL_QUADS);
    glVertex3f(-1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f, 1.0f, 0.0f);
    glVertex3f( 1.0f,-1.0f, 0.0f);
    glVertex3f(-1.0f,-1.0f, 0.0f);
glEnd();

您可以按顺时针或逆时针顺序绘制,但不能混合使用。您可以使用glEnable / Disable(GL_CULL_FACE)和glCullFace控制剔除。

  

窗口大小是800x600我希望盒子是整个窗口所以

使用2D投影(正交)时,您可以轻松设置坐标系的大小以匹配窗口/视口的大小。这不适用于3D投影,因为边界现在是3D viewing frustrum,或从近剪辑到远剪辑平面的3D体积。然后通过模型 - 视图 - 投影矩阵将坐标投影到2D表面上。您可以轻松输入宽度为800和高度为600的四边形坐标,但是为了看到它,您需要将相机移到远处以捕捉整个四边形。

引用评论:

  

gluPerspective(45.0f,(double)w /(double)h,1.0f,100.0f)应该设置一个near = 1和far = 100的透视图。但是因为openGL是右手的,所以正z是离屏幕这么近,应该是100和远1.为什么我会在不远处的每个教程中看到?它没有意义..

答案(见3D观看截头图上面的链接):

  

视锥体是相对于视口相机定位的场景中的3D体积。音量的形状会影响模型从相机空间投影到屏幕上的方式