スポンサーサイト

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

"親子関係"を作ってみた

今日は、 "親子関係"を作ってみました。

親子関係と言ってもですね、「父とキャッチボールした」とか そんなんじゃなく、
プログラミングの話です。

とりあえず説明。
まず、下記の様な箱型のポリゴンが2つ(box1、box)あるとします。
【参考画像】
親子関係


そしてbox2はx軸方向を中心に回転するとします。
【参考画像】
親子関係2
※これは約90度 box2をx軸を中心として回転させたものです。
(x軸回転 ・・・ 鉄棒で"前周り"をしているような感じの回転です。)


今度は、box2を回転させたまま(上記の画像の状態のまま)
box1をY軸を中心として回転させます。

この時、 box2はbox1につられて回転するものとします。
【参考画像】
親子関係3
※box1をY軸を中心に回転させると、box2も同じ分だけY軸中心に回転します。
(Y軸中心回転 ・・・ コーヒーカップに乗って、回転している 感じ。)

で、
---------------------------------
box2がいくら動いてもbox1には影響ナシ。
しかし、box1が動くとbox2はつられて動く。

---------------------------------
上記の様な関係を、 親子関係と呼んでいます。
(親・・・box1、 子・・・box2 となる。)


そして、今度は「プログラムでどうやるのか?」を説明します。

まず、回転や移動を行うために行列というものをつかうのですが
どこかの軸を中心に回転し、原点からどこかへ平行移動させたい場合は
下記の様に掛け算をします。
---------------------------------------------------------------------
【Y軸回転し、平行移動する行列】 = 【平行移動行列】 × 【回転行列】
---------------------------------------------------------------------

プログラムだと、こんな感じ。
---------------------------------------------------------------------
D3DXMatrixRotationY( &RotaMat, D3DXToRadian(45));//Y軸中心に45度回転
D3DXMatrixTranslation( &Transmat, 4, 0, 0);//x軸に4平行移動

Submat = Transmat * RotaMat;

↑Y軸中心に45度回転し、X軸に4平行移動する行列
---------------------------------------------------------------------
【参考画像】
行列の合成.
(白い線はそれぞれ 横棒・・・X軸縦棒・・・Y軸ななめの棒・・・Z軸 です。
45度回転して、右側に4移動しているのが分かると思います。)

上記で、うまくbox1が描画できました。
今度は、box1の上にbox2を描画しようと思います。
box1の上に描画 = box1の位置からY軸方向へ平行移動させた場所に描画 です)

「どうやってbox1の場所を基準として移動した場所に描画するの?」
と思うかもしれませんが、やり方は簡単。
Y軸へ平行移動する行列を作り、box1を動かした行列をかけるだけです。
---------------------------------------------------------------------
D3DXMatrixRotationY( &RotaMat, D3DXToRadian(45));//Y軸中心に45度回転
D3DXMatrixTranslation( &Transmat, 4, 0, 0);//x軸に4平行移動
D3DXMatrixTranslation( &Transmat2, 0, 6, 0);//Y軸に6平行移動

Submat = Transmat2 * Transmat * RotaMat;

↑Y軸中心に45度回転し、X軸に4、Y軸に6平行移動する行列
---------------------------------------------------------------------
【参考画像】
行列の合成2
(box1の場所を基準とし、Y軸方向へ、6移動してます。)

更に、box2を回転させたい場合は、同じように
回転させる行列Rotamat2を作り、下記の様にかけるだけです。
------------------------------------------------------------------
Submat = Transmat2 * Rotamat2 * Transmat * RotaMat;
------------------------------------------------------------------

大体、規則性が見えてきたと思いますが、
①親 ②子 ③孫の関係があるとすると、
それぞれ座標変換する行列は
--------------------------------------------------------------------------
【親】
Submat = Transmat1 * RotaMat1 ;

【子】
Submat = Transmat2 * RotaMat2 * Transmat1 * RotaMat1 ;

【孫】
Submat = Transmat3 * RotaMat3 * Transmat2 * RotaMat2 * Transmat1 * RotaMat1;
--------------------------------------------------------------------------
こうなります。
自分から、親へ向かってどんどん行列をかけてやればOKという訳です。

で、最後に、何でこんな親子関係を作りたかったのか?というと

答えは当然、
ボーンを使ったアニメーションをさせたいから
です。
(腕が動くと手、指もつられて動く、みたいな。)

なかなか大変ですが完成まで頑張ります。 (`・ω・´) *
スポンサーサイト

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

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



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