忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

久しぶりに書きます。

どうも たくあんです。
あけおめです。


いやー休憩時間に何となくGesブログみたら全然更新されていないじゃないかっw

なので書きたくなったので書きます。



何を書こうか・・・

今更だけど行列の事でも書いてみようかな。
きっと既にDIrectXとかやってる一年生も居るかもしれんしね。

二年生は技術よりとにかく作品つくろうね!

拍手[2回]



皆さんは行列に付いてどこまで理解してるでしょう。

ライブラリの関数を使っていると内部で何をしているのかわからなくなってきませんか?
私も最近ゲームエンジンを使用しているのでたまにありますw


理解が深まれば様々な応用も効くはず!
この機会におさらいしてみます。


*今更の注意事項
・事前に行列の積の方法など基本的なとこは見ておいてください。
 
・ラジアンとか三角関数といった所の知識が必要です。入社試験などでも出題される所もあるのでので勉強しておいても損はないです。あと内分点とかもおさえとけぇい!
 
・人によっては誤解する表現があるかもしれないのでただ鵜呑みするのではなく自分で調べることをしてください



わかりやすくDirectXで例を上げてみます。
 
DirectXで使用している行列はfloat型の4×4行列です。
 
構造的には・・・

┌                     ┐
│_11, _12, _13, _14  |
│_21, _22, _23, _24  |
│_31, _32, _33, _34  |
│_41, _42, _43, _44  |
└                      ┘
となっています。
 
で、これを知ったからどうなんだ?
と思うかも知れませんがこれがかなり重要です。
DirectXの行列には並行移動、回転、拡大縮小がありこれらのエフェクトを作り出す行列を結合して 1 つの行列にし、
1 度に複数のトランスフォームを計算させるようにしています。


例でスケーリングを見てみます。
何故スケーリングかは簡単に書けるからだよおぉぉー

 
拡大縮小行列です。
均一に拡大縮小をするために拡縮値をsとすると・・
 
┌                ┐
│ s , 0 , 0 , 0  |
│ 0 , s , 0 , 0  |
│ 0 , 0 , s , 0  |
│ 0 , 0 , 0 , 1  |
└                 ┘
 
となりますここに拡大縮小の値があると思えばいいと思います。
これを乗算すれば拡縮されると考えてください。
そしてその行列を作成してくれるのはご存知
 
・D3DXMatrixScaling()
 
となります。

 
とこんな感じでトランスフォームしている訳です。
なのでしつこいですが関数を使わなくても直接sのところに拡縮値を乗算してもいいわけです。


他にも移動行列、回転行列がありますが、
もっと綺麗な図で紹介しているサイトも沢山ありますので調べて下さい。
書いてみたらすごい長くなって見にくいのでやめました。


あと移動行列の計算をしている図とか見ると解りやすいですが、

実際の座標は上の( _41, _42, _43 )に格納されており他の要素の関わりがないことがわかります。
 
これを使えば毎回移動行列を作らなくても直接移動させることも可能です。
 
例)
D3DXMATRIX mWorld;    // 行列宣言
 
mWorld._41 += 1.0f;   // X座標に1.0f加算

うん、便利!



次に姿勢行列です。
単純にキャラクターの行列と言う理解で大丈夫だと思います。

要は拡縮、回転、並行移動とすべての要素を持つ行列です。


でその姿勢行列から
キャラクターのローカル軸を取得することができます。

例えばキャラクターのZ軸方向に進んでいるときその方向はキャラのローカルZ軸ですが・・
行列の内部を知っていれば、ややこい計算をせずに・・・

例)
D3DXMATRIX mChara;             // キャラの姿勢行列
 
D3DXVECTOR3 vChara( mChara._31, mChara._32, mChara._33 );  // キャラZ軸
 
で取れちゃいます。


つまり・・・
( _11, _12, _13 )   // X軸
( _21, _22, _23 )   // Y軸
( _31, _32, _33 )   // Z軸
 
で表せます。
これでキャラクタがどこを向いているのかや当たり判定でのレイを飛ばす方向、
内積、外積など、様々な処理、計算に応用できそうですね。



まだまだ行列は深いですが、
次まで分かっていればゲームに色々使えるかと思います。


転置行列って知っていますか?


転置行列とは、行列Aの(i, j) 要素と (j, i) 要素を入れ替えた 
n 行 m 列の行列、つまり対角線で成分を折り返した行列の事です。
 
何を言ってるかわからない人は↓参照。

http://ja.wikipedia.org/wiki/転置行列

 
で 「直行行列は転置すると逆行列になる」 と言う決まりがあります。
何故かは数学の世界です。 


直行行列て、なんだよと言う人のために簡単に説明すると・・・

・ 長さが1でお互いに直行している基底のことです。
  回転行列は正規直行行列になります。
  しかしスケーリングやせん断変形、
  並行移動などの回転以外の変換が混じっていると正規直行ではなくなります。


ええーとつまり、回転行列 = 直行行列でおkです。


とこれが分かっていればこんな事が可能です。


ビルボードは知ってますよね。常にカメラを向いてくれるもので爆発エフェクトとかによく使うと思います。
 
 常にカメラを見てくれる = カメラの回転行列の逆行列
 
ということはわかりますか?

 
ここでナルホドってなった人は天才ですね! すごいです!
私はわかりませんw


次にカメラ回転行列は直行行列です。なんで?と言う方は上の直行行列の特性を見てください。
カメラを拡大しませんよね。純粋に回転の値だけです。


と言うことは・・・・・
カメラの行列(View行列)から逆行列を求めればいいんです。
 
 
D3DXMATRIX mWorld;
D3DXMATRIX view = カメラの行列;
D3DXMatrixIdentity( &mWorld );
 
// 転置行列にすることで逆行列にします
mWorld._11 = view->_11;
mWorld._12 = view->_21;
mWorld._13 = view->_31;
 
mWorld._21 = view->_12;
mWorld._22 = view->_22;
mWorld._23 = view->_32;
 
mWorld._31 = view->_13;
mWorld._32 = view->_23;
mWorld._33 = view->_33;
 
// 適当に座標
mWorld._41 = x; // x
mWorld._42 = y; // y
mWorld._43 = z; // z

 
これでビルボードになる行列ができました!
これは転置行列を知っていないとできませんよね。


あと逆行列くらいは知っていると思うので省きました。



今回長々と書きましたが。
内部を知っていればより多彩な事が出来るのが伝わったでしょうか?

行列はまだまだ多くの事ができるので気になる人はぐぐってね!


説明を省きまくっているので色々解りにくいかもですが、
これから3Dの勉強しようと言う人の役に立てばと思います。



以上!!


誤記、誤字、脱字勘弁してください。
久々に書いたんだからw

PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

無題

  • by ありません
  • URL
  • 2012/02/04(Sat)01:26
  • Edit
ぬいた+.(・∀・).+♪ http://l7i7.com/

TRACKBACK

Trackback URL:

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]