リー代数で 3 次元回転! / レイトレ合宿 10

4K Views

October 14, 24

スライド概要

2024/10/11 - 13 に初島で開催されたレイトレ合宿 10 で発表したセミナー資料です。
リー代数による回転公式を利用して、GGX の計算に現れるヤコビアンを計算しよう、というのが主な内容です。
リー代数の数学的側面にはほとんど触れていません(タイトル詐欺)

Q: リー代数を使わなくても計算できるのでは?
A: せっかくなので使ってみたかったのと、リー代数の回転公式を紹介したかったので…

X: Twitter: https://x.com/_Pheema_
レイトレ合宿 10: https://sites.google.com/view/rtcamp10

profile-image

ゲームプログラマーのようななにか

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

レイトレ合宿 10 セミナー リー代数で 3 次元回転!🌪️ Pheema, レイトレ合宿 10 in 初島 (2024/10)

2.

今日これだけは覚えて帰ってください 2 / 23

3.

今日覚えて帰ってもらいたいこと ⊤ ^ = [n ^x n ^y n ^ z ] を軸とした θ [rad] の 3 次元の回転行列 R は以下の式で表せる! 単位ベクトル n ​ ​ ​ 0 R = exp θ n ^z −n ^y ​ ​ ​ ​ ​ −n ^z 0 n ^x ​ ​ n ^y −n ^x 0 ​ ​ ​ ​ ​ ​ exp の指数に反対称行列 (X ⊤ = −X ) が乗る形で表される exp なので θ で簡単に微分ができる!😊 3 / 23

4.

4 / 23

5.

前置き 今回はリー群・リー代数の詳細な説明はしません 回転の微分や微小回転を扱いたい、というときに思い出してくれると良いな…という内容です 5 / 23

6.

いろいろな回転の表現方法 6 / 23

7.

3 次元回転 (軸ごとの回転) cos θz Rz (θz ) = sin θz 0 ​ ​ ​ ​ ​ ​ − sin θz cos θz 0 ​ ​ ​ 0 1 0 , Rx (θx ) = 0 1 0 ​ ​ ​ ​ ​ ​ 0 cos θx sin θx 0 cos θy − sin θx , Ry (θy ) = 0 cos θx − sin θy ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 0 1 0 ​ sin θy 0 cos θy ​ ​ R = Rz (θz ) Rx (θx ) Ry (θy ) ​ ​ ​ ​ ​ ​ 7 / 23

8.

ロドリゲスの回転公式 ベクトル r を単位ベクトル n ^ まわりに θ [rad] 回転させるとき、回転後のベクトル r ′ は以下の式で表せる! r ′ = r cos θ + n ^ × r sin θ + n ^ (n ^ ⋅ r ) (1 − cos θ) 8 / 23

9.

クオータニオンによる方法 ベクトル a = ax i + ay j + az k を単位ベクトル n ^ まわりに θ [rad] 回転させるとき、回転後のベクトル a′ は以下の式で表 ​ ​ ​ せる! a′ = qaq † ただし q = cos θ θ ^xi + n ^y j + n ^ z k) + sin (n 2 2 ​ ​ ​ ​ ​ ※ 上式はロドリゲスの回転公式と同じ式に変形できる 9 / 23

10.

リー代数による方法 ⊤ ^ = [n ^x n ^y n ^ z ] を軸とした θ [rad] の 3 次元の回転行列 R は以下の式で表せる 単位ベクトル n ​ ​ ​ R = exp (θA) ただし 0 ^z A= n −n ^y ​ ​ ​ ​ −n ^z 0 n ^x ​ ​ n ^y −n ^x 0 ​ ​ ​ ​ ​ である 10 / 23

11.

GGX に現れるヤコビアン 反射が絡む計算ではよく以下のヤコビアンが登場することがある ∂ωh 1 = ∂ωo 4 (v ^o ⋅ v ^h) ​ ​ ​ ​ ​ ​ ​ ​ だいたい右のような図で説明されることが多い もしくは単位球面上の賢い変数変換を使って導出される 反射の式から計算で導出することはできないか…🤔 [Walter07] の図 6 に基づいたヤコビアンの導出 11 / 23

12.

反射の式から計算してみる ハーフベクトルが e ^z となるような座標系を考える ​ ^z と入射方向ベクトル v ^ i が与えられたと ハーフベクトル e ​ ​ き、反射ベクトル v ^ o は以下の式で表せる ​ ^ o = 2 (e ^z ⋅ v ^i) e ^z − v ^i v ​ ​ ​ ​ ​ ​ 計算方針 ^z を x 軸, y 軸周りにそれぞれ微小回転さ ハーフベクトル e ​ せ、ハーフベクトルが動く単位球面上領域の面積 (= 立体 角) を Δωh とする ​ ^ o が動く 上記のハーフベクトルの変化に応じて反射ベクトル v ​ ハーフベクトルの微小変化に伴う反射方向の微小変化 単位球面上領域の面積 (= 立体角) を Δωo とする ​ 12 / 23

13.

ハーフベクトルを x 軸周りに Δθ だけ微小回転 x 軸周りに θ 回転させる行列 Rx (θ) は以下のように表せる ​ 0 Jx = 0 0 Rx (θ) = exp (θJx ) ​ ​ ​ ​ ​ 0 0 1 ​ ​ 0 −1 0 ​ ​ ​ ^z を Rx で回転したときの反射の式は e ^z → exp(θJx )e ^z として ハーフベクトル e ​ ​ ​ ​ ​ ^ o = 2 [exp(θJx )e ^z ⋅ v ^ i ] exp(θJx )e ^z − v ^i v ∂v ^o = 2 [Jx exp(θJx )e ^z ⋅ v ^ i ] exp(θJx )e ^z + 2 [exp(θJx )e ^z ⋅ v ^ i ] Jx exp(θJx )e ^z ⇒ ∂θ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ すなわち、 θ = 0 付近で Δθ だけ回転させたときの反射ベクトルの変化 Δv ^ o,Δθ は以下のように表せる ​ Δv ^ o,Δθ = [2 (Jx e ^z ⋅ v ^i) e ^z + 2 (e ^z ⋅ v ^ i ) Jx e ^z ] Δθ (∵ exp O = E ) ^y ⋅ v ^i) e ^z + 2 (e ^z ⋅ v ^ i ) (−e ^y )] Δθ = [2 ( − e ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 13 / 23

14.

ハーフベクトルを y 軸周りに Δϕ だけ微小回転 y 軸周りに ϕ だけ回転させる行列 Ry (ϕ) は以下のように表せる ​ 0 Jy = 0 −1 Ry (ϕ) = exp(ϕJy ) ​ ​ ​ ​ ​ 0 0 0 ​ 1 0 0 ​ ​ ​ ​ ^z を Ry で回転したときの反射の式は e ^z → exp(θJy )e ^z として よって、ハーフベクトル e ​ ​ ​ ​ ​ ^ o = 2 [exp(ϕJy )e ^z ⋅ v ^ i ] exp(ϕJy )e ^z − v ^i v ∂v ^o = 2 [Jy exp(ϕJy )e ^z ⋅ v ^ i ] exp(ϕJy )e ^z + 2 [exp(ϕJy )e ^z ⋅ v ^ i ] Jy exp(ϕJy )e ^z ⇒ ∂ϕ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ すなわち、 ϕ = 0 付近で Δϕ だけ回転させたときの反射ベクトルの変化 Δv ^ o,Δϕ は以下のように表せる ​ Δv ^ o,Δϕ = [2 (Jy e ^z ⋅ v ^i) e ^z + 2 (e ^z ⋅ v ^ i ) Jy e ^z ] Δϕ ​ ​ ​ ​ ​ ​ ​ ​ ​ = [2 (e ^x ⋅ v ^i) e ^z + 2 (e ^z ⋅ v ^i) e ^x ] Δϕ ​ ​ ​ ​ ​ ​ (∵ exp O = E ) ​ ​ 14 / 23

15.

立体角の比を求める ∣Δωo ∣ = ∣Δv ^ o,Δθ × Δv ^ o,Δθ ∣ ​ ​ ​ = ∣[2 (−e ^y ⋅ v ^i) e ^z + 2 (e ^z ⋅ v ^ i ) (−e ^y )] Δθ × [2 (e ^x ⋅ v ^i) e ^z + 2 (e ^z ⋅ v ^i) e ^x ] Δϕ∣ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ 2 = −4v^i,y v^i,z e ^y − 4v^i,z v^i,x e ^z + 4v^i,z e ^z ∣ΔθΔϕ∣ ​ ​ = 4v^i,z ​ ​ ​ ​ ​ −v^i,x −v^i,y v^i,z ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ​ ∣ΔθΔϕ∣ ​ ​ = 4v^i,z ∣ΔθΔϕ∣ ​ = 4 (v ^i ⋅ e ^z ) ∣ΔθΔϕ∣ ​ ​ = 4 (v ^i ⋅ e ^z ) ∣Δωh ∣ ​ ​ ​ ∴ ∂ωh 1 = ∂ωo 4 (v ^i ⋅ e ^z ) ​ ​ ​ ​ 計算できた!嬉しい!😊 ​ ​ ​ ​ 15 / 23

16.

リー代数による回転の応用先 回転の微分や微小回転が必要なとき 例: 勾配法による最適化問題(点群のマッチング等) 手計算 16 / 23

17.

最後に 17 / 23

18.

僕のことは忘れても 18 / 23

19.

これだけは覚えて帰ってください ⊤ ^ = [n ^x n ^y n ^ z ] を軸とした θ [rad] の 3 次元の回転行列 R は以下の式で表せる! 単位ベクトル n ​ ​ ​ 0 R = exp θ n ^z −n ^y ​ ​ ​ ​ ​ −n ^z 0 n ^x ​ ​ n ^y −n ^x 0 ​ ​ ​ ​ ​ ​ 19 / 23

20.

参考資料 3次元回転 パラメータ計算とリー代数による最適化 CV・CG・ロボティクスのためのリー群・リー代数入門 [Walter07] Bruce Walter, Stephen R. Marschner, Hongsong Li, and Kenneth E. Torrance. 2007. Microfacet Models for Refraction Through Rough Surfaces. In EGSR ’07. 195–206. https://doi.org/10.2312/EGWR/EGSR07/195-206 20 / 23

21.

レイトレ合宿 10 セミナー リー代数で 3 次元回転!🌪️ Pheema, レイトレ合宿 10 in 初島 (2024/10) 21 / 23

22.

補足 22 / 23

23.

行列の指数関数 exp(A) = E + A + 1 2 1 A + A3 + ⋯ 2! 3! ​ ​ 行列 A が A = P −1 XP (X = diag(λ1 , λ2 , …))と対角化できるとき、行列の指数関数は以下のように表せる ​ ​ 1 −1 2 1 P X P + P −1 X 3 P + ⋯ 2! 3! 1 1 = P −1 (E + X + X 2 + X 3 + ⋯ ) P 2! 3! = P −1 diag (exp λ1 , exp λ2 , …) P exp(A) = E + P −1 XP + ​ ​ ​ ​ ​ ​ ​ ​ 23 / 23