HMDで3次元モデルを立体視できるようにViewportをサイドバイサイド表示に設定する
HMDでは,右目左目それぞれに視点の違う映像を表示することで立体視ができます.
ロボットの頭部に搭載された右目左目用の2つで構成されたステレオカメラの映像と,ロボットや環境の3次元モデルを重ねてHMDに表示して,ロボットの一人称視点を体験できるようにしていきます。
まず参考にするのは、
of_v0.8.0_vs_release\examples\3d\advanced3dExample
です.サンプルでは、左側に縦3行、右側に1つの窓に同じ場面が違う視点で表示されています。これを右目左目の映像が一つの窓に並んで表示されるようにアレンジします。
ofRectangleを2つ用意して、それぞれの大きさを画面サイズを横に2分するように設定します。
.hに追加
ofRectangle viewGrid[2];
.cppのsetupに追加
viewGrid[0].x = 0;
viewGrid[0].y = 0;
viewGrid[0].width = ofGetWidth() / 2;
viewGrid[0].height = ofGetHeight();
viewGrid[1].x = ofGetWidth() / 2;
viewGrid[1].y = 0;
viewGrid[1].width = ofGetWidth() / 2;
viewGrid[1].height = ofGetHeight();
ofEasyCamやofCameraなどのインスタンスを2つ作成して,視野角などビューポートのパラメータを設定しておく。
.hに追加
ofEasyCam cam[2];
.cppのsetup関数に追加
// 例は適当
cam[0].setFov(80);
cam[0].setScale(0.001);
cam[0].setPosition( (float)ofGetWidth() * -0.5 -0.03, (float)ofGetHeight() * -0.5 , 0); // 左目
cam[0].setTarget(ofPoint(10,0,0));
cam[0].lookAt(ofPoint(10,0,0),ofVec3f(0,-1,0));
cam[0].setDistance(1.2);
//
cam[1].setFov(80);
cam[1].setScale(0.001);
cam[1].setPosition( (float)ofGetWidth() * -0.5 +0.03, (float)ofGetHeight() * -0.5 , 0); // 右目
cam[1].setTarget(ofPoint(10,0,0));
cam[1].lookAt(ofPoint(10,0,0),ofVec3f(0,-1,0));
cam[1].setDistance(1.2);
まず描画関数の中で、カメラのビューポートにofRectangleのインスタンスを指定してメモリ内部で描画します。その後に、ofRect関数を用いてofRectangleオブジェクトを描画します。
.cppのdraw関数に追加
camera[0]->begin(viewGrid[0]);
drawScene(); // dummy
camera[0]->end();
camera[1]->begin(viewGrid[1]);
drawScene(); // dummy
camera[1]->end();
ofPushStyle();
glDepthFunc(GL_ALWAYS); // draw on top of everything
ofNoFill();
ofSetColor(255, 255, 255);
ofRect(viewGrid[0]);
ofRect(viewGrid[1]);
glDepthFunc(GL_LESS);
ofPopStyle();
サイドバイサイドの表示例:ロボット頭部のカメラから
第3者視点で見ると、