一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。

逆行列についての備忘録

ゲームにおける各行列

オフセット

| 1 0 0 0 |

| 0 1 0 0 |
| 0 0 1 0 |

| x y z 1 |

スケール

| x 0 0 0 |

| 0 y 0 0 |

| 0 0 z 0 |

| 0 0 0 1 |

回転

X軸

| 1    0       0    0 |

| 0  cosθ  sinθ 0 |

| 0 -sinθ  cos    0|

| 0    0       0    1 |

Y軸

| cosθ 0 -sinθ 0 |

|   0    1     0   0 |

| sinθ 0   cosθ 0|

|  0    0      0   1 |

Z軸

| cosθ sinθ 0 0 |

|-sinθ cosθ 0 0 |

|  0      0     1 0|

|  0      0     0 1|

回転は面倒くさい。

各行列を掛け合わせることで連続的な変換になる。かける順で結果が変わる。基本的にはスケール、回転、オフセットの順でかける。

 

逆行列

|_11 _12 _13 _14|

|_21 _22 _23 _24|

|_31 _32 _33 _34|

|_41 _42 _43 _44|

と対応する行列を掛けることで結果が

|1 0 0 0|

|0 1 0 0|

|0 0 1 0|

|0 0 0 1|

になる行列のこと。これを利用することでゲーム上ではワールド座標系からローカル座標系に変換することができる。

 

4行4列の逆行列の求め方

余因子行列を用いる方法、掃き出し法を用いる方法がある。

4行4列の逆行列を求めるには、 余因子行列を用いる方法と、 掃き出し法を用いる方法の二つがある。

 

うだうだとたくさん書いたが実はUE4ではBPでは行列の取得はできない。

代わりにTransformを受け取ることができ、そこにはLocation、Rotation、Scaleが格納されており非常に操作しやすい。

 

今回はこれを使って↓のようなミニマップ的なものを作るための土台を作るためのBP操作の備忘録。

f:id:oneday-memorandum:20170716215357g:plain

 

ただし今回のBPはVR用の備忘録なので3D空間に配置したメッシュとメッシュの座標を合わせるだけ。基本的には同じような感じで2D⇔3Dができる。

 

①サイズの異なるメッシュの作成

f:id:oneday-memorandum:20170716215411p:plain

f:id:oneday-memorandum:20170716215403p:plain

 

配置

f:id:oneday-memorandum:20170716215419p:plain

 

②とりあえずデバッグ用にカメラ向きの先にレイを飛ばす

f:id:oneday-memorandum:20170716215432p:plain

 

当たったオブジェクトを判別。相互で位置の共有ができるようにするため。

f:id:oneday-memorandum:20170716215438p:plain

 

クリックしたときにレイのヒットしていたポイントにSphereを出すために値を保存

 

f:id:oneday-memorandum:20170716215443p:plain


③ヒットしたオブジェクトのTransformと位置を共有したい先のオブジェクトの逆行列後のLocationを取得。相互に使用するため2つ用意した。UE4ではInverseTransformLocationがその座標系に合わせて逆行列を掛けローカル座標にするといった(解釈間違ってるかも?)有能なノードがあるのでそれを使用。

f:id:oneday-memorandum:20170716215454p:plain

 

逆行列してローカル座標系にしたLocation共有先のTransformをかける。

マジックナンバーが腹立たしいが解決方法がわからず。

f:id:oneday-memorandum:20170716215501p:plain

イメージ的にはこんな感じしたものを元に戻す感じ。

f:id:oneday-memorandum:20170716220412p:plain

それらを配置するように値を保存し、そこにSphereをスポーンするような処理を書いてやる。

f:id:oneday-memorandum:20170716215513p:plain

ちょっと広めに見たらこんな感じ

f:id:oneday-memorandum:20170716215526p:plain

 

結果

こうなる

f:id:oneday-memorandum:20170716215531g:plain

f:id:oneday-memorandum:20170716215618g:plain

処理不可がそこそこ食いそうな気がするのでもう少し処理不可を軽減したいのであれば、限定的な使い方ではあるが、基準点を2つ用意して位置の最大値最小値を計算して合わせる方法があるがこちらは力技感があるのでがんばってください。

 

逆行列はアニメーションモデルを読み込んだ際にボーンの親子関係などで触った以来だったがUE4では難なく使用できた。

こいつを使うことで侵入してきたものがどちらから侵入してきたかと言った取得もできるので非常に有用。

 

不備や間違いなどあればtwitterで教えていただけると助かります。

twitter.com