2014-04-17 20 views
0

我試圖顯示特定體積的空間,從10,10,10到30,30,30的立方體。一切從我讀,我會做到這一點,像這樣:如何設置在opengl中顯示的體積

glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(10, 30, 10, 30, 10, 30); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(30.0f, 30.0f, 30.0f, 
    20.0f, 20.0f, 20.0f, 
    0.0f, 1.0f, 0.0f); 

glColor3f(0.0, 0.0, 0.0); //color = black 
glPushMatrix();    
    glTranslated(20,20,20); 
    glutSolidSphere(.3, 50, 50); 
glPopMatrix(); 

glOrtho套了一下音量,我可以看到,和gluLookAt說,相機是30,30,30,並指出在20,20, 20。但這不起作用。隨着一些幫助和一些玩耍,我設法得到這個工作,與此代碼:

glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(10, 30, 10, 30, -1000, 1000); //CHANGED THESE BOUNDS 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslated(20,20,20);    //ADDED THIS LINE 
gluLookAt(30.0f, 30.0f, 30.0f, 
    20.0f, 20.0f, 20.0f, 
    0.0f, 1.0f, 0.0f); 


glPushMatrix();    
    glTranslated(20,20,20); 
    glutSolidSphere(.3, 50, 50); 
glPopMatrix(); 

爲什麼我需要這些更改?爲什麼代碼的第一個版本不起作用?

回答

2

此代碼

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(10, 30, 10, 30, 10, 30); 

將建立一個矩陣,其將改變長方體X = [10,30],Y = [10,30],並且z = [-10,-30],將[-1,1]^3剪輯空間量(這是OpenGL的觀看量)。請注意這裏的負號。

此代碼

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(30.0f, 30.0f, 30.0f, 
    20.0f, 20.0f, 20.0f, 
    0.0f, 1.0f, 0.0f); 

設立的所有對象(-30 ,. -30,-30)和一些旋轉平移尋找到你所指定的方向。

兩個矩陣將被應用,首先ModelView進入眼的空間,比Projection基質進入夾的空間。所以現在,如果你想從全球「世界空間」的角度思考,你最終會得到一個20單位寬,高和深的觀看音量,但卻存在一個你並沒有真正期待的地方。它將在你設置的視圖方向軸上開始10個單位後面的。也可以沿照相機的本地x軸和y軸移動 - 您指定的相機看點不會在屏幕上結束。

如果你只是想在[10,30]^3的收視體積,你可以簡單地使用

glOrtho(10, 30, 10, 30, -10, -30); 

刪除gluLookAt()產品總數。這至少適用於簡單的情況,但它可能會使燈光和霧氣失效,因爲「相機」現在處於原始狀態。您可能想要設置一些對稱的觀看音量,以便您實際上可以擁有任何理智的相機設置。

EDIT

爲了使事情更加清楚:你在投影矩陣限定的觀看體積定義相對在該設置的視圖變換。所以,你可能會爲examle想尺寸20x20x20,在您觀看軸位於porjection中心的觀察空間,以及showung其直接位於鏡頭前體積:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-10, 10, -10, 10, 0, 20); 

現在你可以像以前一樣設置您的相機位置: glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(30.0f,30.0f,30.0f, 20.0f,20.0f,20.0f, 0.0f,1.0f,0。0F);

現在,點(20,20,20)(您繪製球體的位置)將實際投影到屏幕的中心。然而,它將不在觀察的中心,因爲它沿着當前觀察軸的範圍從0到20個單位,但是(20,20,20)距離當前攝像機位置(30,20)的距離是17.32個單位, 30,30)。因此,您可以將相機設置爲 gluLookAt(25.774f,25.774f,25.774f, 20.0f,20.0f,20.0f, 0.0f,1.0f,0.0f);

現在,物體在觀察體的中心是可擴展的。

+0

好的,在'glOrtho()'之後,[10,30]^3映射到[-1,1]^3之後,相機位於0,0,0,對吧?沒有'gluLookAt()'我可以看到2d中的東西,其中x軸是水平的而y是垂直的。我想從一個角度看事物,所以我可以沿着所有3個軸看到,但是如果我試圖將相機放在角落並看着中心,它仍然不起作用:'gluLookAt(1,1,1 ,0,0,0,0,1,0);'我想我仍然誤解了這種情況... – drowdemon

+0

@drowdemon:是的,你確實是這樣。您現在似乎混淆了之前投影后的觀看音量。視圖變換通常在投影之前應用。我更新了我的答案。 – derhass