gluLookAt()在OpenGL中无效

时间:2019-07-12 12:26:11

标签: c++ opengl opengl-compat


我正在尝试使用gluLookAt()函数从另一侧看正方形。
使用该函数后,什么都没有改变,尽管我希望正方形的角会改变。
我将摄影机点设置在世界的最右边,并查看其中心,即正方形所在的位置。
他不得不向两侧伸展。为什么没有任何更改?

代码:

#include "includes.h"

using namespace std;

constexpr auto FPS_RATE = 60;
int windowHeight = 600, windowWidth = 600, windowDepth = 600;

void init();
void idleFunction();
void displayFunction();
double getTime();

double getTime()
{
    using Duration = std::chrono::duration<double>;
    return std::chrono::duration_cast<Duration>(
        std::chrono::high_resolution_clock::now().time_since_epoch()
        ).count();
}

const double frame_delay = 1.0 / FPS_RATE;
double last_render = 0;

void init()
{
    glutDisplayFunc(displayFunction);
    glutIdleFunc(idleFunction);
    glViewport(0, 0, windowWidth, windowHeight);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-windowWidth / 2, windowWidth / 2, -windowHeight / 2, windowHeight / 2, -windowDepth / 2, windowDepth / 2);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
}

void idleFunction()
{
    const double current_time = getTime();
    if ((current_time - last_render) > frame_delay)
    {
        last_render = current_time;
        glutPostRedisplay();
    }
}

void displayFunction()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glBegin(GL_POLYGON);
    gluLookAt(-300, 0, 0,
        0, 0, 0,
        0, 1, 0);
    glColor3f(1, 1, 1);
    glVertex3i(-150, 150, 0);
    glVertex3i(150, 150, 0);
    glVertex3i(150, -150, 0);
    glVertex3i(-150, -150, 0);
    glEnd();
    glutSwapBuffers();
}

int main(int argc, char* argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(windowWidth, windowHeight);
    glutInitWindowPosition((GetSystemMetrics(SM_CXSCREEN) - windowWidth) / 2, (GetSystemMetrics(SM_CYSCREEN) - windowHeight) / 2);
    glutCreateWindow("Window");
    init();
    glutMainLoop();
    return 0;
}

1 个答案:

答案 0 :(得分:4)

导致此问题的原因是,以glBegin / glEnd的顺序调用gluLookAt()。这是不允许的。您必须在gluLookAt之前致电glBegin
glBegin开始绘制图元后,仅允许指定顶点坐标(glVertex)并更改属性(例如glColorglTexCoord ...),直到绘制结束(glEnd)。
所有其他指令都将被忽略,并导致GL_INVALID_OPERATION错误(错误代码1282)。

还要注意,glLookAt没有设置当前矩阵。它定义一个矩阵,然后将当前矩阵乘以新矩阵。设置矩阵模式(glMatrixMode),并在gluLookAt之前通过Identity matrix设置glLoadIdentity

带有视图矩阵

  
gluLookAt(-300, 0, 0, 0, 0, 0, 0, 1, 0);

您想“看到”任何东西,因为通过该矩阵,视线沿x轴设置,并且您可以从侧面查看二维多边形。

请注意,多边形是2D对象。如果从正面,侧面(然后是一条线且不可见)或中间的方向看,则对象的大小会有所不同。 gluLookAt的前3个参数定义了视点,接下来的3个参数定义了您所看的点。从视点到观察点的向量是视线。

您可能想沿z轴看一下:

void displayFunction()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, -300, 0, 0, 0, 0, 1, 0);    

    glBegin(GL_POLYGON);
    glColor3f(1, 1, 1);
    glVertex3i(-150, 150, 0);
    glVertex3i(150, 150, 0);
    glVertex3i(150, -150, 0);
    glVertex3i(-150, -150, 0);
    glEnd();

    glutSwapBuffers();
}

您使用Orthographic (parallel) projection。如果使用Perspective projection,则当到视点的距离增加时,对象的投影大小将减小。透视投影可以通过gluPerspective进行设置。例如:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0, (double)windowWidth / windowHeight, 0.1, 600.0);