ロボットの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行は不要ですので削除してください。
ビルドして実行してみましょう。
fig.8 ofEasyCamの導入
真ん中にロボットが表示されるようになっただけでなく、マウスで視点を変えられるようになっています。
- 左ボタン:ロボットを中心に見据えてカメラの位置を移動
- 右ボタン+上下ドラッグ:ズーム
- 中ボタン:見据える位置を平行移動
とても簡単で便利ですね。