カメラアニメをゲーム中で使うために

Easy3D ver5.3.3.3でカメラ操作に拡張機能を付けました。
命令はE3DSetCameraOffsetというものです。

これは何をするものかというと
通常のカメラ設定にオフセット(初期位置、初期向き)を加えるものです。

パラメータはcamoffbef, camqid, camoffaftの3つです。
camoffbefとcamoffaftは位置座標、camqidは回転を示すクォータニオンです。

どういう風に機能するかというと
まずcamoffbefだけ平行移動し、camqidだけ回転した後、camoffaftだけ平行移動する
という変換を通常のカメラ処理の変換の前に加えます。

カメラアニメの再生と組み合わせれば、カメラアニメ全体を移動回転できることになります。

なぜ平行移動が2つと回転が1つかというと理由があります。
完全な理屈は難しいので例を1つ挙げて説明します。

camoffbefに-1.0 * pos1の座標を与え、camoffaftにpos1の座標を与えて適当な回転qを与えると
pos1を中心にqだけ回転する変換が出来上がります。
腕の関節を考えてみてください。
ひじの関節の位置をpos1としたとき
ひじを原点に移動する-pos1の変換の後、回転を加え、pos1だけ平行移動して元の位置に戻すと
ひじの関節を中心に回転することが分かるでしょう。

ひじの位置をpos2に置きたいときは
camoffbefに-pos1をcamoffaftにpos1 - pos2を指定すればOKです。

ここでなぜcampffaftがpos1 + pos2で無いかというと
カメラの変換は表示する物体に適用されるということに原因があります。
つまりカメラを前に動かしたように見せるために、実際には物体を後ろに動かすのです。
そこで pos1 - pos2となります。

さてここからが本題。

この仕組みを使えば
E3DLoadCameraFileで読み込んだcamファイルを自由な位置と向きから再生開始できるということです。

まずcamファイルの準備から始めます。
RokDeBone2でcamファイルを作るときにキャラクターが原点にあると想定して作成するところがミソです。
原点のキャラクターを見るようにアニメを作りcamファイルを保存します。

そしてアニメ再生時にキャラクターの位置と向きに応じたオフセットを設定すれば良いのです。
キャラクターの位置をpos1, キャラクターの向きのクォータニオンをqとすると
camoffbefは-pos1になり、camoffaftはpos1 - pos1(befを元に戻すpos1とカメラをキャラクター位置に移動する-pos1の演算)となります。
向きはキャラクターの向きの逆クォータニオンになります。
逆クォータニオンはE3DInvQで求めます。
これらのパラメータをE3DSetCameraOffsetに渡せばOK!


もう一点こつがあります。
カメラアニメとそうでない通常のカメラとの切り替え時にカメラが急激に切り替わるのが嫌な場合の対処です。

これを解決するには通常時も1フレーム長のキャラクターのアングルを決めるcamファイルを再生し、
E3DSetCameraOffsetでカメラを操作すると良いです。

つまり常時、カメラアニメ+E3DSetCameraOffsetで操作するのです。

これらを実装したサンプルは
HSP版はe3dhsp3_CameraOffset.hsp
Win32版はCameraOffsetソリューション
にあります。

実際にいじってみて理解を深めてください。


なお、この仕組みについてぼくはこれ以上説明できません。
ひょっとしたら説明に間違いが含まれているかもしれません。

どうしてこうなるのか?とか聞かれても困ります。
ですのでこの件については質問禁止とします(笑)

完全に理解したかったら、各自数学を勉強するなどして対処してください。

では健闘を祈ります。



トップページに戻る