last modified: 2019-07-04 01:21:24
このページではMathJaxによる数式表示を行っています。対応しているブラウザーであれば少し待てば数式が表示されます。
(画面左下にMathJaxのタイプセットステータスが表示されます。)
環境によっては表示が崩れているかもしれません。その際はブラウザーを変更してみてください。

シェーディングのための正規直交基底 (Orthonormal Basis)

このページはレイトレ合宿7 アドベントカレンダーの記事として制作しました。
レイトレ合宿参加者にとってはもはや当たり前の内容だと思いますが...

このページでは、BSDFなどについて考察・実装する際に役立つ、シェーディングのためのローカル座標を構成する正規直交基底の概念について紹介します。

ワールド座標とシェーディング用ローカル座標

BSDFの各種モデルは、法線・接平面ベクトルや入射・出射ベクトル(と種々のパラメター)を用いて表現されており、計算の過程でそれらのベクトルの間でいくらかの演算を行います。直交する法線と接平面ベクトル、それら2つのベクトルに直交するもうひとつの接平面ベクトル(従接線ベクトル)、これら3つのベクトルの単位ベクトルの組を考えることで新たな座標系を構成することが可能です。座標系の各基底ベクトル(この場合はそれぞれ正規化された接線ベクトル、従接線ベクトル、法線ベクトル)の長さが1かつ互いに直交しているため、これは正規直交基底(Orthonormal Basis)と呼ばれるものになります。

正規直交基底を用いて入射・出射ベクトルをローカル座標系内へと変換することで、多くの演算を簡略化することが可能です。例えば入射ベクトル $ \vomega_i $ と法線 $ \vec{n} $ の間の内積 $ \vomega_i \cdot \vec{n} $ を考えてみます。法線を3つ目の基底ベクトルとする正規直交基底を用いて $ \vomega_i $ を変換したものを $ \vomega'_i $ で表す場合、このローカル座標における法線 $ \vec{n}' $ が $ (0, 0, 1) $ で表されるため、内積は単純に $ \vomega_i \cdot \vec{n} = \vomega'_i \cdot \vec{n}' = \omega'_{i, z} $ とすることができます。逆に、BSDFの重点的サンプリングなどを行なう場合に得られる方向はローカル座標系における方向となっていることが一般的なので、この場合にはワールド座標系へと変換する必要があります。もちろんワールド座標系とローカル座標系との間で方向を変換するコストもタダではないですが、複雑なBSDFになるほどメリットのほうが上回ります。

ワールド座標系からローカル座標系への変換

ワールド座標系
(a) ワールド座標系における座標値
ローカル座標系
(b) ローカル座標系における座標値
図1. ワールド座標系とローカル座標系

ワールド座標系において座標 $ (\omega_x, \omega_y, \omega_z) $ で表されるベクトル $ \vomega $ (図1 (a))のローカル座標系における座標 $ (\omega_{l, x}, \omega_{l, y}, \omega_{l, z}) $ は、ローカル座標系を構成する基底ベクトルとの内積を計算することで簡単に求まります(図1 (b))。ここでは基底ベクトルに正規化されたものを用いているため内積だけで済みます。式で表せば次のようになります。 \begin{eqnarray*} \omega_{l, x} = \vx_l \cdot \vomega \\ \omega_{l, y} = \vy_l \cdot \vomega \\ \omega_{l, z} = \vz_l \cdot \vomega \end{eqnarray*} これらの変換は次に示すように行列による計算にまとめることができます。 \begin{eqnarray*} \Prt{ \begin{array}{c} \omega_{l, x} \\ \omega_{l, y} \\ \omega_{l, z} \end{array} } = \Prt{ \begin{array}{c} \vx_l^T \\ \vy_l^T \\ \vz_l^T \end{array} } \vomega \end{eqnarray*} それぞれの基底ベクトルを転置することで行ベクトルとして縦に並べ $ 3 \times 3 $ の行列を構成しています。

ローカル座標系からワールド座標系への変換

ローカル座標からワールド座標への変換も同様に図から考えることも可能ですが、実は正規直交基底に対応する行列、正規直交行列には逆行列が単純に元の行列の転置になるという便利な性質があります。この性質を線形代数の教科書で初めて見たときはふーん(´・_・`)って感じでしたが、このようにCGでの活用を見ると高校数学・大学数学はやはりCGのためにあったのだと確信を深めざるを得ません(思いあがり)。したがってローカル座標中のベクトルに対して上で使った行列の逆行列をかけることで、ローカル座標系からワールド座標系への変換を行うことができます。 \begin{eqnarray*} \vomega = \Prt{ \begin{array}{ccc} \vx_l & \vy_l & \vz_l \end{array} } \Prt{ \begin{array}{c} \omega_{l, x} \\ \omega_{l, y} \\ \omega_{l, z} \end{array} } \end{eqnarray*}

接平面ベクトル

テクスチャー座標の方向と接平面ベクトルの方向
図2. テクスチャー座標の方向と接平面ベクトルの方向
これら2つの方向は独立して設定されうる。この例では異方性BRDFの基準方向の制御にシェーディング用の接平面ベクトル(水色)を、バンプマップによる法線変異の基準方向の決定にテクスチャー座標の方向(オレンジ)を用いている。

3Dモデルを扱う際に、法線は頂点データとして位置やテクスチャー座標とあわせて格納されており、馴染みが深いデータだと思われます。頂点データとして格納されていなくとも、3Dモデルを構成するポリゴンから計算可能です。ポリゴンモデル特有の頂点法線・面法線といったバリエーションはあるものの、法線の意味はほぼ一意に決まるものだと思います。一方で法線とともに基底をなす接平面ベクトルとは一体なんなのでしょうか。3Dモデルデータにもそんなものは一般的には含まれていません。接平面ベクトルが満たすべき性質は法線に対して直交していることですが、この条件だけだと一つ目の接平面ベクトルに関しては無限に多くのベクトルを考えることができてしまい一意に決められません。二つ目の接平面ベクトルは法線と一つ目の接平面ベクトル両方に直交するという条件から一意に求めることができます。

使うべき接平面ベクトルは状況に応じて変わります。等方的なBSDFの場合は、光の入射・出射方向が(双方の間の相対的な方向は保ったまま)法線周りで回転しても反射特性は変化しないため、接平面ベクトルは法線に直交するものから(数値精度の観点で好ましいものはありますが)どれを選んでも問題ありません。一方で異方性のBSDFを扱う場合には、物体のローカル空間において何かしらのルールで定まる向きを与えておかないと、物体の姿勢に応じてBSDFの特性が変化してしまいます。また法線マップやハイトマップによるバンプマップを適用する場合、法線を変異させるための基準方向が必要となります。一般的にはこの基準方向としてテクスチャー座標の方向(uvのuだけが増える向き)を選び、この方向を一つ目の接平面ベクトルであるtangentと呼ぶことも多いです。注意点としては、BSDFの評価に関わる接平面ベクトルと、バンプマップ時に基準とする接平面ベクトルは基本的に異なるベクトルとなるので、正しく使い分ける必要があります。図2に示す例では、異方性BRDFを制御するための接平面ベクトルはオブジェクトの中心軸周りに沿わせて生成していますが、バンプマップのための基準方向はテクスチャー座標の方向から計算しています。

binormal? bitangent?

ところで、2つ目の接平面ベクトルをCGの文脈では「従法線(binormal)」という言葉で表すことが多々あります。一方でたまにはbitangentという表記も見かけるかもしれません。どちらが正しいのでしょうか?それともどっちも正しいのでしょうか。どうやら本来binormalというのは曲"線"に関して使われる言葉であり、ポリゴンメッシュのような曲"面"表現における接平面ベクトルを表す言葉としては誤用らしいです。[MathWorld]

参考文献

  • [MathWorld] Weisstein, Eric W. "Binormal Vector." From MathWorld--A Wolfram Web Resource.

Today : 00000025 Total : 00127988
Copyright © 2019 shocker.