6

ユーザーの位置に応じて画面にシーンをレンダリングできるプログラムがあります。ユーザーが位置を変えると、錐台が変化して軸外の投影になります。この手法を利用して、次のようなもので、より大きなシーンをつなぎ合わせる 3 つの異なるディスプレイで作業したいと考えています。

ここに画像の説明を入力 3 つのディスプレイにレンダリングされた現実世界の大きなシーンを想像してみてください。3 つのディスプレイは、ユーザーの位置に応じて各ディスプレイのパースペクティブが変更されて見えるように、シーンを表示する必要があります。ユーザーの位置に応じてシーンをレンダリングするために1つのディスプレイでこれを行うことができますが、これを3つの画面で機能させる方法を考えることができません.

私が作成したクラスの軸外投影は、基本的に次のことを行います。

customCam::project(){
pushMatrices();
glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
        glFrustum(leftNear.x, rightNear.x, bottomNear.y, topNear.y, _near, _far);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(uPos.x, uPos.y, 0, uPos.x, uPos.y, -1, 0, 1, 0); //neglect z scaling for now. In the main program, it's there
    glTranslatef(0, 0, uPos.z);
}

シーンが現実世界のように連続的に見えるように、3 つの錐台をスティッチするにはどうすればよいですか? 現在、クラスのユーザーは次のようにシーンを描画します。

cstCam.project();
    //draw something here
popMatriceS(); //which were pushed before glFrustum projection

編集: 私の場合、ユーザーの 3 つの錐台を定義するために (同じ参照フレーム内のすべてのディスプレイのユーザーと画面の隅を考慮して)、次のことを行いました。

custCam1.project();
//draw scene here. eg: two walls at the far left and right screen
drawWalls();
popMatrices();
custCam2.project();
drawWalls();
popMatrices();
custCam3.project();
drawWalls();
popMatrices();

void drawWalls(){
//Left most corner screen wall
glBegin(GL_QUADS);
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, -50);
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, -50);
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, 0);
glEnd();

//Right most corner screen wall
glBegin(GL_QUADS);
glVertex3f(1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen
glVertex3f(1.5*PHWIDTH, HEIGHT/2, -50);
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, -50);
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, 0);
glEnd();
}
4

1 に答える 1

1

これは見た目ほど難しいことではありません。次の画像を考えてみましょう (znear レベルで上から見た 3 つの画面)

上からのスクリーン

各スクリーンは znear 距離で x 方向に 2 ユニットにまたがると仮定しました。シーンによっては、この値をスケーリングする必要がある場合があります。

3 つの画面は同じ垂直位置にあるため、y 座標の範囲は変わりません。

したがって、スクリーンには 3 つの異なる投影マトリックスが必要です。オフセットの決定は非常に簡単です。カメラ ポイントとの違いだけが必要です。

left screen   => [-3 - camera.x, -1 - camera.x]
center screen => [-1 - camera.x, 1 - camera.x]
right screen  => [1 - camera.x, 3 - camera.x]

もちろん、図のようにスクリーンの空間内でのカメラの位置が必要です。

ビュー マトリックスは任意のものにすることができますが、3 つの画面すべてで同じにする必要があります。今回は、シーン空間のカメラ位置を に渡しgluLookAtます。

于 2013-06-14T22:38:26.873 に答える