【问题标题】:OpenGL change background without changing perspective of previously drawn picturesOpenGL改变背景而不改变先前绘制的图片的视角
【发布时间】:2015-04-06 04:37:33
【问题描述】:

所以我画了一个“我”并使用 gluLookAt(0.f,0.f,3.f,0.f,0.f,0.f,0.f,1.f,0.f) , I 是中等大小。然后我添加了一个 drawScene() 函数,它用渐变颜色绘制背景,然后“我”变得超级大。我想这是因为我在 drawScene() 中将矩阵模式更改为 GL_PROJECTION 和 GL_MODELVIEW,而这些可能会改变视角?我想 glPushMatrix() 和 glPopMatrix() 需要保留矩阵状态,但我很难找到放置它们的位置。那么我怎样才能让“我”看起来正常大小呢?这是我的 drawI() 和 drawScene():

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();


}

非常感谢!

所以我从 drawScene() 和 drawI() 中取出 glMatrixMode() 和 glLoadIdentity() 并将它们放入 display() 中。我改了上面的drawScene()和drawI(),这里是我的display()

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();  
}

【问题讨论】:

  • 你没有给drawI打电话,而且你从来没有创建过除恒等式以外的投影矩阵?
  • 我在另一个名为 display() 的函数中调用了 drawScene() 和 drawI()。是的,我没有创建投影矩阵,这是为什么呢?抱歉,这个问题对于 OpenGL 来说可能很愚蠢
  • 我认为我们仍然需要查看调用这两个函数的代码,以了解您调用 gluLookAt 的方式和位置。
  • 我从辅助函数中取出 glMatrixMode() 和 glLoadIdentity 并在调用 drawScene() 和 drawI() 之前将它们放入 display() 中。

标签: opengl


【解决方案1】:

执行此操作的正常方法(在 3D 模式下)是在您的代码中,在您调用 drawI 或 drawScene 之前:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(fov, aspect, near, far); // fov is camera angle in degrees, aspect is width/height of your viewing area, near and far are your near and far clipping planes.

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

在您的 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 的相机位置、70.0 的 fov 和 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() 加载的矩阵。

【讨论】:

  • 非常感谢您的回答,我试过了,但我的“我”仍然填满了整个窗口,而不是远离并且看起来很小
  • 我已经编辑了我的代码,以便为您提供更多信息。诚然,我不使用 OpenGL 中的 2D。即使我在渲染 2D 图像,我也总是在 3D 中工作。为 2D 图像提供恒定的 Z 坐标很容易。
  • 我知道您可能不是 OS X 程序员,这可能对您来说有点难以理解,但是此站点上的视频“迁移到 OpenGl Core Profile”:@987654321 @ 将使您对现代 OpnenGL 编程有更深入的了解。
  • 如果你能搞定这一切,我们应该谈谈你如何设置远近剪裁平面。
猜你喜欢
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 2018-02-03
  • 2017-10-11
  • 1970-01-01
相关资源
最近更新 更多