2015-02-06 50 views
0

因此,我绘制'I'并使用gluLookAt(0.f,0.f,3.f,0.f,0.f,0.f,0。 f,1.f,0.f),而我的尺寸适中。然后我添加一个drawScene()函数,用渐变颜色绘制背景,然后'I'变得超大。我想这是因为我在drawScene()中将矩阵模式更改为GL_PROJECTION和GL_MODELVIEW,并且这些更改了透视图吗?我猜glPushMatrix()和glPopMatrix()需要保留矩阵状态,但我很难找到把它们放在哪里。那么我怎样才能让'我'看起来正常?这里是我的drawI()和drawScene():OpenGL改变背景而不改变先前绘制的图片的视角

void drawI(int format) 
{ 
    glBegin(format); 
    glColor3f(0, 0, 1); 
    glVertex2f(point[3][0], point[3][1]); 
    glVertex2f(point[2][0], point[2][1]); 
    glVertex2f(point[1][0], point[1][1]); 
    glVertex2f(point[12][0], point[12][1]); 
    glVertex2f(point[10][0], point[10][1]); 
    glEnd(); 

    glBegin(format); 
    glVertex2f(point[10][0], point[10][1]); 
    glVertex2f(point[11][0], point[11][1]); 
    glVertex2f(point[12][0], point[12][1]); 
    glEnd(); 

    glBegin(format); 
    glVertex2f(point[9][0], point[9][1]); 
    glVertex2f(point[10][0], point[10][1]); 
    glVertex2f(point[3][0], point[3][1]); 
    glVertex2f(point[4][0], point[4][1]); 
    glVertex2f(point[6][0], point[6][1]); 
    glColor3f(1, 0.5, 0); 
    glVertex2f(point[7][0], point[7][1]); 
    glVertex2f(point[8][0], point[8][1]); 
    glEnd(); 

    glBegin(format); 
    glColor3f(0, 0, 1); 
    glVertex2f(point[5][0], point[5][1]); 
    glVertex2f(point[6][0], point[6][1]); 
    glVertex2f(point[4][0], point[4][1]); 
    glEnd(); 

} 

void drawScene() 
{ 
    glBegin(GL_QUADS); 
    //red color 
    glColor3f(1.0,0.0,0.0); 
    glVertex2f(-1.0,-1.0); 
    glVertex2f(1.0,-1.0); 
    //blue color 
    glColor3f(0.0,0.0,1.0); 
    glVertex2f(1.0, 1.0); 
    glVertex2f(-1.0, 1.0); 
    glEnd(); 


} 

非常感谢!

因此,我将glMatrixMode()和glLoadIdentity()从drawScene()和drawI()中提取出来放到display()中。我改变drawScene函数()和drawI()以上的,这里是我的显示器()

void display() 
{  
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(70.f,1.f,0.001f,30.f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 


    drawScene(); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    gluLookAt(0.f,0.f,3.f,0.f,0.f,0.f,0.f,1.f,0.f); 

    drawI(GL_TRIANGLE_FAN); 

    glutSwapBuffers(); 
} 
+0

你没有调用'drawI',你永远不会创建一个投影矩阵以外的身份? – Tommy 2015-02-06 05:17:48

+0

我在另一个名为display()的函数中调用了drawScene(),然后调用了drawI()。是的,我没有创建投影矩阵,这是为什么?对不起,这个问题可能是愚蠢的新的OpenGL – user3799934 2015-02-06 05:39:50

+0

我认为我们仍然需要看到调用这两个函数的代码,看看你如何以及在哪里调用gluLookAt。 – jwlaughton 2015-02-06 06:11:11

回答

0

正常的方式做到这一点(在3D模式)在你的代码,你叫drawI或drawScene函数会之前:

​​

在你的2D渲染,你可能不需要调用gluPerspective,但这些电话应该在你的代码中调用drawI或drawScene函数之前完成。执行此操作并从drawI和drawScene中删除glMatrixMode()和glLoadIdentity()调用。

编辑:

如果你的“我”还是太大,有许多事情可以做,但你或许应该以3D工作(给为Z也坐标)。

你可以缩放对象:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(0.0,0.0,3.0,0.0,0.0,0.0,0.0,1.0,0.0) 
glScalef(0.5, 0.5, 0.5); 

你可以继续移动相机,(你需要包括gluPerspective()调用以及):

gluLookAt(0.0,0.0,50.0,0.0,0.0,0.0,0.0,1.0,0.0); 

也许最简单的在3D模式下控制渲染图像大小的方法是将摄像头(眼睛)向后移动一次,然后通过改变摄像头的光圈角度(gluPerspective()调用中的fov)来控制图像大小。更宽的fov会缩小渲染的图像;较小的fov会放大它。

我不知道你的坐标值在drawI中,因为它们是变量,但相机位置为3.0,fov为70.0,方位为1应为左,右,上和下在Z = 0处约+/- 2.1的裁剪平面。

如果您保持其他所有条件相同并将相机移至50.0,则裁剪平面大约在+/- 35.0,因此您的“I”会占据观看区域的一小部分。

如果您然后将相机位置保持在50.0,但将fov更改为40.0,则剪切平面将在+/- 18.2左右。你的“I”会比cameraZ = 50.0,fov = 70.0更大,但比cameraZ = 3.0更小,fov = 70.0。

您可以使用相机位置和fov进行播放以获得所需的图像尺寸,或者您可以缩放图像。我喜欢保持相机位置不变并改变fov。如果我提供一个基于用户输入(可能是鼠标滚动)来改变fov的函数,这是一种提供放大/缩小效果的好方法。

顺便说一句,在你的原代码,如果你叫:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(0.0,0.0,3.0,0.0,0.0,0.0,0.0,1.0,0.0) 

再后来在DrawI或drawScene函数调用:

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

你看不上你更早gluLookAt调用加载的矩阵()。

+0

非常感谢您的回答,我尝试了这个,但是我的“我”仍然填满了整个窗口,而不是很远,看起来很小 – user3799934 2015-02-06 22:52:22

+0

我编辑了我的代码以提供更多信息。无可否认,我在OpenGL中不能使用2D;即使我正在渲染2D图像,我也总是用3D工作。为2D图像提供恒定的Z坐标是很容易的。 – jwlaughton 2015-02-07 08:46:26

+0

我知道你可能不是OS X程序员,这可能对你有点消化,但在这个网站上的视频“迁移到OpenGl Core Profile”:https://developer.apple.com/opengl /会让你更深入地了解现代OpnenGL编程。 – jwlaughton 2015-02-07 17:32:28