スポンサーサイト

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

Frameを座標変換してみる

現在のゲーム制作状況、というよりアニメーションの実装状況なのですが、
FrameのMesh情報を読み込む部分は完成しました。

次は、 座標変換行列の計算です。


以前、述べたとおり、Frameは大きく分けて、
・座標変換行列
・Meshの情報

を持っています。

で、Frameがひとつしかないのならば、座標変換行列をそのまま使えば良いのですが、
複数あって、それが親子関係になっている場合そのまま使えません。
(親子関係の場合、子は親からの相対座標になるのです。)

例えばRedBox = 親、 BlueBox = 子とし、
それぞれ、(x y) = (1 0)、 (x y) = (3 0)とします。
(単純化するため、今回はZ成分は無視

この場合、Xファイル上ではこのようになってます。
-----------------------------------------------------------------------
Frame RedBox
{

FrameTransformMatrix{ x座標に1移動する行列 }
Mesh { RedBoxの頂点座標などの情報 }
Frame BlueBox
{

FrameTransformMatrix{ x座標に2移動する行列 }
Mesh { BlueBoxの頂点座標などの情報 }
}
}


-----------------------------------------------------------------------
【参考画像】
座標変換2
(実行画像としてはこんな感じ)

BlueBoxの座標変換行列を見ても分かるとおり、
x座標が3の場所に移動、ではなく
RedBoxの座標を基準に、X座標が増えた場所に移動、となってます。

この為、直接BlueBoxの座標変換行列(x方向に2移動)で BlueBoxを表示させようとすると、
下記の様になってしまいます。
【参考画像】
座標変換3

表示場所がおかしくなりますね。
「じゃあ どうすれば親を基準とした相対座標から絶対座標になるのか?」
と思いますが、コレは簡単。
ひたすら親に向かって行列をかけるのです。
(実は以前、すでに説明したのですが、※大事なことなので2回言いました

上記の例では、
------------------------------------------------------------------------
RedBox = x座標に1移動する行列( 行列A
BlueBox = x座標に2移動する行列( 行列B

------------------------------------------------------------------------
なので、BlueBoxの絶対座標を求める計算は、
行列B×行列Aとなります。

ちゃんと正しいか、実際に計算してみる。
--------------------------------------------------------------------
   行列B          行列A        絶対座標に変換する行列
┏ ┓┏ ┓ ┏ ┓
┃1 0 0 0┃┃1 0 0 0┃ ┃1 0 0 0┃
┃0 1 0 0┃┃0 1 0 0┃_┃0 1 0 0┃
┃0 0 1 0┃┃0 0 1 0┃ ̄┃0 0 1 0┃
┃2 0 0 1┃┃1 0 0 1┃ ┃3 0 0 1┃
┗ ┛┗ ┛ ┗ ┛
--------------------------------------------------------------------
見事、絶対座標で、X座標が3の場所に移動する行列になりました。
(行列の掛け算の仕方の説明は省略)

そして、いくら階層が増えても同じように計算できます。
--------------------------------------------------------------------
Frame RedBox
{

FrameTransformMatrix{ 単位行列(行列A)}
Mesh{ RedBoxの頂点座標、頂点色などの情報 }
Frame BlueBox
{

FrameTransformMatrix{ x座標に2移動する行列(行列B)}
Mesh{ BlueBoxの頂点座標、頂点色などの情報 }
Frame GreenBox
{

FrameTransformMatrix{ y座標に2移動する行列(行列C)}
Mesh{ GreenBoxの頂点座標、頂点色などの情報 }
Frame YellowBox
{

FrameTransformMatrix{ x、y座標に1移動する行列(行列D)}
Mesh{ YellowBoxの頂点座標、頂点色などの情報 }
Frame WhiteBox
{

FrameTransformMatrix{ y座標に2移動する行列(行列E)}
Mesh{ WhiteBoxの頂点座標、頂点色などの情報 }
}
}
}
}
}

--------------------------------------------------------------------
上記の場合は、階層が下記の様になっており、
親―――――――――――――→子
RedblueGreenYellowWhite


それぞれ絶対座標に変換する行列の求め方はこうなります。
--------------------------------------------------------------------------
RedBox = 行列A
BlueBox = 行列B×行列A
GreenBox = 行列C×行列B×行列A
YellowBox = 行列D×行列C×行列B×行列A
WhiteBox = 行列E×行列D×行列C×行列B×行列A

--------------------------------------------------------------------------
で、
ここからが今日の本題なのですが、
今これを再帰関数とスタック構造を用いて無駄なく計算させようとしています。

上記を見たとおり、階層が深くなるほど計算が多くなります、が しかし、
よく見ると後半の掛け算は直前で求めた行列と全く同じなのが分かると思います。

なので、この直前の行列をどこかに記憶させていれば、物凄く計算が少なくなります。
--------------------------------------------------------------------------
RedBox = 行列A
BlueBox = 行列B×RedBox
GreenBox = 行列C×BlueBox
YellowBox = 行列D×GreenBox
WhiteBox = 行列E×YellowBox

--------------------------------------------------------------------------
こんな感じ。

再び再帰関数で手こずってますが、慣れてきたのでもうすぐ完成しそうです。
↓あと、コレに関してはこのサイトが参考になると思います。
gameつくろー ワールド変換行列スタック
スポンサーサイト

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

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



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