楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル

log

2009.11.17 C++:カメラ視線に沿って移動(サンプルつき)

ミップマップの自動生成方法をネットで調べてみても、あまり
詳しくのっておらず、よく分からず終いだったので。。
(まぁ自動生成でなくとも手動生成が分かっているので別にいいのですが…。)
今回は少し嗜好を変えて、新しくモデルの移動命令を導入することにしました。

ちょっと前にO3Dを使っていたときに、カメラの視線方向に沿って
モデルを移動させる処理をやっていて。これは面白いなと
思ったので、C++でもさっそく自作で導入してみることにしました。

ちょうど日記にまとまる程度のコード量だったので、以下に
処理を記述してみることにします。

// カメラの視線ベクトルの角度CameraDirZを求める
float CameraDirZ = atan2f(
(CameraTarget.z - CameraPos.z),
(CameraTarget.x - CameraPos.x)
);
// カメラの視線ベクトルとアップベクトルに対して
// 垂直なベクトルの角度CameraDirXを求める
float CameraDirX = CameraDirZ - D3DX_PI/2;
// カメラ視線の角度を元に移動量を計算して座標値に増分
Pos.x += cosf( CameraDirX ) * directionX +
cosf( CameraDirZ ) * directionZ;
Pos.z += sinf( CameraDirX ) * directionX +
sinf( CameraDirZ ) * directionZ;

これだけです笑。
ちなみに変数の説明をすると、
・CameraPos,CameraTarget:カメラの座標と注視点の座標
・directionX:上/下キーが押されている場合+/-移動量が格納されている
・directionZ:右/左キーが押されている場合+/-移動量が格納されている
・Pos:モデルの座標
こんな感じです。CameraPos,CameraTargetは
E3Dを使っている人ならおそらくピンと来るだろうと思います。
directionX,ZはO3Dのチュートリアルサンプルそのままの使い方です笑。

ベクトルや行列を普段から使っているプログラマーさんにとっては
何でもない処理だろうと思いますが。僕みたいに今まで
ライブラリで楽してきたエセプログラマにとっては意外と
参考になるのではないかなと、そう思います。

簡単な処理なのでE3Dでももちろん導入可能だと思います。
最近E3Dから離れていたので、これで少しくらいお役に立てるといいな。

comment