2009/11/12

SIO2 - gluLookAt を使いたい

gluLookAt 的な便利関数を使いたい

SIO2 のチュートリアルには画面タップで視点が移動するサンプルが入っていますが、使い慣れた(?) gluLookAt を使いたいなぁと思ったので探してみました。



vectormath を使う

いろいろ調べて試したところ、vectormath を使うのが楽だという結論になりました。


  • 行列、ベクトルなどの演算ライブラリ. LookAt 系関数もあり.

  • SCE 製.

  • BSD license

  • Bullet physics SDK に含まれている.



Bullet physics SDK - SVN trunkのあたりから落とせます。

行列/ベクトル演算ライブラリは DirectX とかだと充実してますが、OpenGL には全然用意されていないので、vectormath みたいなものがあるととても助かります。



使用例

include/vectormath を、例えば template.mm と同じ階層にある Classes/ にコピーして、以下のようにすると使えます。


// template.mm に書く
#include "classes/vectormath/c/vectormath_aos.h"


実際のコード例は以下。いろいろ無駄なことをしているような気もしますが、とりあえずこれでキャラクター視点のカメラワークになります。


// キャラクターの行列を取得
btTransform tr = g_vehicle_phy->getChassisWorldTransform();
VmathMatrix4 m;
tr.getOpenGLMatrix((float*)&m);

// 視点, 見る方向, 上ベクトルを計算
VmathVector4 eye, target, up;
vmathV4MakeFromElems(&eye, 0, -1, 2, 1); //
vmathV4MakeFromElems(&target, 0, 1, 1.5, 1); // Y-front
vmathV4MakeFromElems(&up, 0, 0, 1, 0); // Z-up
vmathV4Add(&up, &up, &eye);
vmathM4MulV4(&eye, &m, &eye);
vmathM4MulV4(&target, &m, &target);
vmathM4MulV4(&up, &m, &up);
vmathV4Sub(&up, &up, &eye);

// (視点, 見る方向, 上ベクトル) を元に view 行列を計算
vmathM4MakeLookAt(&m, (VmathPoint3*)&eye, (VmathPoint3*)&target, (VmathVector3*)&up);

// 設定
glMultMatrixf((float*)&m);




画面

こんな感じ。

20091112_iphone_sio2