3

私はglFrustum透視投影に使用しようとしていますが、私が理解しているglFrustumようglOrthoに、目的の座標系から実際の画面座標へのマッピングを変更するために使用できます (ブルーブックで読んだように)。したがって、そうすると、デカルト座標の形式で
glFrustum(-1,1,-1,1,1,1000);、座標が
左 = -1、右 = 1、下 = -1、上 = 1 に変更されます。

draw メソッドで次の関数を呼び出して、この座標系で単純な部屋 (2 つの側壁がある) を描画しようとしましたが、画面に適切に描画されます。

void drawRoomWalls(){
    //Left wall
    glBegin(GL_QUADS);
    glVertex3f(-1.0, 1.0, 0.0);
    glVertex3f(-1.0, 1.0, -0.4);
    glVertex3f(-1.0, -1.0, -0.4);
    glVertex3f(-1.0, -1.0, 0.0);
    glEnd();

    //Right wall
    glBegin(GL_QUADS);
    glVertex3f(1.0, 1.0, 0.0);
    glVertex3f(1.0, 1.0, -0.4);
    glVertex3f(1.0, -1.0, -0.4);
    glVertex3f(1.0, -1.0, 0.0);
    glEnd();
}

関数は次のように呼び出されました。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
    glFrustum(1.0, -1.0, -1.0, 1.0, 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -1.0);
drawRoomWalls();

続いて、(ユーザーの頭の代わりにマウスを入力として) 軸外投影を試みました。コードは次のとおりです。glPushMatrix(); glMatrixMode(GL_MODELVIEW); glPushMatrix();

double fov, near, far;
double headX, headY, headZ;
float aspectRatio;

near = 0.5f; far = 1000.0f;  aspectRatio = ofGetWidth()/ofGetHeight();
fov = tan(DEG_TO_RAD * 30/2); //tan accepts angle in radians. tan of the half of the fov angle
fov = 0.5; //taken constant for now

double msX = (double)ofGetMouseX();
double msY = (double)ofGetMouseY();
double scrWidth = (double)ofGetWidth();
double scrHeight = (double)ofGetHeight();

headX = (msX / scrWidth) - 0.5; 
headY = ((scrHeight - msY) / scrHeight) - 0.5;
headZ = -2.0;

glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glFrustum( near * (-fov * aspectRatio + headX),
               near * (fov * aspectRatio + headX),
               near * (-fov + headY),
               near * (fov + headY),
               near,
               far);

leftValue = near * (-fov * aspectRatio + headX); //for printing out on screen
rightValue = near * (fov * aspectRatio + headX); //for printing out on screen
bottomValue = near * (-fov + headY); //for printing out on screen
topValue = near * (fov + headY); //for printing out on screen

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(headX * headZ, headY * headZ, 0, headX * headZ, headY * headZ, -1, 0, 1, 0);
glTranslatef(0.0, 0.0, headZ);
drawRoomWalls();


leftValuerightValuebottomValuetopValueおよびマウスが画面の中央にあるときの値を出力しました ( の呼び出しは次のglFrustumようになりますglFrustum(-0.25,0.25,-0.25,0.25,1.0,1000.0)
) left=-0.25, right=0.25, bottom=-0.25, top=0.25(例では 1.0,1.0,0.0)) しかし、壁は画面の両側に表示され続けます (シーンが歪んでいて、中心にあるのは軸外投影と本質的に同じです)。壁がまだ側面の場所にあること (座標が -0.25,0.25 に変更されたとしても) または glFrustum 呼び出しに座標系についてここで欠けているものがありますか?

4

1 に答える 1

4

あなたも に変わったことに今気づきましheadZ-2。それは動作を説明します。

カメラが に位置しz = 2、垂直半視野が 0.5 の場合、 にz = 0は正と負の y 方向に 1 単位が既に表示されます。壁が見えるのはそのためです。

視覚化

于 2013-05-13T17:43:45.517 に答える