複素数における回転の表現と補間について簡単に整理をする。
回転の表現#
定義は
C1:={p∈C∣∣p∣=1}={eθi∣θ∈R}eθi はオイラーの公式1で
eθi=cos(θ)+sin(θ)i補間の方法#
p=a+bi,q=c+di∈C1 間を h∈R で補間する方法。
線形補間#
定義は
LERP(p,q;h)=(1−h)p+hq特徴は
正規化線形補間#
定義は
nLERP(p,q;h)=∣LERP(p,q;h)∣LERP(p,q;h)特徴は
球面線形補間#
定義は
SLERP(p,q;h)=p⋅(p−1⋅q)h=p⋅exp(hlog(p−1⋅q))特徴は
スプライン補間#
定義は
SQUAD(pi,pi+1,si,si+1;h)=SLERP(SLERP(pi,pi+1;h),SLERP(si,si+1;h),2h(1−h))ここで pi,pi+1,si,si+1∈C1 で si は次式で表される。
si=piexp(−4log(pi−1pi−1)+log(pi−1pi+1))eθi の補間#
一般的な回転を表現する複素数での補間は、常に最短円弧を描く補間となる。
なす角が180度を超える場合に最長円弧を描く補間にするには2
- 複素数の偏角の主値の範囲を (−π,π] とし p,q の角度を [0,π) で求める
ϕ={Arg(p)+2πArg(p)if Arg(p)<0otherwiseψ={Arg(q)+2πArg(q)if Arg(q)<0otherwise- 向きを求める
d=p.xp.yq.xq.y=p.x⋅q.y−p.y⋅q.x- なす角を決定する
α=⎩⎨⎧{cos−1(⟨p,q⟩)2π−cos−1(⟨p,q⟩)if d<0otherwise{2π−cos−1(⟨p,q⟩)cos−1(⟨p,q⟩)if d<0otherwiseif ψ−ϕ<0otherwisee2θi の補間#
半角形式の補間は、なす角が180度を超えると最長円弧を描く補間となる。
半角形式は半円で360度を表現し残りは繰り返しとなるので ±e2θi は同じ回転を表現する。
なす角が180度を超える場合に最短円弧を描く補間にするには3
球面線形補間の別形式#
指数・対数関数を用いない形式について。
z0=a+bi,z1=c+di∈C1 のなす角を α とし h∈R で補間した zh∈C1 を求める。
この時 z1 を元に z0 に垂直な軸を z1′ とすると
zh=cos(αh)z0+sin(αh)z1′z1′ は二次元の場合は90度回転として求められる。
z1′=−b+aiより一般的には
z1′=∣z1−⟨z0,z1⟩z0∣z1−⟨z0,z1⟩z0または簡潔に
z1′=sin(α)z1−cos(α)z0s=⟨z0,z1⟩=cos(α) とすると分母は
∣z1−⟨z0,z1⟩z0∣=∣z1−sz0∣=(c−sa)2+(d−sb)2=s2∣z0∣2−2s⟨z0,z1⟩+∣z1∣2=s2−2s2+1=1−s2=1−cos2(α)=sin2(α)=sin(α)
z1′ を zh に代入すると
zh=cos(αh)z0+sin(αh)z1′=cos(αh)z0+sin(αh)sin(α)z1−cos(α)z0=cos(αh)z0+sin(α)sin(αh)z1−sin(α)sin(αh)cos(α)z0=sin(α)sin(α)cos(αh)−cos(α)sin(αh)z0+sin(α)sin(αh)z1=sin(α)sin(α(1−h))z0+sin(α)sin(αh)z1途中、三角関数の加法定理を利用した。
このままでは分母に sin(α) があるため α→0 で発散するので
1−∣⟨z0,z1⟩∣≤ϵ ならば線形補間に切り替え回避をする。
スプライン補間の補足#
未知数 si の導出方法。
SLERP の微分
dhdSLERP(p,q;h)=dhdp⋅(p⋅q)h=p⋅dhdexp(hlog(p⋅q))=p⋅exp(hlog(p⋅q))⋅log(p⋅q)=SLERP(p,q;h)⋅log(p⋅q)Squad(pi−1,pi,si−1,si,1)=Squad(pi,pi+1,si,si+1,0)
Squad(pi−1,pi,si−1,si;1)Squad(pi,pi+1,si,si+1;0)=SLERP(SLERP(pi−1,pi;1),SLERP(si−1,si;1);0)=SLERP(pi,si;0)=pi=SLERP(SLERP(pi,pi+1;0),SLERP(si,si+1;0),0)=SLERP(pi,si;0)=piSQUAD の微分
gi(h)=SLERP(pi,pi+1;h)⋅SLERP(si,si+1;h) とすると
dhdSquad(pi,pi+1,si,si+1;h)=dhdSLERP(SLERP(pi,pi+1;h),SLERP(si,si+1;h),2h(1−h))=dhdSLERP(pi,pi+1;h)⋅gi(h)2h(1−h)=(dhdSLERP(pi,pi+1;h))⋅gi(h)2h(1−h)−SLERP(pi,pi+1;h)⋅(dhdgi(h)2h(1−h))=SLERP(pi,pi+1;h)⋅log(pi⋅pi+1)⋅gi(h)2h(1−h)−SLERP(pi,pi+1;h)⋅(dhdgi(h)2h(1−h))gi(h)2h(1−h) の微分
gi(h)=cos(θgi(h))+sin(θgi(h))i,f(h)=2h(1−h) と置いて
dhdgi(h)2h(1−h)=dhdexp(f(h)⋅log(gi(h)))=dhdexp(f(h)⋅θgi(h)i)=dhd(cos(f(h)⋅θgi(h))+sin(f(h)⋅θgi(h))i)=−sin(f(h)⋅θgi(h))⋅(dhdf(h)⋅θgi(h))−cos(f(h)⋅θgi(h))⋅(dhdf(h)⋅θgi(h))i=−sin(f(h)⋅θgi(h))⋅((dhdf(h))⋅θgi(h)+f(h)⋅(dhdθgi(h)))−cos(f(h)⋅θgi(h))⋅((dhdf(h))⋅θgi(h)+f(h)⋅(dhdθgi(h)))idhdSquad(pi−1,pi,si−1,si,1)=dhdSquad(pi,pi+1,si,si+1,0)
dhdSquad(pi−1,pi,si−1,si,1)dhdSquad(pi,pi+1,si,si+1,0)=SLERP(pi−1,pi;1)⋅log(pi−1⋅pi)−SLERP(pi−1,pi;1)⋅(dhdgi−1(h)2h(1−h))(1)=pi⋅log(pi−1⋅pi)−2pi⋅θgi−1(1)i=pi⋅(log(pi−1⋅pi)−2log(gi−1(1)))=pi⋅(log(pi−1⋅pi)−2log(pi⋅si))=SLERP(pi,pi+1;0)⋅log(pi⋅pi+1)−SLERP(pi,pi+1;0)⋅(dhdgi(h)2h(1−h))(0)=pi⋅log(pi⋅pi+1)−2pi⋅θgi(0)i=pi⋅(log(pi⋅pi+1)−2log(gi(0)))=pi⋅(log(pi⋅pi+1)−2log(pi⋅si))上式より
pi⋅(log(pi−1⋅pi)−2log(pi⋅si))log(pi−1⋅pi)−2log(pi⋅si)4log(pi⋅si)pi⋅sisi=pi⋅(log(pi⋅pi+1)−2log(pi⋅si))=log(pi⋅pi+1)−2log(pi⋅si)=log(pi−1⋅pi)−log(pi⋅pi+1)=exp(4log(pi−1⋅pi)−log(pi⋅pi+1))=pi⋅exp(4log(pi−1⋅pi)−log(pi⋅pi+1))p1⋅p2=p1⋅p2,log(p)=−log(p),p=p−1 を利用し
si=pi⋅exp(4log(pi−1⋅pi)−log(pi⋅pi+1))=pi⋅exp(4log(pi−1⋅pi)−log(pi⋅pi+1))=pi⋅exp(−4log(pi⋅pi−1)−log(pi⋅pi+1))=pi⋅exp(−4log(pi−1⋅pi−1)−log(pi−1⋅pi+1))四元数 pi∈H1 なら p1⊗p2=p2⊗p1
四元数のスプライン補間4と同様となる。