getOrthogonalBasis
即ち、normalを渡すとbinormalとtangentを適当に決めて mat3 を作ってくれるやつ
その他、カメラの回転・レイ方向の決定・重点サンプリングでの方向ベクトルの生成など色々使えます
”orthogonal” が「直交基底」を表すのに対して、「正規直交基底」は "orthonormal" なので、この関数もgetOrthonormalBasisと呼ぶほうがより正確
でも、正規直交基底 ⊂ 直交基底なので、間違っちゃいないのでいいよ別に
以下の論文で議論されている
実装
code:glsl
mat3 getOrthogonalBasis(vec3 z) {
z = normalize(z);
vec3 up = abs(z.y) < 0.99 ? vec3(0.0, 1.0, 0.0) : vec3(0.0, 0.0, 1.0);
vec3 x = normalize(cross(up, z));
return mat3(x, cross(z, x), z);
}
入力となるベクトルとは別にもう一本ベクトルを用意しなきゃいけないが、いろいろ択がある