しんさんのブログ

科学や技術のこと読書のことなど

球面調和関数を視覚化してみまして

球面調和関数と言えば物理やってる人は、水素原子のシュレディンガー方程式の解ということで学部時代に一度は教科書で見たことあるとか、テスト勉強で解いてみたことあるっていう人も多いのではないかと思います。
ルジャンドルの陪関数が出てきたり、添え字がいくつか出てきて混乱したり数式を見て挫折することも多いですが、よくよく見ると構造は単純で、三角関数の三次元版だと思えばいいわけです。

そんな球面調和関数ですが、コンピュータグラフィックスの世界でも意外と使われています。
先日ブログで球面調和に関するリンク集をつくりましたが、そこにいくつかCGでの応用例があります。
球面調和関数と大域照明について(web上のリンク集) - 科学やら技術やら

ざっくり言って信号処理で信号をフーリエ展開するように、CGでオブジェクトのライティングを行う際にいろんな方向からやってくるたくさんの光をひとまとめにして球面調和関数で展開してしまい、入ってくる光の情報を展開係数に圧縮してしまおうという話です。光源の高周波成分はどうせ拡散反射するならわかりませんから。

そんな球面調和関数をprocessingを使って描画するコードを書いてみました。
WEB上には、OpenGLとかDirectXを使ったコードは転がっていますが実行するにはライブラリやらSDKやらなにかと必要で敷居が高いのでさくっと実行できるProcessingで書いてみました。
元にした球面調和関数のコードは以下から使用させていただきました。
☆PROJECT ASURA☆ [OpenGL] 『球面調和関数(1)』

実行結果はこんな感じです↓
f:id:wshinya:20161208103747j:plain

まあやっていることは、ものすごく単純で、Processingのサンプルにある
processing-docs/NoiseSphere.pde at master · processing/processing-docs · GitHub
を改造して、lineで書いた球を乱数でゆらゆらしている部分の、lineで線を書いている部分を流用して、線の長さを球面調和関数の結果に置き換え、符号を色に置き換えただけです。
球面調和関数の計算コードは、Project Asuraさんのコードほぼそのままです。
キーボードからの入力でリアルタイムに球面調和の次数(l, m)を変えてイガイガの形を変えたり、マウスでぐりぐり回転させたりして楽しんでます。

コードは以下からどうぞ↓
github.com