私は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();
leftValue
、rightValue
、bottomValue
、topValue
およびマウスが画面の中央にあるときの値を出力しました ( の呼び出しは次の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 呼び出しに座標系についてここで欠けているものがありますか?