2011-10-14 72 views
2

這可能是一個非常基本的問題,但我似乎無法讓OpenGL使用點座標系統。相反,它似乎是以百分比表示的,例如0.99使我處於屏幕的邊緣。這是怎麼回事,還是我做錯了什麼?謝謝!使用OpenGL的座標系如何工作?

代碼:

#include <iostream> 
#include <stdlib.h> 
#include <GLUT/GLUT.h> 

void RenderScene() 
{ 
    glLoadIdentity(); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glBegin(GL_POINTS); 

     glVertex3f(0, 0, 0); 

    glEnd(); 


    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv);     
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);   
    glutInitWindowSize(600, 600);   
    glutCreateWindow("OpenGL"); 
    glutDisplayFunc(RenderScene); 
    glutMainLoop(); 
    return 0; 
} 
+0

也許[這個問題](http://stackoverflow.com/q/7377912/743214)的答案將爲您提供一些有關OpenGL轉換管道的信息。 –

回答

6

OpenGL的工作原理如下:開始本地座標系(任意單位)。這個座標系被轉換爲所謂的眼睛空間座標由modelview矩陣(它被稱爲modelview矩陣,因爲它結合了模型和視圖轉換)。

眼睛空間,然後由投影矩陣,隨後立即透視分割獲得規格化設備變換爲裁剪空間座標NDC{x,y,z} = Clip{x,y,z}/Clip_w)。 NDC空間中的範圍[-1,1]^3被映射到視口(x和y)和設置的深度範圍(z)。

所以,如果你離開你的變換矩陣(模型視圖投影)身份,那麼確實座標範圍[-1,1]將映射到視口。但是,通過選擇適當的變換和投影,您可以任意地從模型空間單位映射到視口單位。

+0

你確定Clip {x,y,z}/Clip_w嗎?如果我在Z = 1000處有三角形,該怎麼辦?他們被扔掉了嗎?首先是不是它,在htat之後裁剪? –

+0

@IvanKuckir:OpenGL規範定義了裁剪髮生在同質分割之前。 – datenwolf

1

這不是一個真正的百分比:它關係到當前的視口的大小和縱橫比。我可以寫一個關於它的完整故事,但我建議你在OpenGL上看看NeHe's tutorials,從lesson 1開始設置窗口。非常徹底,並強烈建議。

1

您錯過了投影矩陣的概念。

本質上,投影矩陣是投影2D空間頂點的矩陣。有兩個投影矩陣:透視圖和正交圖。

當前投影矩陣確定有效頂點屏幕位置。由於您沒有設置投影矩陣,因此您使用默認的投影矩陣,即正交圖,水平和垂直範圍爲-1 .. +1。

要控制投影矩陣,請參閱gluOrtho2D函數。在那裏你可以找到所有需要的信息。