2009/11/12
テーマ: 開発 / iOS / 2009 / すべて
SIO2 のチュートリアルには画面タップで視点が移動するサンプルが入っていますが、使い慣れた(?) gluLookAt を使いたいなぁと思ったので探してみました。
いろいろ調べて試したところ、vectormath を使うのが楽だという結論になりました。
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);
こんな感じ。