BLOGブログ

2020.08.05UE4/Blueprint

[UE4]UE4の三角関数と角度の扱い

執筆バージョン: Unreal Engine 4.24

 

Blueprint及びMaterialにおける三角関数の話です。サインとかコサインとかのアレです。

 

角度について

ちょっと前置きです。

UE4というより一般的な話になりますが、角度のメジャーな表現には弧度法、度数法の2種類があります。

 

弧度法(Radian)

弧度法とは、円弧の長さと半径との比率によって角度を表現する方法です。

つまり上の図で青い円弧の長さをL、円の半径をRとしたとき

θ = L/R

となるような値θが角度の弧度法表現です。

長さ同士の比なので次元はなく単位もとくにありませんが、便宜上数字の後にradと付けることがあります。

円周の長さは2πRなので、一周を表す角度は2πとなります。

半周はπ、直角は0.5πです。

プログラミングにおいて断りなしにsinやcosといった関数が出てきた場合、パラメータには弧度法での値が期待されてると考えるのが普通です。

度数法(Degree)

一周をなんとなく割り切りやすくて便利そうな360°とし、角度と円弧の長さが比例するよう定めるのが度数法です。

小学校で習います。

ご存知の通り半周が180°、直角が90°となります。

度数法で角度を記述する場合、数字の右上に°を付けるのが決まりです。

整数によって日常的に扱うことの多い角度(90°、180°、60°など)を表現できるため、

日常生活においてはこちらを用いることが多いです。

 

Blueprintの三角関数

弧度法バージョン三角関数

(Radians)と付くものを選択したときに配置されるのが弧度法バージョンの三角関数です。

弧度法での値を左につないで入力します。

逆関数のasin, acos等もあり、これらは弧度法の値を出力します。

 

これらが基本ではあるのですが、UE4で姿勢の回転を扱うRotatorの成分が度数法なこともあり、

次の度数法バージョンの三角関数が便利なことも多いです。

 

度数法バージョン三角関数

(Degrees)と付くものを選択すると度数法バージョンになります。

なんか後ろに”d”が付いています。多分”d”egreeということでしょう。

逆関数のacosd, asind等もあり、度数法の値を出力します。

 

Materialの三角関数

変わって、Material内で使用できるものです。

三角関数ノード

Materialでも三角関数はよく使用するので、当然備わっています。

はじめは省略されていない綴りを見慣れないかもしれませんが、すぐ馴染むでしょう。

 

弧度法、度数法どちらの値を入力すればいいのかと思い説明文を表示してみると下記のように書かれています。

これを見て、弧度法を想定して使用すると困惑することになります。

 

おそらく説明文が古く、

実際にはノード選択時にDetailsに出るPeriodというパラメータの設定値を一周分とする、少し珍しい形式の入力を要求します。

デフォルトでは1.0で一周です。

試しにUV座標の横軸成分(U)を渡してみると、以下のような絵が得られます。

Uの値はプレビュー部分の左端から右端までで0~1に変化するので、Cosineの値は1→ー1→1のように一周します(0以下の部分は黒く表示されます)。

Periodを0.5に設定すると下のようになり、2周期分の出力になっていることが分かるかと思います。

 

説明文から察するに、幾何学的な用途というよりも単に周期的な変化を表現するために用いることを想定しているためこのような仕様になっているのでしょう。

ただし、通常はSine/Cosineの逆関数と考えられるArcsine、ArccosineにおいてはPeriodの設定がなく、普通に弧度法の値を出力します。

つまり基本的には逆関数の関係ではありません。注意が必要です。

 

Sine/Cosineに弧度法の値を渡して使いたい場合は2πの近似値をPeriodに突っ込むことになります。

ただしノードを配置する度に設定が必要であり、かつノードを選択しなければ設定が分からないため、見つかりにくいバグ(意図と異なる表示)の原因になります。

2πの値をどうするのかという微妙な悩みも生じます。

また、生成されるシェーダーコードは↓こうです(赤丸の部分は2π/Periodの計算結果)。

(ややこしい話かつ余談ですが、Sineの左側に繋いだものによってはMaterialコンパイラの高度な最適化処理が働き事前に計算された値や変数に置き換わってsinがなくなります)。

Periodの値に高精度な2πを入れようとしても小数の精度の関係で上画像の桁数が限界であり、誤差が残ります(このことが表示に有意な影響を及ぼすケースは稀でしょうが)。

 

三角関数が必要な場合は素直にCustomノード内の組み込み関数を使用する方が精神衛生上は良いかもしれません。

 

シェーダー組み込み関数

Customノード内でsin, cos 等を使用できます。

これらは弧度法のみを扱います。

 

 

まとめ

一口に三角関数と言っても角度の扱いが一通りではなく、使用する際にはその違いに注意が必要です(とくにマテリアル)。