Top > 球面調和関数

Spherical Harmonics Function

  • 球面調和関数の回転?

概要

球面調和関数は複素関数。以下では実部だけ用いる。

てきとうな理解

  • えっと、なにをやりたいかというと
  • 3次元空間のある一点から見て、あらゆる方向に定義されるなんらかの値があるとして(例えば入射する光の強さとか)
  • それを角度を表す2つの変数θ, Φの関数f(θ, Φ)とする
  • こいつは普通複雑なので適当な関数による近似であらわしたい
  • そんなときにこの球面調和関数を基底関数として使えばそれぞれ単位直交するから、フーリエ展開のsin nx,cos nxみたいに分解できて便利

ってな感じ。

計算方法

Spherical Harmonic Lighting;The Gritty Detailsから

y_l^m(\theta, \phi) = \begin{Bmatrix}\sqrt{2}K_l^mcos(m\phi)P_l^m(cos\theta), && m>0 \\ \sqrt{2}K_l^mcos(-m\phi)P_l^{-m}(cos\theta), && m<0 \\ K_l^0 P_l^0(cos\theta), && m=0 \end{Bmatrix}


K_l^m = \sqrt{\frac{(2l+1)}{4\pi}\frac{(l-|m|)!}{(l+|m|)!}}  単位化するための係数
  • l: 0, 1, ...
  • m: -l <= m <= +l
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
/// renormalisation constant for SH function
double K( int l, int m )
{
    double temp = ((2.0 * l + 1.0) * factorial(l - m)) / (4.0 * PI * factorial(l + m));
    return sqrt( temp );
}
 
/// return a point sample of a Sphrical Harmonic basis function
/**
    @param        l         l is the band, range [0..N]
    @param        m        m in the range [-l..l]
    @param        theta    theta in the range [0..Pi]
    @param        phi        phi in the range [0..2Pi]
 */
double SH( int l, int m, double theta, double phi )
{
    assert( l >= 0 );
    assert( -l <= m && m <= +l );
 
    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));
}

関数P()はルジャンドル陪関数から

バンド幅が大きいとちゃんと計算できないかも

テスト

sh.png

GLUTを使って球面調和関数の値を描画するテストプログラムのソース。

ダウンロード:fileRenderSH.cpp

どうも色が暗すぎるように思うんだけど…。ちゃんと積分すると1になるんだろうか?

追記:暗く見えるのは単位球面上で積分した結果が1になるため。単位球の表面積は4π*1*1。例えばl=m=0の場合全面0.282094で、積分すると4π*0.282094*0.282094 ≒ 1 になる。

Link

D3DX

  • D3DXSHAdd
  • D3DXSHDot
  • D3DXSHEvalConeLight
  • D3DXSHEvalDirection
  • D3DXSHEvalDirectionalLight
  • D3DXSHEvalHemisphereLight
  • D3DXSHEvalSphericalLight
  • D3DXSHMultiply2
  • D3DXSHProjectCubeMap
  • D3DXSHRotate?
  • D3DXSHRotateZ
  • D3DXSHScale

添付ファイル: fileRenderSH.cpp [詳細] filesh.png [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-04-01 (日) 22:42:57