cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

HMDで3次元モデルを立体視できるようにViewportをサイドバイサイド表示に設定する

HMDでは,右目左目それぞれに視点の違う映像を表示することで立体視ができます.

ロボットの頭部に搭載された右目左目用の2つで構成されたステレオカメラの映像と,ロボットや環境の3次元モデルを重ねてHMDに表示して,ロボットの一人称視点を体験できるようにしていきます。

まず参考にするのは、

of_v0.8.0_vs_release\examples\3d\advanced3dExample

です.サンプルでは、左側に縦3行、右側に1つの窓に同じ場面が違う視点で表示されています。これを右目左目の映像が一つの窓に並んで表示されるようにアレンジします。

f:id:cvl-robot:20140331145044p:plain

 

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();

 サイドバイサイドの表示例:ロボット頭部のカメラから

f:id:cvl-robot:20140331154542p:plain

 第3者視点で見ると、

f:id:cvl-robot:20140331154559p:plain