使用OpenGL进行正交投影以及如何在太空中实现相机或物体的运动

时间:2013-11-27 16:13:19

标签: c opengl glut

我使用GL_POLYGON创建了一个带有显示列表的立方体。我已经在(0,0,0)中的坐标原点初始化它。在我的显示函数中,在glutDisplayFunc中调用我使用代码:< / p>

glLoadIdentity();
glOrtho(0,0,0,0,1,1);
glMatrixMode(GL_MODELVIEW);

我想使用glOrtho.Well使用正交投影,我的问题是:考虑到我的窗口大小为600x600,我仍然可以看到我的立方体是否正常?

更重要的是,我想了解如何使用相对的OpenGL函数移动我的立方体或相机的一些指导。让我说我想将相机移回(到z轴)或我的立方体移到前面(到 - z轴)。我该怎么做?

1 个答案:

答案 0 :(得分:2)

在您致电glMatrixMode()之前,首先还需要将GL_PROJECTION设置为glOrtho(),所以它看起来会像这样。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(...); // Replace ... with your values

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

要移动方向,您只需调用以下一项或多项功能即可。

您可以单击上面的链接来阅读每个功能的工作方式和内容。但基本上是:

  • glTranslate*()翻译/移动当前选定的矩阵。
  • glRotate*()旋转当前选定的矩阵。
  • glScale*()缩放当前选定的矩阵。

您还可以使用glPushMatrix()glPopMatrix()来推送和弹出当前的矩阵堆栈。


附加

还要注意您使用旧的和已弃用的功能。您不应该使用它们,而是现在假设您要计算并创建自己的矩阵堆栈。


修改

相机&amp;对象

基本上你通过组合上述功能来做到这一点。它实际上可能听起来更难。

我将创建一个1个摄像头和2个对象的示例,基本上是为了让您了解它是如何工作的。

void render()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    // The Camera Rotations & Translation
    glRotatef(camera_pitch, -1f, 0f, 0f);
    glRotatef(camera_yaw, 0f, 1f, 0f);
    glTranslate(-camera_x, -camera_y, -camera_z);

    // Object 1
    glPushMatrix();
        glRotatef(...);
        glTranslate(...);

        // Render Object 1
    glPopMatrix();

    // Object 2
    glPushMatrix();
        glRotatef(...);
        glTranslate(...);

        // Render Object 2
    glPopMatrix();
}

再次用您自己的值替换....

需要消除相机坐标的原因是因为为什么移动相机,我们实际上是“推”(翻译等)远离相机/中心的所有东西(从而相机始终处于中心位置。)

重要您旋转的顺序,然后翻译或翻译然后旋转,这很重要。当需要进行相机变换时,您需要旋转然后进行平移。


修改

gluLookAt?

gluLookAt 100%相同,就像在我的例子中一样。

示例:

// The Camera Rotations & Translation
glRotatef(camera_pitch, -1f, 0f, 0f);
glRotatef(camera_yaw, 0f, 1f, 0f);
glTranslate(-camera_x, -camera_y, -camera_z);

这是我自己的功能,与gluLookAt完全相同。 我怎么知道?因为我查看了原来的gluLookAt函数,然后我做了以下函数。

void lookAt(float eyex, float eyey, float eyez, float centerx, float centery, float centerz)
{
    float dx = eyex - centerx;
    float dy = eyey - centery;
    float dz = eyez - centerz;

    float pitch = (float) Math.atan2(dy, Math.sqrt(dx * dx + dz * dz));
    float yaw = (float) Math.atan2(dz, dx);

    pitch = -pitch;
    yaw = yaw - 1.57079633f;

    // Here you could call glLoadIdentity() if you want to reset the matrix
    // glLoadIdentity();

    glRotatef(Math.toDegrees(pitch), -1f, 0f, 0f);
    glRotatef(Math.toDegrees(yaw), 0f, 1f, 0f);
    glTranslatef(-eyex, -eyey, -eyez);
}

您可能需要更改Math.*次来电,因为上述代码不是用C语言编写的。