WARNING この方法は基底を構築しない.
鏡映を利用する方法# 鏡映を利用する方法を確認する Comparing ONB Accuracy で助言を頂いたので整理をする.
mla , 2025-01-12 Interesting. Simpler to derive Frisvad’s equation with a 3D reflection rather than using quaternions (given unit vectors p,q, reflection in plane with normal p-q exchanges p and q).
ベクトルの鏡映は次のように定義される.
r = v − 2 ( v ⋅ n ^ ) n ^ \boldsymbol{r} =\boldsymbol{v} - 2 (\boldsymbol{v}\cdot\hat{\boldsymbol{n}}) \hat{\boldsymbol{n}} r = v − 2 ( v ⋅ n ^ ) n ^ 一般的な場合から考える.
q = p − 2 ( p ⋅ n ^ ) n ^ = p − 2 ( p ⋅ p − q ∥ p − q ∥ ) p − q ∥ p − q ∥ = p − 2 ( ∥ p ∥ 2 − p ⋅ q ∥ p ∥ 2 + ∥ q ∥ 2 − 2 p ⋅ q ) ( p − q ) \begin{align*} \boldsymbol{q} &=\boldsymbol{p} - 2 (\boldsymbol{p}\cdot\hat{\boldsymbol{n}}) \hat{\boldsymbol{n}}\\ &=\boldsymbol{p} - 2 \left(\boldsymbol{p}\cdot\frac{\boldsymbol{p} - \boldsymbol{q}}{\|\boldsymbol{p} - \boldsymbol{q}\|}\right) \frac{\boldsymbol{p} - \boldsymbol{q}}{\|\boldsymbol{p} - \boldsymbol{q}\|}\\ &=\boldsymbol{p} - 2 \left(\frac{\|\boldsymbol{p}\|^{2} - \boldsymbol{p}\cdot\boldsymbol{q}}{\|\boldsymbol{p}\|^{2} + \|\boldsymbol{q}\|^{2} - 2 \boldsymbol{p}\cdot\boldsymbol{q}}\right) (\boldsymbol{p} - \boldsymbol{q}) \end{align*} q = p − 2 ( p ⋅ n ^ ) n ^ = p − 2 ( p ⋅ ∥ p − q ∥ p − q ) ∥ p − q ∥ p − q = p − 2 ( ∥ p ∥ 2 + ∥ q ∥ 2 − 2 p ⋅ q ∥ p ∥ 2 − p ⋅ q ) ( p − q ) ここで p , q \boldsymbol{p}, \boldsymbol{q} p , q を単位ベクトルとすると, 次のように p \boldsymbol{p} p と q \boldsymbol{q} q を交換する式になっていることがわかる.
q = p − ( 1 − p ⋅ q 1 − p ⋅ q ) ( p − q ) = q \boldsymbol{q} =\boldsymbol{p} - \left(\frac{1 - \boldsymbol{p}\cdot\boldsymbol{q}}{1 - \boldsymbol{p}\cdot\boldsymbol{q}}\right) (\boldsymbol{p} - \boldsymbol{q}) =\boldsymbol{q} q = p − ( 1 − p ⋅ q 1 − p ⋅ q ) ( p − q ) = q 特異点は p = q \boldsymbol{p}=\boldsymbol{q} p = q となるが, 交換は不要ということに他ならない. 単位ベクトルであることを強調すると次のようになる.
q ^ = p ^ − 2 ( p ^ ⋅ n ^ ) n ^ = p ^ − ( p ^ ⋅ p ^ − q ^ 1 − p ^ ⋅ q ^ ) ( p ^ − q ^ ) = q ^ \hat{\boldsymbol{q}} =\hat{\boldsymbol{p}} - 2 (\hat{\boldsymbol{p}}\cdot\hat{\boldsymbol{n}}) \hat{\boldsymbol{n}} =\hat{\boldsymbol{p}} - \left(\hat{\boldsymbol{p}}\cdot\frac{\hat{\boldsymbol{p}} - \hat{\boldsymbol{q}}}{1 - \hat{\boldsymbol{p}}\cdot\hat{\boldsymbol{q}}}\right) (\hat{\boldsymbol{p}} - \hat{\boldsymbol{q}}) =\hat{\boldsymbol{q}} q ^ = p ^ − 2 ( p ^ ⋅ n ^ ) n ^ = p ^ − ( p ^ ⋅ 1 − p ^ ⋅ q ^ p ^ − q ^ ) ( p ^ − q ^ ) = q ^ この交換式を使って s ^ = ( 0 , 0 , 1 ) T \hat{\boldsymbol{s}}=(0,0,1)^{\mathsf{T}} s ^ = ( 0 , 0 , 1 ) T から t ^ \hat{\boldsymbol{t}} t ^ への回転とするならば,
ω = ⊥ ω − 2 ( ⊥ ω ⋅ n ^ ) n ^ = ⊥ ω − 2 ( ⊥ ω ⋅ s ^ − t ^ ∥ s ^ − t ^ ∥ ) s ^ − t ^ ∥ s ^ − t ^ ∥ = ⊥ ω − ( ⊥ ω ⋅ ( s ^ − t ^ ) 1 − t ^ z ) ( s ^ − t ^ ) \begin{align*} \boldsymbol{\omega} &={}_{\perp}\boldsymbol{\omega} - 2 ({}_{\perp}\boldsymbol{\omega}\cdot\hat{\boldsymbol{n}}) \hat{\boldsymbol{n}}\\ &={}_{\perp}\boldsymbol{\omega} - 2 \left({}_{\perp}\boldsymbol{\omega}\cdot\frac{\hat{\boldsymbol{s}} - \hat{\boldsymbol{t}}}{\|\hat{\boldsymbol{s}} - \hat{\boldsymbol{t}}\|}\right) \frac{\hat{\boldsymbol{s}} - \hat{\boldsymbol{t}}}{\|\hat{\boldsymbol{s}} - \hat{\boldsymbol{t}}\|}\\ &={}_{\perp}\boldsymbol{\omega} - \left(\frac{{}_{\perp}\boldsymbol{\omega}\cdot(\hat{\boldsymbol{s}} - \hat{\boldsymbol{t}})}{1 - \hat{t}_{z}}\right) (\hat{\boldsymbol{s}} - \hat{\boldsymbol{t}})\\ \end{align*} ω = ⊥ ω − 2 ( ⊥ ω ⋅ n ^ ) n ^ = ⊥ ω − 2 ( ⊥ ω ⋅ ∥ s ^ − t ^ ∥ s ^ − t ^ ) ∥ s ^ − t ^ ∥ s ^ − t ^ = ⊥ ω − ( 1 − t ^ z ⊥ ω ⋅ ( s ^ − t ^ ) ) ( s ^ − t ^ ) t ^ z = 1 \hat{t}_{z}=1 t ^ z = 1 のときに特異点となるが, これは s ^ = t ^ \hat{\boldsymbol{s}}=\hat{\boldsymbol{t}} s ^ = t ^ なので回転は不要ということに他ならない.
Issues# 接空間の z z z 軸に対称な分布に適用するような場合は問題なさそうに見えるが, Frisvad の方法に合わせるなら対応が必要になるのではないだろうか?
見通しをよくするため 2 次元で考える.
2次元で動作を確認する s ^ \hat{\boldsymbol{s}} s ^ に対する ⊥ ω {}_{\perp}\boldsymbol{\omega} ⊥ ω と t ^ \hat{\boldsymbol{t}} t ^ に対する ω \boldsymbol{\omega} ω は直感に反している. 図とベクトルの鏡映式を眺めると, ⊥ ω {}_{\perp}\boldsymbol{\omega} ⊥ ω をある平面に対して反転させる必要があるようだ.
ある平面の法線ベクトル m ^ \hat{\boldsymbol{m}} m ^ は次のようになる.
m = n ^ − ( s ^ ⋅ n ^ ) s ^ m ^ = { m ∥ m ∥ ∣ s ^ ⋅ n ^ ∣ < 1 0 otherwise \begin{align*} \boldsymbol{m} &=\hat{\boldsymbol{n}} - (\hat{\boldsymbol{s}}\cdot\hat{\boldsymbol{n}}) \hat{\boldsymbol{s}}\\ \hat{\boldsymbol{m}} &= \begin{cases} \frac{\boldsymbol{m}}{\|\boldsymbol{m}\|} & |\hat{\boldsymbol{s}}\cdot\hat{\boldsymbol{n}}|\lt 1\\ \boldsymbol{0} & \text{otherwise} \end{cases} \end{align*} m m ^ = n ^ − ( s ^ ⋅ n ^ ) s ^ = { ∥ m ∥ m 0 ∣ s ^ ⋅ n ^ ∣ < 1 otherwise その平面に対して反転すると次のようになる.
⊥ ω ′ = { ⊥ ω − 2 ( m ^ ⋅ ⊥ ω ) m ^ ∣ s ^ ⋅ t ^ ∣ < 1 ⊥ ω otherwise {}_{\perp}\boldsymbol{\omega}^{'} = \begin{cases} {}_{\perp}\boldsymbol{\omega} - 2 (\hat{\boldsymbol{m}}\cdot{}_{\perp}\boldsymbol{\omega}) \hat{\boldsymbol{m}} & |\hat{\boldsymbol{s}}\cdot\hat{\boldsymbol{t}}|\lt 1\\ {}_{\perp}\boldsymbol{\omega} & \text{otherwise} \end{cases} ⊥ ω ′ = { ⊥ ω − 2 ( m ^ ⋅ ⊥ ω ) m ^ ⊥ ω ∣ s ^ ⋅ t ^ ∣ < 1 otherwise ベクトルの鏡映式に代入すると, 直感に従った結果を得る.
ω ′ = ⊥ ω ′ − 2 ( ⊥ ω ′ ⋅ n ^ ) n ^ \boldsymbol{\omega}^{'} ={}_{\perp}\boldsymbol{\omega}^{'} - 2 ({}_{\perp}\boldsymbol{\omega}^{'}\cdot\hat{\boldsymbol{n}}) \hat{\boldsymbol{n}} ω ′ = ⊥ ω ′ − 2 ( ⊥ ω ′ ⋅ n ^ ) n ^ Acknowledgements# 鏡映を利用する方法を共有して頂いた mla 氏に感謝いたします.