cvl-robot's diary

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

ロボットのGUIコントローラを作る(その4)

初稿: 2013/10/4, 最終更新: 

4.カメラの導入

前回表示が鏡面にひっくり返っていることが判明しました。今回はカメラを導入することでこれを解決していきます。カメラといっても、もちろんロボットの頭部のカメラのことではなく、openGLの視点を決める仮想的なカメラのことです。

4.1 ofEasyCam

openFrameworksは、3次元の描画を簡単にすることを強く意識したライブラリですので、視点設定も簡単にできるようなクラスが用意されています。ここではofEasyCamを使います。

testApp.hのclass testAppの定義の中に、次の一行を加えてください。

ofEasyCam cam;

 次に、testApp.cppのtestApp::setup()関数の一番下に次の5行のカメラの設定を加えてください。各関数の意味は、注釈のとおりです。

cam.setFov(80.0f);                 // カメラの水平視野角を80度に設定

cam.setDistance(1.0f);          // カメラと見ているものの距離を1mに設定

cam.setPosition( (float)ofGetWidth() * -0.5, (float)ofGetHeight() * -0.75 , 0); // カメラの位置を設定

cam.setTarget(model.getPosition() ); // カメラが見る対象物を設定

cam.lookAt(model.getPosition(),ofVec3f(0,-1,0) ); // 見る対象物の位置と、上向き方向を設定

今までは、カメラの位置を特に決めていませんでしたから、原点の位置(0,0,0)にカメラが置かれていることになっていました。その代わり、ロボットの方を動かして表示していました。testApp.cppのsetup()関数内の

model.setPosition(ofGetWidth() * 0.5, (float)ofGetHeight() * 0.75 , 0);

でロボットの原点位置を決め、draw()関数内で表示位置を調整していました。

ofTranslate(model.getPosition().x+100, model.getPosition().y, 0);

ofRotate(-mouseX, 0, 1, 0);

ofTranslate(-model.getPosition().x, -model.getPosition().y, 0);

ロボットを扱うときには、ロボットの原点または世界座標系の原点を0位置とした方が、あとで色々と計算が楽になりますので、カメラとロボットの位置をひっくり返します。この4行は不要ですので削除してください。

ビルドして実行してみましょう。

f:id:cvl-robot:20131004195337j:plainfig.8 ofEasyCamの導入

真ん中にロボットが表示されるようになっただけでなく、マウスで視点を変えられるようになっています。

  • 左ボタン:ロボットを中心に見据えてカメラの位置を移動
  • 右ボタン+上下ドラッグ:ズーム
  • 中ボタン:見据える位置を平行移動

とても簡単で便利ですね。