Как мне всегда держать объект перед всем остальным в OpenGL?

У меня есть эта функция, которая рисует небольшую трехмерную систему координат оси в нижнем левом углу экрана, но в зависимости от того, что у меня передо мной, она может быть обрезана.

Например, я нарисовал равнину на земле на плоскости XZ при Y = 0. Камера расположена на Y = 1,75 (для имитации роста среднего человека). Если я смотрю вверх, он работает нормально, если я смотрю вниз, он попадает в плоскость заземления.

Глядя вверх: http://i.stack.imgur.com/Q0i6g.png
Глядя вниз: http://i.stack.imgur.com/D5LIx.png

Функция, которую я вызываю для рисования системы осей на углу, выглядит следующим образом:

void Axis3D::DrawCameraAxisSystem(float radius, float height, const Vector3D rotation) {
    if(vpHeight == 0) vpHeight = 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, vpWidth, vpHeight);
    gluPerspective(45.0f, 1.0 * vpWidth / vpHeight, 1.0f, 5.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -3.0f);

    glRotatef(-rotation.x, 1.0f, 0.0f, 0.0f);
    glRotatef(-rotation.y, 0.0f, 1.0f, 0.0f);

    DrawAxisSystem(radius, height);
}

Теперь пара основных функций, которые я считаю актуальными. к проблеме:

glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);

void changeSize(int width, int height) {
    if(height == 0) height = 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glViewport(0, 0, width, height);

    gluPerspective(60.0f, 1.0 * width / height, 1.0f, 1000.0f);

    glMatrixMode(GL_MODELVIEW);
}

void renderScene(void) {
    glClearColor(0.7f, 0.7f, 0.7f, 0.0f);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    changeSize(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT));

    glLoadIdentity();

    SceneCamera.Move(CameraDirection, elapsedTime);
    SceneCamera.LookAt();

    SceneAxis.DrawCameraAxisSystem(0.03f, 0.8f, SceneCamera.GetRotationAngles());

    glutSwapBuffers();
}

Предложения?

7
задан Ricardo Amaral 3 April 2011 в 00:02
поделиться