2015-04-21 53 views
2

我遇到了我的OpenGL程序问题。我绘制了三个轴Ox,Oy和Oz,以及四个位于轴上的金字塔。当我旋转形状时,轴应该是可见的,但它们被四个三角形隐藏。我能做些什么来看轴?OpenGL线被其他对象隐藏

#include <iostream> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

using namespace std; 

float x_angle, y_angle, z_angle; 

void init() { 

    x_angle = y_angle = z_angle = 0; 

    glClearColor(0.0, 0.0, 0.0, 0.0); 
    glEnable(GL_DEPTH_TEST); 

} 

void color3f(GLfloat red, GLfloat green, GLfloat blue) { 
    glColor3f(red/255, green/255, blue/255); 
} 

void drawLine(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2, GLfloat red, GLfloat green, GLfloat blue) { 

    color3f(red, green, blue); 
    glBegin(GL_LINES); 
    glVertex3f(x1, y1, z1); 
    glVertex3f(x2, y2, z2); 
    glEnd(); 

} 

void drawTriangle(GLfloat x1, GLfloat y1, GLfloat z1, GLfloat x2, GLfloat y2, GLfloat z2, GLfloat x3, GLfloat y3, GLfloat z3, GLfloat red, GLfloat green, GLfloat blue) { 

    color3f(red, green, blue); 
    glBegin(GL_TRIANGLES); 
    glVertex3f(x1, y1, z1); 
    glVertex3f(x2, y2, z2); 
    glVertex3f(x3, y3, z3); 
    glEnd(); 
} 

{ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

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

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-15.0, 15.0, -15.0, 15.0, -15.0, 15.0); 
    glViewport(100, 100, 500, 500); 

    glRotatef(x_angle, 1.0, 0.0, 0.0); 
    glRotatef(y_angle, 0.0, 1.0, 0.0); 
    glRotatef(z_angle, 0.0, 0.0, 1.0); 

    glPointSize(10.0); 
    drawLine(-10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 255.0, 0.0, 0.0); 
    drawLine(0.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 255.0, 0.0); 
    drawLine(0.0, 0.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 255.0); 

    // draw pyramid 
    drawTriangle(0.0, 5.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 5.0, 255, 255, 255); 
    drawTriangle(0.0, 5.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, -5.0, 0, 255, 204); 
    drawTriangle(0.0, 5.0, 0.0, -5.0, 0.0, 0.0, 0.0, 0.0, -5.0, 102, 102, 255); 
    drawTriangle(0.0, 5.0, 0.0, -5.0, 0.0, 0.0, 0.0, 0.0, 5.0, 255, 255, 0); 
    glFlush(); 
} 

void onKeyPressed(unsigned char key, int a, int b) { 
    switch (key) { 
    case 'x': 
     x_angle -= 3; 
     break; 
    case 'X': 
     x_angle += 3; 
     break; 
    case 'y': 
     y_angle -= 3; 
     break; 
    case 'Y': 
     y_angle += 3; 
     break; 
    case 'z': 
     z_angle -= 3; 
     break; 
    case 'Z': 
     z_angle += 3; 
     break; 
    default: 
     break; 
    } 

    display(); 
} 


int main(int argv, char** argc) { 

    glutInit(&argv, argc); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(800, 800); 
    glutCreateWindow("3D program"); 

    init(); 
    glutKeyboardFunc(onKeyPressed); 
    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

这是结果 enter image description here

,而它应该是这样的 enter image description here

+0

上次绘制它,深度测试禁用? – Borgleader

+0

我是OpenGL的新手,所以我需要做什么? –

回答

0

我通过移动函数更改了我的代码glEnable(GL_DEPTH_TEST);的init()功能的main()这样

int main(int argv, char** argc) { 

glutInit(&argv, argc); 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowPosition(100, 100); 
glutInitWindowSize(800, 800); 
glutCreateWindow("3D program"); 
glEnable(GL_DEPTH_TEST); 

glutKeyboardFunc(onKeyPressed); 
glutDisplayFunc(display); 
glutMainLoop(); 

init(); 

return 0; 
} 

功能之后,该程序的工作就像我的预期。我不知道这是为什么起作用。但是,感谢您的帮助。

1

可以通过删除关于深度缓冲的 glEnable(GL_DEPTH_TEST)

的更多信息:https://www.opengl.org/wiki/Depth_Buffer

+0

我试过了,但它不起作用:( –

+0

你还需要确保你的framebuffer有一个深度缓冲区,你必须通过'glutInitDisplayMode()'GLOV_DEPTH'标志来请求它' – derhass

+0

我已经完成了但没有没有结果 –

1

我不认为你在答案中提到的修复工作;你可能改变了一些其他的东西,但没有意识到它有效果。这是你的显示功能的更好,工作版本:

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

    glEnable(GL_DEPTH_TEST); 

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

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-15.0, 15.0, -15.0, 15.0, -15.0, 15.0); 
    glViewport(100, 100, 500, 500); 

    glRotatef(x_angle, 1.0, 0.0, 0.0); 
    glRotatef(y_angle, 0.0, 1.0, 0.0); 
    glRotatef(z_angle, 0.0, 0.0, 1.0); 

    // draw pyramid 
    drawTriangle(0.0, 5.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 5.0, 255, 255, 255); 
    drawTriangle(0.0, 5.0, 0.0, 0.0, 0.0, -5.0, 5.0, 0.0, 0.0, 0, 255, 204); 
    drawTriangle(0.0, 5.0, 0.0, -5.0, 0.0, 0.0, 0.0, 0.0, -5.0, 102, 102, 255); 
    drawTriangle(0.0, 5.0, 0.0, 0.0, 0.0, 5.0, -5.0, 0.0, 0.0, 255, 255, 0); 

    glDisable(GL_DEPTH_TEST); 
    glPointSize(10.0); 
    drawLine(-10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 255.0, 0.0, 0.0); 
    drawLine(0.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 255.0, 0.0); 
    drawLine(0.0, 0.0, -10.0, 0.0, 0.0, 10.0, 0.0, 0.0, 255.0); 

    glFlush(); 
} 
  1. 正如你已经想通了,请确保您提供GLUT_DEPTH显示模式。
  2. 确保深度测试是对金字塔
  3. 确保它是关闭的线路
  4. 绘制线条后的金字塔,这样他们就会在它上面绘制。没有深度测试,事情就会按照它们发送的顺序依次排列。
  5. 对于奖励积分,我重新安排了金字塔的顶点顺序,以使它始终保持CCW。现在如果你做glEnable(GL_CULL_FACE),你只能从外面看到金字塔。

未能使用GLUT_DEPTHglEnable(GL_DEPTH_TEST)为金字塔将导致双方被吸入订单,这将是奇怪的和非物理。