Unity3Dゲームの計算では行列がよく出てきます。行列について調べると用語や計算方法ばかり出てきて、いつのまにか目的を見失いがちです。ゲームに使う部分だけであれば行列はそんなに難しくないのでこの記事でまとめてみます。行列自体はただのグリッド状の数字の羅列です。2)のように、3次元のベクトルで表されます。これは見方を変えれば1行×3列の行列としてみることができます。(正確には4列として扱いますがこれは後程説明します)次に、ゲームではよく変換行列という行列が使われます。これは例えば「X軸方向に2動かす」という情報が含まれた行列です。2)に掛け合わせることで、X軸方向に2動かした座標が得られます。このようにゲームでは座標を変換するために行列を使います。平行移動行列を作ってみる実際に座標を移動させるための行列を作って移動させてみます。移動させるための行列は次のように作ることができます。X軸方向にTx、Y軸方向にTy、Z軸方向にTz動かしたいとき、このあたりはこう作るものだと覚えておけばいいと思います。それでは実際に数値を入れて試してみましょう。一点注意点で、上の行列式を見ればわかるように、変換行列は4行×4列です。行列の積は掛けられる側の列数と掛ける側の行数があっていなければいけないので、座標の4つ目の列に1を入れて4列の行列とします。行列を計算するとちゃんと移動できました。いろんな変換行列を作るこのように変換行列は自分で作ることができるのですが、直接行列に値をいれて作る機会は僕はあまりないです。UnityのMatrix4x4クラスを使うといろんな行列が簡単に作れるので、このやり方を紹介しておきます。matrix.MultiplyPoint(point);説明はコメントの通りです。こんな感じで直観的に行列を作ることができます。順番で処理されていることがわかります。座標変換行列から移動値を得る上記のように、スケールや回転、移動情報の入った下記のような変換行列が得られます。この合成後の変換行列からもいろんな情報が得られます。変換行列から移動値を得るには4行目を見ます。1,2,3列目がそれぞれx,y,z軸方向への移動値です。座標変換行列からスケール値を得る同じようにスケール値を得ることができます。スケール値は各行の長さと等しくなります。上で平行移動行列を作った時に、元の座標の4列目の値(W値)に1を入れました。ここに1の代わりに0を入れると、変換行列のうち、平行移動の情報が適用されなくなるという性質が生まれます。この性質を利用すると、変換行列はそのままベクトルの変換に使うことができます。ベクトルは位置情報をもたず方向と長さの情報だけをもつため、平行移動行列を適用してはいけないのです。よって、ベクトルを変換するときにはW値に0を入れることで変換することができます。座標変換行列から変換後のXYZ軸の向きを表すベクトルを得るさてこのベクトルの性質を使うと、座標変換行列から変換後の各軸の正方向を表すベクトルを簡単に得ることができます。これは単純に、下図のように1〜3行目を3次元のベクトルにするだけです。0)に変換行列を掛けると変換後のX軸方向が求められるというだけの話です。変換後の軸のベクトルから座標変換行列を作る逆に、変換後の各軸の方向が分かっていれば、その座標空間に変換する行列が求められることになります。これはノーマルマッピングなどで接空間の変換行列を求めるときなどに使われているのを見ます。回転行列を転置すれば逆行列が得られる直行行列を転置すると逆行列が得られます。回転行列は直行行列です。回転行列を転置すれば逆行列が得られます。転置の処理負荷は比較的軽いので、使える場面では積極的に使っていきたい性質です。»プロフィールUnityエンジニア。グラフィックスへの興味が強めです。Blur(渦巻ブラー)のポストエフェクトを実装する月別アーカイブはてなブログをはじめよう!halya_11さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。