スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

キーフレームアニメーションの解説2

【リンク】 ◆解説系TOP◆

キーフレームアニメーションの解説2です。

前回は、
2つの区間(始まりと終わり)から補間して変化量を出す方法
をやってみました。

今回は、出した変化量を座標変換行列にする部分を
書いてみようと思います。


とりあえず、行列の確認をします。
変換行列はおおまかに
------------------------------------
●何も変換しない (単位行列)
●回転
●拡大縮小
●平行移動(オフセット)

------------------------------------
この4種類があります。

そして、それぞれの行列は下記のようになります。
行列(単位)
行列(回転)

行列(拡大・縮小)
行列(平行移動)

で、上記の図を見れば分かるように、
それぞれの変換で使われる可能性のある要素
下記の様になります。
要素
※この図は後で使用します。


基本的な事項の確認が終わったので、本題に入ります。

以前、行列をかける際は
-----------------------------------------------------------------
拡大・縮小 ⇒ 回転 ⇒ 平行移動 の順番にしよう!
-----------------------------------------------------------------
と言ったのですが、
別に行列演算をしなくても良いことに気付きました。


例えば、上の図で平行移動の使用する可能性のある要素を見てください。
見ての通り、拡大・縮小しようが回転させようが、全く影響を受けません。

つまり、わざわざ平行移動する行列を生成して掛算しなくても、
X軸に2Y軸に4Z軸に3 移動させたい場合は
-------------------------
_41  =  2;
_42 = 4;
_43 = 3;
-------------------------
↑コレで充分です。


そして次に拡大・縮小。
これ実際に拡大縮小させる行列をかけたら分かるんですが、
拡大・縮小の場合は、変化量を 横一列にかけることになるんです。

【拡大・縮小する行列をかけてみた例】
拡大・縮小サンプル

X軸に2倍ならば、行列の1段目全てを2倍
Y軸に3倍ならば、行列の2段目全てを3倍
Z軸に5倍ならば、行列の3段目全てを5倍
しているのと等しい事が分かるはずです。

また、上の使用する要素の図を見れば分かりますが、
_14と_24と_34は特に使われてません。

つまり、X軸に2倍Y軸に3倍Z軸に5倍拡大したい場合は
--------------------------------
_11  *=  2;
_12 *= 2;
_13 *= 2;

_21 *= 3;
_22 *= 3;
_23 *= 3;

_31 *= 5;
_32 *= 5;
_33 *= 5;
--------------------------------
これでOKと言うことです。
※_14、_24、_34はかける必要なし。

で、最終的にたどり着いた、座標変換行列の作り方はコチラ。↓
---------------------------------------------------------------------
【1】回転行列を生成する。
【2】_11~_13_21~_23_31~_33に、拡大・縮小の分をかける。
【3】_41_42_43に、平行移動の分を直接代入。
---------------------------------------------------------------------

ついでに、ちゃんと上手く行列が算出できるかやってみましょう。
下記の行列を生成するとします。
-------------------------------------------------
【1】X軸方向に2倍、Y軸方向に3倍する。
【2】Z軸中心に90度回転
【3】X軸方向に4、Y軸方向に4平行移動。

-------------------------------------------------

普通に拡大・縮小 ⇒ 回転 ⇒ 平行移動の行列を書ける場合は
次のようになります。
計算結果


次に、行列の掛け算を行わない方法でやってみます。

【1】回転行列生成。  (Z軸に90度回転)
計算結果2_1

【2】拡大・縮小の変化量をかける。
計算結果2_2
(_11_12_13をそれぞれ2倍、_21_22_23をそれぞれ3倍、_31_32_33をそれぞれ1倍。)

【3】平行移動の変化量を直接代入。
計算結果2_3
(_41 = 4、_42 = 4、_43 = 0、 ←それぞれ代入)

なんと、 全く同じ行列になりました。
最高です。


~あとがき~

今回言いたかったのは、
行列同士の掛け算をしなくても最終的な座標変換行列は出せる
と言うことです。
その方法を解説してみました。

で、「なんで行列同士の掛け算をしないようにしたの?」と言うと、
単純に計算量が多くなってしまうからです。

行列 × 行列 の計算をすると、float同士の掛け算が64回行われるんですよ。
拡大・縮小 × 回転 × 平行移動 だと、合計128回です。

しかし、行列演算を行わないようにした方法だと、float同士の掛け算は9回です。
(拡大・縮小の変化量をかける所で9回。)

計算回数が多くなればなるほど、処理速度の速さが見えてくることうけあいです。

D3DXMatrixTranslation関数とか、 D3DXMatrixRotation関数とかを使わずに、
「内部の行列の値がどうなっているのか?」を知って、うまく計算できるようになれたら
自分にとっても良いんじゃないかなーと思います。 (能力的に)
スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント
コメントの投稿
管理者にだけ表示を許可する



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。