久久精品中文字幕免费_91香蕉国产亚洲一区二区三区_国产精品巨作无遮拦_亚洲人成电影

    <center id="oy65s"><ol id="oy65s"></ol></center>

  • <menu id="oy65s"></menu>
    當(dāng)前位置:首頁(yè) > 籃球資訊 > 正文內(nèi)容

    球諧光照——球諧函數(shù)

    杏彩體育2年前 (2022-12-17)籃球資訊77

    早在1877年,Norman Macleod Ferrers就專(zhuān)門(mén)寫(xiě)了一本書(shū)來(lái)介紹球諧函數(shù),后面物理學(xué)家把實(shí)數(shù)球諧函數(shù)擴(kuò)展到復(fù)平面上,在復(fù)變函數(shù)論中作為“特殊函數(shù)”來(lái)研究,它在物理以及計(jì)算化學(xué)上有重要的應(yīng)用,我們主要討論它在計(jì)算機(jī)圖形渲染上的應(yīng)用。

    球諧函數(shù)是拉普拉斯方程的分離rr變量后,角度部分通解的正交項(xiàng),那本篇文章就從拉普拉斯方程開(kāi)始介紹,直至找到我們想要的球諧函數(shù)。球諧函數(shù)有復(fù)數(shù)形式和實(shí)數(shù)形式,我們只關(guān)心它的實(shí)數(shù)形式。

    球諧函數(shù)有兩條重要的性質(zhì),正交完備性和旋轉(zhuǎn)不變性。球諧函數(shù)構(gòu)成的函數(shù)組,作為正交基,對(duì)信號(hào)進(jìn)行投影和重建,例如[7]介紹的輻射度環(huán)境貼圖,通過(guò)9個(gè)系數(shù)就可以模擬一張環(huán)境貼圖的漫反射信號(hào),無(wú)論是存儲(chǔ)還是計(jì)算,都有顯著的優(yōu)勢(shì)。當(dāng)然,本篇文章希望從數(shù)學(xué)的角度,來(lái)介紹球諧函數(shù),也受限于個(gè)人的數(shù)學(xué)能力,會(huì)忽略了一些復(fù)雜的推導(dǎo)過(guò)程。

    文章目錄:

    球諧始源球諧性質(zhì)附錄參考

    球諧始源

    球諧函數(shù)是拉普拉斯方程的分離rr變量后,角度部分通解的正交項(xiàng)。這部分將從拉普拉斯方程開(kāi)始逐項(xiàng)推導(dǎo),得到最終我們想要知道的球諧函數(shù)。內(nèi)容主要參考“姚端正,梁家寶. 數(shù)學(xué)物理方法-第4版”和“顧樵. 數(shù)學(xué)物理方法”兩本書(shū)。

    球面坐標(biāo)可以表示為

    (1){x=rsin?θcos?φy=rsin?θsin?φz=rcos?θ\left\{ \begin{matrix} x=r\sin \theta \cos \varphi \\ y=r\sin \theta \sin \varphi \\ z=r\cos \theta \\ \end{matrix} \right. \tag{1}\\

    三維空間下的拉普拉斯(Laplace)方程可以表示為

    (2)?2=?2?x2+?2?y2+?2?z2=0{{\nabla }^{\text{2}}}\text{=}\frac{{{\partial }^{2}}}{\partial {{x}^{2}}}+\frac{{{\partial }^{2}}}{\partial {{y}^{2}}}+\frac{{{\partial }^{2}}}{\partial {{z}^{2}}}=0 \tag{2}\\

    把球面坐標(biāo)代入拉普拉斯方程(參見(jiàn)“Laplacian in Spherical Coordinates”),可以得到

    (3)1r2??r(r2?f?r)+1r2sin?θ??θ(sin?θ?f?θ)+1r2sin2θ?2f?φ2=0\frac{1}{{{r}^{2}}}\frac{\partial }{\partial r}\left( {{r}^{2}}\frac{\partial f}{\partial r} \right)+\frac{1}{{{r}^{2}}\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial f}{\partial \theta } \right)+\frac{1}{{{r}^{2}}{{\sin }^{2}}\theta }\frac{{{\partial }^{2}}f}{\partial {{\varphi }^{2}}}=0 \tag{3}\\

    我們的目標(biāo)就是求解拉普拉斯方程的解。首先,把表示距離的變數(shù)rr跟表示方向的變數(shù)θ\thetaφ\varphi分離,即

    (4)f(r,θ,φ)=R(r)Y(θ,φ)f\left( r,\theta ,\varphi \right)=R\left( r \right)Y\left( \theta ,\varphi \right) \tag{4}\\

    Y(θ,φ)Y\left( \theta ,\varphi \right)表示角度部分,把等式(4)代入等式(3)可以得到

    Yr2??r(r2?R?r)+Rr2sin?θ??θ(sin?θ?Y?θ)+Rr2sin2θ?2Y?φ2=0\frac{Y}{{{r}^{2}}}\frac{\partial }{\partial r}\left( {{r}^{2}}\frac{\partial R}{\partial r} \right)+\frac{R}{{{r}^{2}}\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial Y}{\partial \theta } \right)+\frac{R}{{{r}^{2}}{{\sin }^{2}}\theta }\frac{{{\partial }^{2}}Y}{\partial {{\varphi }^{2}}}=0\\

    等式兩邊乘以r2/RY{{r}^{2}}/RY,并移項(xiàng),可得

    1R??r(r2?R?r)=?1Ysin?θ??θ(sin?θ?Y?θ)?1Ysin2θ?2Y?φ2\frac{1}{R}\frac{\partial }{\partial r}\left( {{r}^{2}}\frac{\partial R}{\partial r} \right)=-\frac{1}{Y\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial Y}{\partial \theta } \right)-\frac{1}{Y{{\sin }^{2}}\theta }\frac{{{\partial }^{2}}Y}{\partial {{\varphi }^{2}}}\\

    左邊是rr的函數(shù),跟θ\thetaφ\varphi無(wú)關(guān);右邊是θ\thetaφ\varphi的函數(shù),跟rr無(wú)關(guān)。兩邊相等,顯然是不可能的。除非兩邊實(shí)際上是同一個(gè)常數(shù),通常把這個(gè)參數(shù)記為l(l+1)l\left( l+1 \right)。即

    1R??r(r2?R?r)=?1Ysin?θ??θ(sin?θ?Y?θ)?1Ysin2θ?2Y?φ2=l(l+1)\frac{1}{R}\frac{\partial }{\partial r}\left( {{r}^{2}}\frac{\partial R}{\partial r} \right)=-\frac{1}{Y\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial Y}{\partial \theta } \right)-\frac{1}{Y{{\sin }^{2}}\theta }\frac{{{\partial }^{2}}Y}{\partial {{\varphi }^{2}}}=l\left( l+1 \right)\\

    這就分解為兩個(gè)方程

    ??r(r2?R?r)?l(l+1)R=0\frac{\partial }{\partial r}\left( {{r}^{2}}\frac{\partial R}{\partial r} \right)-l\left( l+1 \right)R=0\\

    (5)1sin?θ??θ(sin?θ?Y?θ)+1sin2θ?2Y?φ2+l(l+1)Y=0\frac{1}{\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial Y}{\partial \theta } \right)+\frac{1}{{{\sin }^{2}}\theta }\frac{{{\partial }^{2}}Y}{\partial {{\varphi }^{2}}}+l\left( l+1 \right)Y=0 \tag{5}\\

    當(dāng)然,我們只關(guān)心角度部分的解,即方程(5)的解,這個(gè)方程也稱(chēng)為球函數(shù)方程。進(jìn)一步采用分離變數(shù)法,以

    Y(θ,φ)=Θ(θ)Φ(φ)Y\left( \theta ,\varphi \right)=\Theta \left( \theta \right)\Phi \left( \varphi \right)\\

    代入球函數(shù)方程,得

    Φsin?θ??θ(sin?θ?Θ?θ)+Θsin2θ?2Φ?φ2+l(l+1)ΘΦ=0\frac{\Phi }{\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial \Theta }{\partial \theta } \right)+\frac{\Theta }{{{\sin }^{2}}\theta }\frac{{{\partial }^{2}}\Phi }{\partial {{\varphi }^{2}}}+l\left( l+1 \right)\Theta \Phi =0\\

    在方程兩邊乘以sin2θ/ΦΘ{{\sin }^{2}}\theta /\Phi \Theta并移項(xiàng),即可得

    sin?θΘ??θ(sin?θ?Θ?θ)+l(l+1)sin2θ=?1Φ?2Φ?φ2\frac{\sin \theta }{\Theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial \Theta }{\partial \theta } \right)+l\left( l+1 \right){{\sin }^{2}}\theta =-\frac{1}{\Phi }\frac{{{\partial }^{2}}\Phi }{\partial {{\varphi }^{2}}}\\

    左邊是θ\theta的函數(shù),跟φ\varphi無(wú)關(guān);右邊是φ\varphi 的函數(shù),跟θ\theta 無(wú)關(guān)。兩邊相等顯然是不可能的,除非兩邊實(shí)際上是同一個(gè)常數(shù),這個(gè)常數(shù)記作λ\lambda,

    sin?θΘ??θ(sin?θ?Θ?θ)+l(l+1)sin2θ=?1Φ?2Φ?φ2=λ\frac{\sin \theta }{\Theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial \Theta }{\partial \theta } \right)+l\left( l+1 \right){{\sin }^{2}}\theta =-\frac{1}{\Phi }\frac{{{\partial }^{2}}\Phi }{\partial {{\varphi }^{2}}}=\lambda\\

    這就又分解為兩個(gè)常微分方程

    (7)?2Φ?φ2+λΦ=0\frac{{{\partial }^{2}}\Phi }{\partial {{\varphi }^{2}}}+\lambda \Phi =0 \tag{7}\\

    (8)sin?θ??θ(sin?θ?Θ?θ)+[l(l+1)sin2θ?λ]Θ=0\sin \theta \frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial \Theta }{\partial \theta } \right)+\left[ l\left( l+1 \right){{\sin }^{2}}\theta -\lambda \right]\Theta =0 \tag{8}\\

    對(duì)于常微分方程(7),它有一個(gè)隱含的“自然的周期條件”(Φ(φ+2π)=Φ(φ)\Phi \left( \varphi +2\pi \right)=\Phi \left( \varphi \right)),兩者構(gòu)成本征值問(wèn)題。即

    (9)λ=m2,(m=0,±1,±2,?)\lambda ={{m}^{2}},\left( m=0,\pm 1,\pm 2,\cdots \right) \tag{9}\\

    它的周期解用復(fù)數(shù)形式,可以表示為

    (10)Φ(φ)=eimφ,m=0,±1,±2,?\Phi \left( \varphi \right)={{e}^{im\varphi }},m=0,\pm 1,\pm 2,\cdots \tag{10}\\

    嚴(yán)格來(lái)說(shuō),這里忽略了常數(shù)項(xiàng),且是兩個(gè)cos和sin函數(shù)的混合,或者是兩個(gè)正負(fù)虛數(shù)的混合,但不影響最終的通解。

    復(fù)數(shù)形式在復(fù)變函數(shù)論里面,有一個(gè)如下所示的轉(zhuǎn)換關(guān)系,它們都是復(fù)平面上坐標(biāo)的不同表現(xiàn)形式。由于本篇文章并不是為了嚴(yán)格的數(shù)學(xué)理論推導(dǎo),而是為了梳理球諧函數(shù)在計(jì)算機(jī)上從理論到應(yīng)用這條線,最終我們采用的是實(shí)數(shù)形式的球諧函數(shù),所以看看就可以了。

    cos?mφ+isin?mφ=eimφ\cos m\varphi +i\sin m\varphi ={{e}^{im\varphi }}\\

    再看常微分方程(8),它可以改寫(xiě)為

    1sin?θ??θ(sin?θ?Θ?θ)+[l(l+1)?m2sin2θ]Θ=0\frac{1}{\sin \theta }\frac{\partial }{\partial \theta }\left( \sin \theta \frac{\partial \Theta }{\partial \theta } \right)+\left[ l\left( l+1 \right)-\frac{{{m}^{2}}}{{{\sin }^{2}}\theta } \right]\Theta =0\\

    設(shè)x=cos?θx=\cos \theta,則

    ?Θ?θ=?Θ?x?x?θ=?sin?θ?Θ?x\frac{\partial \Theta }{\partial \theta }=\frac{\partial \Theta }{\partial x}\frac{\partial x}{\partial \theta }=-\sin \theta \frac{\partial \Theta }{\partial x}\\

    代入上式,化簡(jiǎn)可得

    (11)(1?x2)?2Θ?x2?2x?Θ?x+[l(l+1)?m21?x2]Θ=0\left( 1-{{x}^{2}} \right)\frac{{{\partial }^{2}}\Theta }{\partial {{x}^{2}}}-2x\frac{\partial \Theta }{\partial x}+\left[ l\left( l+1 \right)-\frac{{{m}^{2}}}{1-{{x}^{2}}} \right]\Theta =0 \tag{11}\\

    這個(gè)方程就是l次連帶勒讓德方程,也稱(chēng)為締合勒讓德方程,其中,m=0m=0的特例,即

    (12)(1?x2)?2Θ?x2?2x?Θ?x+l(l+1)Θ=0\left( 1-{{x}^{2}} \right)\frac{{{\partial }^{2}}\Theta }{\partial {{x}^{2}}}-2x\frac{\partial \Theta }{\partial x}+l\left( l+1 \right)\Theta =0 \tag{12}\\

    叫作l次勒讓德方程。

    后面只考慮連帶勒讓德方程,它的解就稱(chēng)為連帶勒讓德函數(shù),只有當(dāng)λ=l(l+1)\lambda =l\left( l+1 \right),l=0,1,?l=0,1,\cdots 時(shí)才有有界周期解,用Plm(x)P_{l}^{m}\left( x \right)表示,即

    (13)Θ(θ)=Plm(cos?θ){m=0,±1,?,±l}\Theta \left( \theta \right)=P_{l}^{m}\left( \cos \theta \right)\left\{ m=0,\pm 1,\cdots ,\pm l \right\} \tag{13}\\

    經(jīng)過(guò)數(shù)學(xué)家論證,連帶勒讓德函數(shù)表示為

    Pml(x)=(?1)m(1?x2)m22ll!dl+mdxl+m(x2?1)l

    P_{l}^{m}\left( x \right)=\frac{{{\left( -1 \right)}^{m}}{{\left( 1-{{x}^{2}} \right)}^{\frac{m}{2}}}}{{{2}^{l}}l!}\frac{{24coeig^{l+m}}}{d{{x}^{l+m}}}{{\left( {{x}^{2}}-1 \right)}^{l}} \tag{14}\\

    這叫稱(chēng)為l次m階連帶勒讓德函數(shù),“次”的英文是“degree”,“階”的英文是“order”。當(dāng)l">m>l。連帶勒讓德函數(shù)里面有一個(gè)m+l次導(dǎo)數(shù)計(jì)算,在計(jì)算機(jī)上這個(gè)很難處理,但是有遞歸關(guān)系[3],即

    \left\{ \begin{aligned} & \left( l-m \right)P_{l}^{m}\left( x \right)=x\left( 2l-1 \right)P_{l-1}^{m}\left( x \right)-\left( l+m-1 \right)P_{l-2}^{m}\left( x \right) \\ & P_{m}^{m}\left( x \right)={{\left( -1 \right)}^{m}}\left( 2m-1 \right)!!{{\left( 1-{{x}^{2}} \right)}^{m/2}} \\ & P_{m+1}^{m}\left( x \right)=x\left( 2m+1 \right)P_{m}^{m}\left( x \right) \\ \end{aligned} \right. \tag{15}\\

    兩個(gè)!!表示雙階乘,即\left( 2m-1 \right)!!=1\cdot 3\cdot 5\cdots \left( 2m-1 \right)。

    連帶勒讓德函數(shù)的遞歸關(guān)系,保證了計(jì)算機(jī)實(shí)現(xiàn)的基礎(chǔ)。

    此外,再給一個(gè)l次m階連帶勒讓德函數(shù)的關(guān)系等式

    P_{l}^{m}\left( x \right)={{\left( -1 \right)}^{m}}\frac{\left( l+m \right)!}{\left( l-m \right)!}P_{l}^{-m}\left( x \right) \tag{16}\\

    回到球函數(shù)方程(5)的求解,它的Y\left( \theta ,\varphi \right)通解的復(fù)數(shù)形式表示為

    Y\left( \theta ,\varphi \right)=\sum\limits_{l=0}^{\infty }{\sum\limits_{k=-l}^{l}{P_{l}^{k}\left( \cos \theta \right){{e}^{im\varphi }}}},m=0,\pm 1,\pm 2,\cdots \tag{17}\\

    嚴(yán)格來(lái)說(shuō),由于\Phi \left( \varphi \right)忽略了常數(shù)項(xiàng),這里也是忽略常數(shù)項(xiàng)的情況。

    一般的l次m階球諧函數(shù){{Y}_{lm}}\left( \theta ,\varphi \right)的復(fù)數(shù)形式可以表示為

    {{Y}_{lm}}\left( \theta ,\varphi \right)={{P}_{lm}}\left( \cos \theta \right){{e}^{im\varphi }},m=0,\pm 1,\pm 2,\cdots \tag{18}\\

    l表示球諧函數(shù)的次數(shù),m表示球諧函數(shù)的階數(shù)

    球諧函數(shù)的模長(zhǎng)可以表示為

    {{\left( N_{l}^{m} \right)}^{2}}={{\iint\limits_{S}{{{Y}_{lm}}\left( x \right)\left[ {{Y}_{lm}}\left( x \right) \right]}}^{*}}\sin \theta d\theta d\varphi =\frac{2}{2l+1}\frac{\left( l+\left| m \right| \right)!}{\left( l-\left| m \right| \right)!}2\pi\\

    歸一化的球諧函數(shù)Y_{l}^{m}\left( \theta ,\varphi \right)的復(fù)數(shù)形式可以表示為

    Y_{l}^{m}\left( \theta ,\varphi \right)=K_{l}^{m}{{Y}_{lm}}\left( \theta ,\varphi \right) \tag{19}\\

    其中

    K_{l}^{m}=\frac{1}{N_{l}^{m}}=\sqrt{\frac{2l+1}{4\pi }\frac{\left( l-\left| m \right| \right)!}{\left( l+\left| m \right| \right)!}} \tag{20}\\

    注意區(qū)分兩種數(shù)學(xué)表示的含義,{{Y}_{lm}}\left( \theta ,\varphi \right)表示一般形式的球諧函數(shù),Y_{l}^{m}\left( \theta ,\varphi \right)表示歸一化的球諧函數(shù)。

    當(dāng)m>0時(shí)采用實(shí)數(shù)cos部分,當(dāng)m<0時(shí)采用虛數(shù)sin部分,則歸一化的球諧函數(shù)的實(shí)數(shù)形式可以表示為

    0 \\ \sqrt{2}K_{l}^{m}\sin \left( -m\varphi \right)P_{l}^{-m}\left( \cos \theta \right) & m<0>Y_{l}^{m}\left( \theta ,\varphi \right)=\left\{ \begin{matrix} \sqrt{2}K_{l}^{m}\cos \left( m\varphi \right)P_{l}^{m}\left( \cos \theta \right) & m>0 \\ \sqrt{2}K_{l}^{m}\sin \left( -m\varphi \right)P_{l}^{-m}\left( \cos \theta \right) & m<0 \\ K_{l}^{0}P_{l}^{m}\left( \cos \theta \right) & m=0 \\ \end{matrix} \right. \tag{21}

    根據(jù)上述計(jì)算公式,可以得到前面4次的球諧函數(shù),為

    前4次球諧函數(shù)

    參見(jiàn)[6],已經(jīng)推導(dǎo)出前6次的球諧函數(shù)。

    球諧函數(shù)可視化,前面幾次的三維圖像如圖1所示

    圖1. 前4次的球諧函數(shù)三維圖像

    至此,你應(yīng)該理解兩條重要結(jié)論:

    球諧函數(shù)是拉普拉斯方程分離r變量后,角度部分通解的正交項(xiàng)(后面介紹正交性)。如何計(jì)算球諧函數(shù),可以參見(jiàn)等式(15)(20)(21)。

    球諧性質(zhì)

    接著,討論歸一化的球諧函數(shù)的性質(zhì),它具備兩條重要的性質(zhì)構(gòu)成了它應(yīng)用的基石:

    正交完備性旋轉(zhuǎn)不變性

    正交完備性

    對(duì)于任意兩個(gè)歸一化的球諧函數(shù)在球面上的積分有

    \iint\limits_{S}{Y_{l}^{m}\left( \theta ,\varphi \right)Y_{k}^{n}\left( \theta ,\varphi \right)\sin \theta d\theta d\varphi }=\left\{ \begin{matrix} 0 & m\ne n,or,l\ne k \\ 1 & m=n,l=k \\ \end{matrix} \right. \tag{21}\\

    這就表示由球諧函數(shù)構(gòu)成的函數(shù)組\left\{ Y_{l}^{m}\left( \theta ,\varphi \right) \right\}是正交歸一化的。

    以某一正交歸一函數(shù)組為基,把一個(gè)給定的函數(shù)用這些函數(shù)的線性組合來(lái)表示,這就是一種重要的展開(kāi),這種用正交函數(shù)組展開(kāi)為級(jí)數(shù)的一個(gè)顯著的例子就是傅里葉變換。

    任意一個(gè)球面函數(shù)f\left( \theta ,\varphi \right)可以用正交歸一的球函數(shù)Y_{l}^{m}\left( \theta ,\varphi \right)進(jìn)行展開(kāi),這種展開(kāi)類(lèi)似于傅里葉展開(kāi),稱(chēng)為廣義傅里葉展開(kāi)

    f\left( \theta ,\varphi \right)=\sum\limits_{l=0}^{\infty }{\sum\limits_{m=-l}^{l}{C_{l}^{m}Y_{l}^{m}\left( \theta ,\varphi \right)}} \tag{22}\\

    其中,廣義傅里葉系數(shù)C_{l}^{m}

    C_{l}^{m}=\int_{0}^{2\pi }{\int_{0}^{\pi }{f\left( \theta ,\varphi \right)Y_{l}^{m}\left( \theta ,\varphi \right)\sin \theta d\theta d\varphi }} \tag{23}\\

    當(dāng)次數(shù)l\to \infty 的時(shí)候,展開(kāi)的級(jí)數(shù)和會(huì)平均收斂于f\left(\theta ,\varphi \right)。換句話說(shuō),當(dāng)次數(shù)l越大,那么級(jí)數(shù)和就會(huì)越趨近于被展開(kāi)的函數(shù)f\left(\theta ,\varphi \right),就稱(chēng)\left\{ Y_{l}^{m}\left( \theta ,\varphi \right) \right\}為完備函數(shù)組。平均收斂,并不代表收斂,只是表示趨近于的含義。

    從計(jì)算機(jī)的角度來(lái)說(shuō),如等式(22)所示的函數(shù)展開(kāi),n的取值不可能是無(wú)窮大,往往取一個(gè)給定系數(shù),則可以確定球諧函數(shù)組,例如n=2,那么球諧函數(shù)組就是

    \left\{ Y_{l}^{m}\left( \theta ,\varphi \right) \right\}=\left\{ Y_{0}^{0},Y_{1}^{-1},Y_{1}^{0},Y_{1}^{1} \right\}\\

    任意給定n,得到的球諧函數(shù)組的個(gè)數(shù)為

    S=1+\text{3}+5+\cdots 2n-1={{n}^{2}}\\

    那么,廣義傅里葉系數(shù)相當(dāng)于這樣一個(gè)排列

    C_{0}^{0},C_{1}^{-1},C_{1}^{0},C_{1}^{1},C_{2}^{-2},C_{2}^{-1},\cdots\\

    類(lèi)似的球諧函數(shù)也可以構(gòu)成這樣一個(gè)類(lèi)似的排列,若我們用一個(gè)普通的系數(shù){{c}_{k}}來(lái)表示上面的廣義傅里葉系數(shù),用一個(gè)函數(shù){{y}_{k}}\left( \theta ,\varphi \right)來(lái)表示球諧函數(shù),那么等式(22)可以換成另外一種形式

    f\left( \theta ,\varphi \right)=\sum\limits_{k=0}^{{{n}^{2}}-1}{{{c}_{k}}{{y}_{k}}\left( \theta ,\varphi \right)} \tag{24}\\

    這種形式的展開(kāi)與等式(22)是完全一樣的,它只是把球諧函數(shù)的次數(shù)展開(kāi),用一個(gè)系數(shù)來(lái)表示,但是它隱藏了一個(gè)條件:取的系數(shù)個(gè)數(shù)必需是{{n}^{2}}。

    回過(guò)來(lái),球諧函數(shù)組相當(dāng)于一組正交基,將函數(shù)f\left( \theta ,\varphi \right)表示為這組正交基的線性組合,生成線性組合系數(shù)的過(guò)程就稱(chēng)為投影(Projection),例如一個(gè)函數(shù)可以表示為

    f\left( \theta ,\varphi \right)\approx aY_{0}^{0}+bY_{1}^{-1}+cY_{1}^{0}+dY_{1}^{1}\\

    生成系數(shù)\left\{ a,b,c,d \right\}的過(guò)程,就是投影,等式(23)就確定了投影的方法。相反,利用這組系數(shù)和正交基組合,得到原函數(shù)的過(guò)程,就稱(chēng)為重建(Reconstruction)。

    投影的過(guò)程就是計(jì)算函數(shù)積分,計(jì)算消耗較大,可以采用離線處理來(lái)生成廣義傅里葉系數(shù);在實(shí)時(shí)渲染時(shí),就要簡(jiǎn)單的線性組合,就可以重建原始函數(shù)。當(dāng)然,由于是有限個(gè)系數(shù),就必然存在誤差。

    我們?cè)賮?lái)看下連帶勒讓德函數(shù),如圖2所示,隨著次數(shù)的增加,函數(shù)的振動(dòng)頻率會(huì)越快。對(duì)于函數(shù)的展開(kāi)而言,振動(dòng)頻率越大的基底,它就只能表示越高頻的信息,往往一個(gè)函數(shù)里面的高頻信息量是較少的。

    圖2. 連帶勒讓德函數(shù)曲線圖,次數(shù)越大,振頻越快

    類(lèi)似的,球諧函數(shù)也具備這種隨著次數(shù)增加,振動(dòng)頻率增加的的特性。它就使得n的取值不需要很大時(shí),就可以得到很好的重建效果,當(dāng)然只能還原出低頻信息。根據(jù)Robin[3]得到的數(shù)據(jù),如圖3所示,當(dāng)n > 6時(shí),就能還原出整體效果,但是邊緣棱角這些高頻信息是無(wú)法還原出來(lái)的。

    圖3. 不同n取值下球諧函數(shù)的重建效果

    由球諧函數(shù)構(gòu)成的函數(shù)組構(gòu)成正交歸一的基底,對(duì)球面上的函數(shù)進(jìn)行投影和重建,也就是廣義傅里葉展開(kāi),數(shù)學(xué)上的完備性,保證了展開(kāi)結(jié)果會(huì)趨近于被展開(kāi)的函數(shù)。

    旋轉(zhuǎn)不變性

    第一個(gè)問(wèn)題是:什么叫旋轉(zhuǎn)不變性。

    任意一個(gè)球面上的函數(shù)f\left( \theta ,\varphi \right)可以用球諧函數(shù)組作為基底展開(kāi),需要根據(jù)等式(23)計(jì)算廣義傅里葉系數(shù)C_{l}^{m}。如果我們對(duì)原函數(shù)進(jìn)行旋轉(zhuǎn)操作的話,設(shè)旋轉(zhuǎn)變換表示為R\left( \theta ,\varphi \right),我們就得到了一個(gè)新的函數(shù)f\left( R\left( \theta ,\varphi \right) \right)。對(duì)新函數(shù)進(jìn)行展開(kāi)的話,我們需要重新計(jì)算廣義傅里葉系數(shù),設(shè)為B_{l}^{m},這就有點(diǎn)為難了。在圖形渲染中,廣義傅里葉系數(shù)的生成是離線實(shí)現(xiàn)的,它的消耗很大,這就表示,一旦光源發(fā)生了旋轉(zhuǎn)后,由于原函數(shù)的改變導(dǎo)致提前生成的系數(shù)失效。旋轉(zhuǎn)不變性,表示原函數(shù)發(fā)生了旋轉(zhuǎn),只需要對(duì)生成的廣義傅里葉系數(shù)進(jìn)行變換,就能保證變換后的系數(shù)能等價(jià)還原出新函數(shù)。在圖形渲染上的表現(xiàn)就是,當(dāng)光源發(fā)生旋轉(zhuǎn)后,我們只要同步的計(jì)算出變換后的廣義傅里葉系數(shù),就能保證畫(huà)面的光照效果不會(huì)抖動(dòng)跳變。旋轉(zhuǎn)不變性,并不是表示源函數(shù)發(fā)生旋轉(zhuǎn)后,對(duì)重建結(jié)果沒(méi)有影響,而是表示通過(guò)對(duì)系數(shù)與匹配的旋轉(zhuǎn)進(jìn)行變換后,能等價(jià)的還原出旋轉(zhuǎn)后的函數(shù)。

    舉個(gè)[6]實(shí)驗(yàn)的例子,如圖4所示,球諧函數(shù)表示的光照發(fā)生旋轉(zhuǎn)后,仍然能等價(jià)重建新的變換函數(shù),但是采用Ambient Cube的方法效果就出現(xiàn)了異常。

    圖4. SH表示球諧基底,HL2表示Ambient Cube基底

    第二個(gè)問(wèn)題是:怎么對(duì)生成的系數(shù)進(jìn)行變換。

    針對(duì)這個(gè)問(wèn)題,這里寫(xiě)些自己的理解,不做深入的研究。

    對(duì)于l次球諧函數(shù),就會(huì)有2l + 1個(gè)系數(shù),表示為

    {{C}_{l}}=\left\{ C_{l}^{-l},C_{l}^{-l+1},\cdots ,C_{l}^{l-1},C_{l}^{l} \right\} \tag{25}\\

    設(shè)變換矩陣為R_{SH}^{l},它是一個(gè)(2l + 1)*(2l + 1)的矩陣,那么系數(shù)的變換就可以表示為

    B_{l}^{m}=\sum\limits_{k=-l}^{k=l}{M_{l}^{m,k}C_{l}^{k}} \tag{26}\\

    或者用向量與矩陣的乘積形式,表示為

    {{B}_{l}}={{C}_{l}}\cdot R_{SH}^{l} \tag{27}\\

    那么,經(jīng)過(guò)旋轉(zhuǎn)變換后的函數(shù)的展開(kāi)就可以表示為

    f\left( R\left( \theta ,\varphi \right) \right)=\sum\limits_{l=0}^{\infty }{\sum\limits_{m=-l}^{l}{B_{l}^{m}Y_{l}^{m}\left( \theta ,\varphi \right)}} \tag{28}\\

    唯一的區(qū)別就是,系數(shù)由{{C}_{l}}變成了{{B}_{l}}。

    想表達(dá)的一點(diǎn)是,系數(shù)的變換是基于球諧函數(shù)的次數(shù),即第3次球諧函數(shù)的系數(shù){{B}_{3}},只能由第3次球諧函數(shù)的系數(shù){{C}_{3}}變換而來(lái)。

    若取前3次的球諧函數(shù)構(gòu)成正交基,函數(shù)組共有0,1,2次三類(lèi)球諧函數(shù),若采用等式(24)的形式,則3個(gè)子矩陣需要整合成一個(gè)完整的變換矩陣,對(duì)于前3次球諧函數(shù)的例子,就組成一個(gè)9x9的變換矩陣,它的形狀如下所示。

    9x9的球諧系數(shù)變換矩陣

    考慮低維的情況[3]。旋轉(zhuǎn)可以用旋轉(zhuǎn)矩陣、歐拉角、四元數(shù)等方式表示,任意一個(gè)旋轉(zhuǎn)矩陣R可以用{{Z}_{\alpha }}{{Y}_{\beta }}{{Z}_{\gamma }}型的歐拉角表示,它們間的變換關(guān)系[5]表示為

    \left( \begin{matrix} {{R}_{0,0}} & {{R}_{0,1}} & {{R}_{0,2}} \\ {{R}_{1,0}} & {{R}_{1,1}} & {{R}_{1,2}} \\ {{R}_{2,0}} & {{R}_{2,1}} & {{R}_{2,2}} \\ \end{matrix} \right)=\left( \begin{matrix} {{c}_{\alpha }}{{c}_{\beta }}{{c}_{\gamma }}-{{s}_{\alpha }}{{s}_{\gamma }} & {{c}_{\alpha }}{{s}_{\gamma }}+{{s}_{\alpha }}{{c}_{\beta }}{{c}_{\gamma }} & -{{s}_{\beta }}{{c}_{\gamma }} \\ -{{s}_{\alpha }}{{c}_{\gamma }}-{{c}_{\alpha }}{{c}_{\beta }}{{s}_{\gamma }} & {{c}_{\alpha }}{{c}_{\gamma }}-{{s}_{\alpha }}{{c}_{\beta }}{{s}_{\gamma }} & {{s}_{\beta }}{{s}_{\gamma }} \\ {{c}_{\alpha }}{{s}_{\beta }} & {{s}_{\alpha }}{{s}_{\beta }} & {{c}_{\beta }} \\ \end{matrix} \right) \tag{29}\\

    其中,c表示cos,s表示sin。

    有了這個(gè)變換關(guān)系后,就很容易計(jì)算出歐拉角\alpha ,\beta ,\gamma,表示為

    \begin{aligned} & \sin \beta =\sqrt{1-R_{2,2}^{2}} \\ & \left\{ \begin{aligned} & \alpha \text{=atan2f}\left( {{R}_{2,1}}/\sin \beta ,{{R}_{2,0}}/\sin \beta \right) \\ & \beta =\text{atan2f}\left( \sin \beta ,{{R}_{2,2}} \right) \\ & \gamma =\text{atan2f}\left( {{R}_{1,2}}/\sin \beta ,-{{R}_{0,2}}/\sin \beta \right) \\ \end{aligned} \right. \\ \end{aligned}\\

    對(duì)于,{{R}_{2,2}}=1的退化情況,歐拉角表示為

    \left\{ \begin{aligned} & \alpha \text{=atan2f}\left( {{R}_{0,1}},{{R}_{0,0}} \right) \\ & \beta =0 \\ & \gamma =0 \\ \end{aligned} \right.\\

    那么,相應(yīng)l次的球諧系數(shù)的變換矩陣可以表示為

    R_{SH}^{l}\left( \alpha ,\beta ,\gamma \right)={{Z}_{\gamma }}{{Y}_{-90}}{{Z}_{\beta }}{{Y}_{+90}}{{Z}_{\alpha }}\\

    對(duì)于第0次的球諧變換矩陣為

    R_{SH}^{0}\left( \alpha ,\beta ,\gamma \right)=\left( 1 \right) \tag{30}\\

    其它維度的矩陣推導(dǎo)比較麻煩,就推導(dǎo)了第1次的球諧變換矩陣,它可以表示為

    R_{SH}^{1}\left( \alpha ,\beta ,\gamma \right)=\left( \begin{matrix} {{c}_{\alpha }}{{c}_{\gamma }}-{{s}_{\alpha }}{{c}_{\beta }}{{s}_{\gamma }} & -{{s}_{\beta }}{{s}_{\gamma }} & -{{s}_{\alpha }}{{c}_{\gamma }}-{{c}_{\alpha }}{{c}_{\beta }}{{s}_{\gamma }} \\ -{{s}_{\alpha }}{{s}_{\beta }} & {{c}_{\beta }} & -{{c}_{\alpha }}{{s}_{\beta }} \\ {{c}_{\alpha }}{{s}_{\gamma }}+{{s}_{\alpha }}{{c}_{\beta }}{{c}_{\gamma }} & {{s}_{\beta }}{{c}_{\gamma }} & {{c}_{\alpha }}{{c}_{\beta }}{{c}_{\gamma }}-{{s}_{\alpha }}{{s}_{\gamma }} \\ \end{matrix} \right)=\left( \begin{matrix} {{R}_{1,1}} & -{{R}_{1,2}} & {{R}_{1,0}} \\ -{{R}_{2,1}} & {{R}_{2,2}} & {{R}_{2,0}} \\ {{R}_{0,1}} & -{{R}_{0,2}} & {{R}_{0,0}} \\ \end{matrix} \right)\\

    變換矩陣R_{SH}^{l}的計(jì)算可以參見(jiàn)附錄D3D的實(shí)現(xiàn),實(shí)現(xiàn)了前6次的球諧系數(shù)的旋轉(zhuǎn),對(duì)于圖形渲染來(lái)說(shuō),已經(jīng)夠用了。

    對(duì)于高維矩陣的構(gòu)造方法非常的復(fù)雜,采用的是魏格納d矩陣(Wigner d-matrices),可以參見(jiàn)文獻(xiàn)[4]的討論,網(wǎng)上也有這個(gè)算法的高效實(shí)現(xiàn),有興趣可以研究研究,參見(jiàn)SHTns。

    附錄

    根據(jù)等式(15)的遞歸關(guān)系,就可以很容易計(jì)算出連帶勒讓德函數(shù)[3]。

    double P(int l,int m,double x) { // evaluate an Associated Legendre Polynomial P(l,m,x) at x double pmm = 1.0; if(m>0) { double somx2 = sqrt((1.0-x)*(1.0+x)); double fact = 1.0; for(int i=1; i<=m; i++) { pmm *= (-fact) * somx2; fact += 2.0; } } if(l==m) return pmm; double pmmp1 = x * (2.0*m+1.0) * pmm; if(l==m+1) return pmmp1; double pll = 0.0; for(int ll=m+2; ll<=l; ++ll) { pll = ( (2.0*ll-1.0)*x*pmmp1-(ll+m-1.0)*pmm ) / (ll-m); pmm = pmmp1; pmmp1 = pll; } return pll; }

    根據(jù)等式(20)(21),可以計(jì)算出球諧函數(shù)[3]。

    double K(int l, int m) { // renormalisation constant for SH function double temp = ((2.0*l+1.0)*factorial(l-m)) / (4.0*PI*factorial(l+m)); return sqrt(temp); } double SH(int l, int m, double theta, double phi) { // return a point sample of a Spherical Harmonic basis function // l is the band, range [0..N] // m in the range [-l..l] // theta in the range [0..Pi] // phi in the range [0..2*Pi] const double sqrt2 = sqrt(2.0); if(m==0) return K(l,0)*P(l,m,cos(theta)); else if(m>0) return sqrt2*K(l,m)*cos(m*phi)*P(l,m,cos(theta)); else return sqrt2*K(l,-m)*sin(-m*phi)*P(l,-m,cos(theta)); }

    在D3D中實(shí)現(xiàn)的球諧系數(shù)的旋轉(zhuǎn)D3DXSHRotate的實(shí)現(xiàn)為:

    FLOAT* WINAPI D3DXSHRotate(FLOAT *out, UINT order, const D3DXMATRIX *matrix, const FLOAT *in) { FLOAT alpha, beta, gamma, sinb, temp[36], temp1[36]; TRACE("out %p, order %u, matrix %p, in %p\n", out, order, matrix, in); out[0] = in[0]; if ((order > D3DXSH_MAXORDER) || (order < D3DXSH_MINORDER)) return out; if (order <= 3) { out[1] = matrix->u.m[1][1] * in[1] - matrix->u.m[2][1] * in[2] + matrix->u.m[0][1] * in[3]; out[2] = -matrix->u.m[1][2] * in[1] + matrix->u.m[2][2] * in[2] - matrix->u.m[0][2] * in[3]; out[3] = matrix->u.m[1][0] * in[1] - matrix->u.m[2][0] * in[2] + matrix->u.m[0][0] * in[3]; if (order == 3) { FLOAT coeff[]={ matrix->u.m[1][0] * matrix->u.m[0][0], matrix->u.m[1][1] * matrix->u.m[0][1], matrix->u.m[1][1] * matrix->u.m[2][1], matrix->u.m[1][0] * matrix->u.m[2][0], matrix->u.m[2][0] * matrix->u.m[2][0], matrix->u.m[2][1] * matrix->u.m[2][1], matrix->u.m[0][0] * matrix->u.m[2][0], matrix->u.m[0][1] * matrix->u.m[2][1], matrix->u.m[0][1] * matrix->u.m[0][1], matrix->u.m[1][0] * matrix->u.m[1][0], matrix->u.m[1][1] * matrix->u.m[1][1], matrix->u.m[0][0] * matrix->u.m[0][0], }; out[4] = (matrix->u.m[1][1] * matrix->u.m[0][0] + matrix->u.m[0][1] * matrix->u.m[1][0]) * in[4]; out[4] -= (matrix->u.m[1][0] * matrix->u.m[2][1] + matrix->u.m[1][1] * matrix->u.m[2][0]) * in[5]; out[4] += 1.7320508076f * matrix->u.m[2][0] * matrix->u.m[2][1] * in[6]; out[4] -= (matrix->u.m[0][1] * matrix->u.m[2][0] + matrix->u.m[0][0] * matrix->u.m[2][1]) * in[7]; out[4] += (matrix->u.m[0][0] * matrix->u.m[0][1] - matrix->u.m[1][0] * matrix->u.m[1][1]) * in[8]; out[5] = (matrix->u.m[1][1] * matrix->u.m[2][2] + matrix->u.m[1][2] * matrix->u.m[2][1]) * in[5]; out[5] -= (matrix->u.m[1][1] * matrix->u.m[0][2] + matrix->u.m[1][2] * matrix->u.m[0][1]) * in[4]; out[5] -= 1.7320508076f * matrix->u.m[2][2] * matrix->u.m[2][1] * in[6]; out[5] += (matrix->u.m[0][2] * matrix->u.m[2][1] + matrix->u.m[0][1] * matrix->u.m[2][2]) * in[7]; out[5] -= (matrix->u.m[0][1] * matrix->u.m[0][2] - matrix->u.m[1][1] * matrix->u.m[1][2]) * in[8]; out[6] = (matrix->u.m[2][2] * matrix->u.m[2][2] - 0.5f * (coeff[4] + coeff[5])) * in[6]; out[6] -= (0.5773502692f * (coeff[0] + coeff[1]) - 1.1547005384f * matrix->u.m[1][2] * matrix->u.m[0][2]) * in[4]; out[6] += (0.5773502692f * (coeff[2] + coeff[3]) - 1.1547005384f * matrix->u.m[1][2] * matrix->u.m[2][2]) * in[5]; out[6] += (0.5773502692f * (coeff[6] + coeff[7]) - 1.1547005384f * matrix->u.m[0][2] * matrix->u.m[2][2]) * in[7]; out[6] += (0.2886751347f * (coeff[9] - coeff[8] + coeff[10] - coeff[11]) - 0.5773502692f * (matrix->u.m[1][2] * matrix->u.m[1][2] - matrix->u.m[0][2] * matrix->u.m[0][2])) * in[8]; out[7] = (matrix->u.m[0][0] * matrix->u.m[2][2] + matrix->u.m[0][2] * matrix->u.m[2][0]) * in[7]; out[7] -= (matrix->u.m[1][0] * matrix->u.m[0][2] + matrix->u.m[1][2] * matrix->u.m[0][0]) * in[4]; out[7] += (matrix->u.m[1][0] * matrix->u.m[2][2] + matrix->u.m[1][2] * matrix->u.m[2][0]) * in[5]; out[7] -= 1.7320508076f * matrix->u.m[2][2] * matrix->u.m[2][0] * in[6]; out[7] -= (matrix->u.m[0][0] * matrix->u.m[0][2] - matrix->u.m[1][0] * matrix->u.m[1][2]) * in[8]; out[8] = 0.5f * (coeff[11] - coeff[8] - coeff[9] + coeff[10]) * in[8]; out[8] += (coeff[0] - coeff[1]) * in[4]; out[8] += (coeff[2] - coeff[3]) * in[5]; out[8] += 0.86602540f * (coeff[4] - coeff[5]) * in[6]; out[8] += (coeff[7] - coeff[6]) * in[7]; } return out; } if (fabsf(matrix->u.m[2][2]) != 1.0f) { sinb = sqrtf(1.0f - matrix->u.m[2][2] * matrix->u.m[2][2]); alpha = atan2f(matrix->u.m[2][1] / sinb, matrix->u.m[2][0] / sinb); beta = atan2f(sinb, matrix->u.m[2][2]); gamma = atan2f(matrix->u.m[1][2] / sinb, -matrix->u.m[0][2] / sinb); } else { alpha = atan2f(matrix->u.m[0][1], matrix->u.m[0][0]); beta = 0.0f; gamma = 0.0f; } D3DXSHRotateZ(temp, order, gamma, in); rotate_X(temp1, order, 1.0f, temp); D3DXSHRotateZ(temp, order, beta, temp1); rotate_X(temp1, order, -1.0f, temp); D3DXSHRotateZ(out, order, alpha, temp1); return out; } static void rotate_X(FLOAT *out, UINT order, FLOAT a, FLOAT *in) { out[0] = in[0]; out[1] = a * in[2]; out[2] = -a * in[1]; out[3] = in[3]; out[4] = a * in[7]; out[5] = -in[5]; out[6] = -0.5f * in[6] - 0.8660253882f * in[8]; out[7] = -a * in[4]; out[8] = -0.8660253882f * in[6] + 0.5f * in[8]; out[9] = -a * 0.7905694842f * in[12] + a * 0.6123724580f * in[14]; out[10] = -in[10]; out[11] = -a * 0.6123724580f * in[12] - a * 0.7905694842f * in[14]; out[12] = a * 0.7905694842f * in[9] + a * 0.6123724580f * in[11]; out[13] = -0.25f * in[13] - 0.9682458639f * in[15]; out[14] = -a * 0.6123724580f * in[9] + a * 0.7905694842f * in[11]; out[15] = -0.9682458639f * in[13] + 0.25f * in[15]; if (order == 4) return; out[16] = -a * 0.9354143739f * in[21] + a * 0.3535533845f * in[23]; out[17] = -0.75f * in[17] + 0.6614378095f * in[19]; out[18] = -a * 0.3535533845f * in[21] - a * 0.9354143739f * in[23]; out[19] = 0.6614378095f * in[17] + 0.75f * in[19]; out[20] = 0.375f * in[20] + 0.5590170026f * in[22] + 0.7395099998f * in[24]; out[21] = a * 0.9354143739f * in[16] + a * 0.3535533845f * in[18]; out[22] = 0.5590170026f * in[20] + 0.5f * in[22] - 0.6614378691f * in[24]; out[23] = -a * 0.3535533845f * in[16] + a * 0.9354143739f * in[18]; out[24] = 0.7395099998f * in[20] - 0.6614378691f * in[22] + 0.125f * in[24]; if (order == 5) return; out[25] = a * 0.7015607357f * in[30] - a * 0.6846531630f * in[32] + a * 0.1976423711f * in[34]; out[26] = -0.5f * in[26] + 0.8660253882f * in[28]; out[27] = a * 0.5229125023f * in[30] + a * 0.3061861992f * in[32] - a * 0.7954951525f * in[34]; out[28] = 0.8660253882f * in[26] + 0.5f * in[28]; out[29] = a * 0.4841229022f * in[30] + a * 0.6614378691f * in[32] + a * 0.5728219748f * in[34]; out[30] = -a * 0.7015607357f * in[25] - a * 0.5229125023f * in[27] - a * 0.4841229022f * in[29]; out[31] = 0.125f * in[31] + 0.4050463140f * in[33] + 0.9057110548f * in[35]; out[32] = a * 0.6846531630f * in[25] - a * 0.3061861992f * in[27] - a * 0.6614378691f * in[29]; out[33] = 0.4050463140f * in[31] + 0.8125f * in[33] - 0.4192627370f * in[35]; out[34] = -a * 0.1976423711f * in[25] + a * 0.7954951525f * in[27] - a * 0.5728219748f * in[29]; out[35] = 0.9057110548f * in[31] - 0.4192627370f * in[33] + 0.0624999329f * in[35]; } FLOAT * WINAPI D3DXSHRotateZ(FLOAT *out, UINT order, FLOAT angle, const FLOAT *in) { UINT i, sum = 0; FLOAT c[5], s[5]; TRACE("out %p, order %u, angle %f, in %p\n", out, order, angle, in); order = min(max(order, D3DXSH_MINORDER), D3DXSH_MAXORDER); out[0] = in[0]; for (i = 1; i < order; i++) { UINT j; c[i - 1] = cosf(i * angle); s[i - 1] = sinf(i * angle); sum += i * 2; out[sum - i] = c[i - 1] * in[sum - i]; out[sum - i] += s[i - 1] * in[sum + i]; for (j = i - 1; j > 0; j--) { out[sum - j] = 0.0f; out[sum - j] = c[j - 1] * in[sum - j]; out[sum - j] += s[j - 1] * in[sum + j]; } if (in == out) out[sum] = 0.0f; else out[sum] = in[sum]; for (j = 1; j < i; j++) { out[sum + j] = 0.0f; out[sum + j] = -s[j - 1] * in[sum - j]; out[sum + j] += c[j - 1] * in[sum + j]; } out[sum + i] = -s[i - 1] * in[sum - i]; out[sum + i] += c[i - 1] * in[sum + i]; } return out; }

    參考

    [1] 姚端正, 梁家寶. 數(shù)學(xué)物理方法-第4版..

    [2] 顧樵. 數(shù)學(xué)物理方法.

    [3] Robin Green. "Spherical harmonic lighting: The gritty details." Archives of the Game Developers Conference. Vol. 56. 2003.

    [4] Joseph Ivanic, and Klaus Ruedenberg. "Rotation matrices for real spherical harmonics. Direct determination by recursion." The Journal of Physical Chemistry 100.15, 6342-6347, 1996.

    [5] Wikipea. Euler angles

    [6] Peter-Pike Sloan. "Stupid spherical harmonics (sh) tricks." Game developers conference. Vol. 9. 2008.

    [7] Ravi Ramamoorthi, and Pat Hanrahan. "An efficient representation for irradiance environment maps." Proceedings of the 28th annual conference on Computer graphics and interactive techniques. 2001.

    掃描二維碼推送至手機(jī)訪問(wèn)。

    版權(quán)聲明:本文由財(cái)神資訊-領(lǐng)先的體育資訊互動(dòng)媒體轉(zhuǎn)載發(fā)布,如需刪除請(qǐng)聯(lián)系。

    本文鏈接:http://www.daniuzhishi.com/?id=16130

    “球諧光照——球諧函數(shù)” 的相關(guān)文章

    籃球——NBA常規(guī)賽:勇士勝爵士

    籃球——NBA常規(guī)賽:勇士勝爵士

       當(dāng)日,在2022-2023賽季NBA常規(guī)賽比賽中,金州勇士隊(duì)主場(chǎng)以129比118戰(zhàn)勝猶他爵士隊(duì)。 11月25日,勇士隊(duì)球員湯普森(右)在比賽中進(jìn)攻。新華社發(fā)(董旭東攝) 11月25日,勇士隊(duì)球員庫(kù)里(上)在比賽中防守。新華社發(fā)(董旭東攝) 11月25日,勇士隊(duì)...

    中國(guó)最美庫(kù)蜜終于出現(xiàn)了,轉(zhuǎn)戰(zhàn)世界杯,從籃球女神變足球小仙女

    中國(guó)最美庫(kù)蜜終于出現(xiàn)了,轉(zhuǎn)戰(zhàn)世界杯,從籃球女神變足球小仙女

      文/籃郭先生   提及小七,若是關(guān)注NBA,關(guān)注籃球的粉絲,還是非常熟悉的。因?yàn)椋∑咭恢币詠?lái)都有一個(gè)標(biāo)簽,這樣的標(biāo)簽就是:中國(guó)最美庫(kù)蜜。同時(shí),她也基本上用這樣的標(biāo)簽出了一本書(shū)。此前的她,多次直播勇士的比賽,也因自己青春、清純的外表圈粉無(wú)數(shù)。小七有一張娃娃臉,給人一種永遠(yuǎn)是學(xué)生...

    標(biāo)準(zhǔn)籃球場(chǎng)地平面示意圖!

    標(biāo)準(zhǔn)籃球場(chǎng)地平面示意圖!

      世界錦標(biāo)賽,奧運(yùn)會(huì)籃球比賽,F(xiàn)IBA組織舉辦的賽事等,所使用籃球場(chǎng)地都采用FIBA規(guī)則,與美職籃(NBA)籃球場(chǎng)地略有不同。 籃球場(chǎng)地平面示意圖高清版   場(chǎng)地參數(shù)   球場(chǎng)尺寸:長(zhǎng)28m寬15m。(美職籃:長(zhǎng)28.65m,寬15.24m)  ...

    各類(lèi)型球場(chǎng)尺寸介紹

    各類(lèi)型球場(chǎng)尺寸介紹

    在建造籃球場(chǎng)地時(shí),主場(chǎng)區(qū)域28*15m(包含副場(chǎng)32*18),再加上周?chē)鷧^(qū)域,總面積要達(dá)到32.1*22.1m或18m(18m為最小寬度)。這樣的場(chǎng)地可以適應(yīng)各種地方級(jí)的比賽,如果利用現(xiàn)有場(chǎng)地進(jìn)行各級(jí)別的國(guó)內(nèi)比賽,場(chǎng)地的長(zhǎng)度和寬度都可以根據(jù)實(shí)際情況比標(biāo)準(zhǔn)小一些,但是不能太多;場(chǎng)地長(zhǎng)度最多可...

    環(huán)形塑膠跑道標(biāo)準(zhǔn)尺寸——400米標(biāo)準(zhǔn)跑道尺寸、300米跑道尺寸、200米跑道尺寸

    環(huán)形塑膠跑道標(biāo)準(zhǔn)尺寸——400米標(biāo)準(zhǔn)跑道尺寸、300米跑道尺寸、200米跑道尺寸

    原標(biāo)題:環(huán)形塑膠跑道標(biāo)準(zhǔn)尺寸——400米標(biāo)準(zhǔn)跑道尺寸、300米跑道尺寸、200米跑道尺寸 400米標(biāo)準(zhǔn)跑道尺寸圖 400米標(biāo)準(zhǔn)跑道尺寸圖(圖片可放大——新窗口打開(kāi)即可) 國(guó)際田聯(lián)(IAAF)400米標(biāo)準(zhǔn)跑道記號(hào)平面圖(比例:1:300)...

    《街頭籃球》,在特定時(shí)代下流行

    《街頭籃球》,在特定時(shí)代下流行

    教練,我要打籃球 2020年給人一種滄桑的感覺(jué)。年初,人們的正常生活被突如其來(lái)的疫情打亂,大年初三,又傳來(lái)了前NBA球星科比·布萊恩特和二女兒吉安娜意外墜機(jī)身亡的噩耗,這讓很多人本就壓抑的心情雪上加霜,大家紛紛在社交平臺(tái)紀(jì)念這位傳奇巨星。 有人說(shuō),籃球代表了一代人...

    ?