2012-04-27 13 views
1

私はコンピュータグラフィックスを勉強していましたが、私はビューポート、gluorthoの役割とGL_MatrixModeとGL_Projectionをいつ使うのかについて非常に混乱しています。 私が混乱させたサンプルコードです。OpenGL:ビューポート、クリッピング、matrixtmodeの混乱

void init() 
{ 
    glClearColor(1.0,1.0,1.0,1.0);//Background Color of Viewport 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-200,200,-200,200,-50,50); 
    glMatrixMode(GL_MODELVIEW); 
} 

void wheel() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1,0.2,0.2); 
    glLoadIdentity(); 
    glViewport(0,0,200,200); 
    glutSolidCube(100); 
    glFlush(); 
} 
void main(int argc,char** argv) 
{ 
    glutInit(&argc,argv); 
    glutInitWindowSize(400,400); 
    glutInitWindowPosition(400,400);//Position from the top left corner 
    glutCreateWindow("Car"); 
    init(); 

    glutDisplayFunc(wheel);//Shape to draw 
    glutMainLoop(); 
} 

キューブのサイズを200に変更すると、それはなぜですか?それはzのクリッピングよりも大きいからですか? glMatrixMode(GL_MODELVIEW)を削除すると、キューブが表示されなくなるのはなぜですか? 表示機能の最後にフラッシュしないと、キューブも消えます。なぜですか? ビューポートを小さくすると、オブジェクトのサイズが小さくなります。これは、オブジェクトの座標がワールド座標ではなくビューポートからの相対座標であることを意味しますか?

答えて

4

キューブのサイズを200に変更すると、その面はnear-and-clipping planeを超えて広がります。これは、glOrthoで-50と50の呼び出しで設定されています。キューブの遠い側も遠いクリッピング平面の外側にあるので、その背面を見ることはできません。

行列モードをGL_MODELVIEWに設定するための呼び出しを削除すると、glLoadIdentity呼び出しが固定機能の投影行列(私はかなり確信しています)で動作するので、キューブは正規化されたデバイス座標に直接変換され、すべてのクリッピングプレーンを超えて

最後に、glViewportは、レンダリングするバッファのサイズを定義します。したがって、通常は画面サイズと一致します。効果的に小さくすると画面サイズは小さくなりますが、実際のGLUTウィンドウサイズは変わりません。数学的には、フラグメントが正規化されたデバイス座標からスクリーン座標に投影される方法を変更します。