環境:Unreal Engine 5.4.4

前回の記事でシンプルな勾配の計算をしましたが、アクターの姿勢から角度を取ると挙動の細かいノイズも影響してしまうため、レイを飛ばして地面からの法線から勾配やバンク角を計算することにしました。
外積(Cross Product)
UEの座標系では、ライトベクトルはアップベクトルとフォワードベクトルの順で外積を計算する。またフォワードベクトルはライトベクトルとアップベクトルの順で外積を計算する。
バンク角(°)の計算

アクターの座標からレイを飛ばして地面の法線を取得する。
アクターのフォワードベクトルと地面の法線との外積から地面に平行なライトベクトルを計算する。①
アクターのフォワードベクトルとワールドのアップベクトル(0, 0, 1)との外積からワールドに水平なライトベクトルを計算する。②
①と②の角度差が勾配の角度となる。
勾配(%)の計算

アクターの座標からレイを飛ばして地面の法線を取得する。
アクターのライトベクトルと地面の法線との外積から地面に平行なフォワードベクトルを計算する。①
アクターのライトベクトルとワールドのアップベクトル(0, 0, 1)との外積からワールドに水平なフォワードベクトルを計算する。②
①と②の角度差が勾配の角度となる。
最後に角度(°)から勾配(%)に変換している。勾配と角度