2017-02-15 18 views
0

我想在OpenGL C++中創建一個具有在運行時顯示立方體三面的項目。沒有旋轉需要看到三面。我對OpenGL很陌生,現在我的攻擊計劃一直在改變x,y和z值。我很好的在2D工作,但添加Z混合是我認爲讓我絆倒。我知道使用負值會使圖像更接近相機並且更遠離正面,但在我的代碼中,當我更改Z值時,它對該對象沒有任何影響。創建一個3D立方體,在運行時顯示三條邊,不旋轉看所有三條邊

我只在前面和右側顯示(運行),試圖在繪製整個多維數據集之前先將這2個窗口置於窗口的正確位置。最初我以0.5或-0.5的比例將它們畫出來,但只在屏幕上產生一個矩形。

所以我的主要問題是,是否有更簡單的方法來預測每個頂點的行爲?是的,我知道我在圖形空間工作,但爲什麼當價值改變時,我的一些觀點甚至不動?

#ifdef __APPLE__ 
#include <GLUT/glut.h> 
#else 
#include <GL/glut.h> 
#endif 
#include <stdlib.h> //For exit function 

void exit(int); //To Exit Program 

void init(void) 
{ 
    glClearColor (0.0, 0.0, 0.0, 1.0); 
    glColor3f(1.0, 1.0, 1.0); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
} 


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

    glBegin(GL_QUADS); 

    glColor3f(1.0, 0.0, 0.0);  glVertex3f( 0.2, -0.3, -0.5);  // P1 is red lb 
    glColor3f(0.0, 1.0, 0.0);  glVertex3f( 0.3, 0.2, -0.5);  // P2 is green lt 
    glColor3f(0.0, 0.0, 1.0);  glVertex3f(-0.2, 0.3, -0.5);  // P3 is blue tt 
    glColor3f(1.0, 0.0, 1.0);  glVertex3f(-0.3, -0.2, -0.5);  // P4 is purple tb 

    glEnd(); 

// Green side - LEFT 
    glBegin(GL_QUADS); 
    glColor3f(0.0, 1.0, 0.0); 
    glVertex3f(-0.2, -0.3, 0.5); 
    glVertex3f(-0.3, 0.2, 0.5); 
    glVertex3f(-0.2, 0.3, -0.5); 
    glVertex3f(-0.3, -0.2, -0.5); 
    glEnd(); 

    glFlush(); 

} 

void myKeyboard(unsigned char theKey, int mouseX, int mouseY) 
{ 
    switch(theKey) 
    { 
     case 'Q': 
     case 'q': 
      exit(-1); //terminate the program 
     default: 
      break; // do nothing 

    } 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(640,480); 
    glutInitWindowPosition(100,150); 
    glutCreateWindow("Shapes: Q or q to quit"); 
    glutDisplayFunc(cube); 

    glutKeyboardFunc(myKeyboard); 

    init(); 
    glEnable(GL_DEPTH_TEST); 
    glutMainLoop(); 
} 

回答

0

問題不在於頂點的行爲,而在於您使用的是正投影而不是透視圖。如果你想繼續使用古老的OpenGL,gluPerspective是你想要的,而不是glOrtho。如果你想移動到更現代的OpenGL,所有的矩陣數學函數都將被刪除,所以你必須使用像glm這樣的庫來完成你所有的數學運算。

由於在正交投影中平行線保持平行,所以沒有水平點或任何東西,因此產生了矩形。如果它位於或平行於矩形正面的邊緣,則看不到它。透視投影更貼近地匹配攝像機如何看待世界,並行點最終會聚在遠處。

想想這個的好方法是考慮一段非常長的直線鐵軌。在正交投影中,你會看到兩個導軌永遠持續直線。在透視投影中,您最終會看到兩條導軌在距離的一個點上相遇,並且還能夠部分看到導軌的內邊緣。

+0

這是很好的方式來說,這有力地幫助我更多地理解它。不幸的是,現在這是一個學校任務,我的教授只讓我們使用glOrtho來完成作業。在尋找幫助的研究中,我發現大多數人使用數組來創建他們的立方體。我想這就是爲什麼我很難找到幫助,因爲沒有人使用過時的版本 – csm60

+0

是的,即時模式被頂點數組取代,比如1995年左右。恥辱,大多數計算機圖形學課程仍然會這樣教。 –

+0

如果這是隻能通過glOrtho完成的任務,那麼可能還有其他的東西丟失了。默認情況下,頂點的背面將被剔除。背面由順時針或逆時針指定頂點的順序決定。您可以禁用剔除,將前臉切換到另一個方向,或者確保所有四邊形均按正確的順序指定。更多詳情:https://www.khronos.org/opengl/wiki/Face_Culling –