Happy My Life

日常とか技術とか

ゲームの数学 for UE4 行列編

ゲームアプリの数学 Unityで学ぶ基礎からシェーダーまでの4章は行列(Matrix)の話が書かれている。では、これを当てはめてみる

じゃあ、これがUE4だとどうなるのか?について解説してみる。

行列はほぼ扱えない

結論から言うと、BluePrintでは、行列はほとんど扱えないようになっている(C++のコードについては未調査)。

ほんの少しだけ行列はサポートしているのだが、BluePrintでサポートされているのは、こんな感じ。ほとんど扱えないに等しい。

matrix_func

行列が無い代わりにRotate型とTransform型が定義されている。なので、行列を使った処理は、Rotate型とTransform型を併用して処理する。

Rotate型とTransform型にういて大ざっぱに説明すると次の通り。

  • Rotate型 : 回転のみが指定できる(スケールが無い3x3行列)
  • Transform型 : 回転、スケール、座標が指定できる(4x4行列)

今回はBlueprintのみを追い掛けているが、そのうちC++のソースを追い掛けて、ちゃんと検証してみるつもり。

あと、Rotate型で角度を示す値の単位はdegreeとなり、角度はX軸、Y軸、Z軸は軸の正方向に向かって時計回りが正となる。

Rotate型

Rotate型は、ベクトルの向きを変更(つまり、回転)するのに利用するのがメインになるかと。

X軸、Y軸、Z軸を中心とした回転角は、UE4では、それぞれ、Roll、Pitch、Yawと定義されている

break_rotator

Rotate型の変数に値を代入する際には、角度(degree)を指定する方法と、ベクトルと軸や平面を元に生成する方法の2つがある。結果的には、後者をよく使う事になるんじゃないかな、たぶん。

分解と生成

Rotate型も、他の例に漏れず、分解はBreakRotate、生成はMakeRotateという関数が用意されている。

break_make_rot

角度の取得

ベクトルと軸や面を指定して、なす角を取得する、という方法が用意されている。「Make Rot from なんとか」というのがそう。

make_rot_xyz

make_rot_list

その他

角度の倍率(スケール)が設定できる。ここのスケールは、あくまで角度を○○倍する、という意味。

scalerotator

Transfrom型

こちらは、スケール、位置、回転のすべての要素を示す型である。

ただ、Blueprintで定義されている関数を見ている限りは、Transform型は何かの演算に利用するというよりも、メッシュの状態(スケール、位置、向き)を持つために使われているようだ。

分解と生成

おなじみのMakeTransform、BreakTransformが用意されている。

break_transform

演算

あとはTransform同士を合成するとか、Inverseするものがあったりする。

transform-list

あとは、Leap(線形補間)ってのもあるのだが、これは、後日解説しようかと。