2015-04-21 84 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)爲金字塔將導致雙方被吸入訂單,這將是奇怪的和非物理。

相關問題