ライブラリ機能とサンプルプログラムの説明
sample_03_MultiViewPort
サンプルの動作説明
このサンプルでは、sample_02_6AxRobotと同じロボットアームを 4方向からカメラで撮影したような画面を表示します。 画面左上はsample_02_6AxRobotと同様にマウスでカメラアングルを操作できます。 右上、左下、右下は、それぞれ上面図、側面図、正面図になっています。
機能:マルチビューポート、マルチカメラ
SODLは、オブジェクトを複数のアングルから撮影して描画できるように、 ユーザコードによって描画領域(ビューポート)とカメラを追加する機能が用意されています。 このサンプルでは、ウィンドウの4分割するように4つのビューポートを配置する例を示しています。
サンプルコードの解説
サンプルコードは、ほとんどsample_02_6AxRobotと同じです。 初期化処理のなかで、ビューポートとカメラの設定をしているのが差分になります。
コード全体はこちらを参照
ビューポート1
//-----------------------------------------------------
// ビューポート1
//-----------------------------------------------------
{
// デフォルトのビューポートは描画マネージャの初期化時にインスタンス化され、
// viewPorts[0]にstd::shared_ptrで保持されている。
// これを一時変数に受け取ってサイズや関連付けられたカメラ設定を操作する
// ビューポート1へのshared_ptr取得
auto vp1 = sodl::drwMngr->viewPorts[0];
// ビューポート1のサイズを設定する
// ウィンドウを4分割した左上領域にビューポートを張る
// (OpenGL画像座標系に従うので、ウィンドウ左下原点、上方向がY+、右方向がX+)
vp1->setVpSize(
0, // left
app::WINDOW_SIZE_Y / 2, // bottom
app::WINDOW_SIZE_X / 2, // width
app::WINDOW_SIZE_Y / 2 // height
);
まずはデフォルトビューポートへのポインタを取得し、 画面を4分割した左上を占めるように位置とサイズを調整します。
デフォルトのビューポートは、描画マネージャdrwMngr
のメンバに
shared_ptr配列の[0]番目要素として保持されています。
後のコードで追加するビューポートも、この配列に追加されていきます。
// ビューポート1に関連付けられたカメラへのshared_ptrを取得する
auto cam1 = vp1->getCam();
// カメラの位置を設定する
cam1->camPos = Eigen::Vector3f(600.f, -2000.f, 300.f);
// カメラの撮影対象位置を設定する
cam1->camTgt = Eigen::Vector3f(0.f, 0.f, 0.f);
// カメラのズーム比率を設定する
cam1->zoomRatio = 0.8;
// カメラ設定を反映するために、調整したカメラを再度ビューポート1に関連付けし直す
vp1->attachCam(cam1);
}
次に、ビューポートからカメラへのポインタを取得して、アングルなどを調整します。
カメラ位置はあくまで初期値です。マウス操作でアングルを変更するとカメラ位置は変化します。
最後にvp1->attachCam(cam1);
を実施しないとズーム等が正しく反映されません。
(これは不本意なのでどうにか不要にしたいところです。)
ビューポート2
//-----------------------------------------------------
// ビューポート2
//-----------------------------------------------------
{
// ビューポートを追加する。
// 追加されたビューポートインスタンスは
// drwMngr->viewPorts[]にもshared_ptrを介して保持される
auto vp2 = sodl::drwMngr->addViewPort("vp2");
以降は追加のビューポートを生成します。
といっても違いは最初の1行のみです。
描画マネージャdrwMngr
のメソッドを使って新しいビューポートを生成します。
それ以外はビューポート1の設定と変わりません。
以上が、sample_03_MultiViewPort の説明になります。