2012年09月13日

離散フーリエ変換による海面の生成 その2

続きです。Choppy wavesを試してみました。
Choppyというのは、波が荒いとか、波立ったという意味だそうです。

Choppy wavesは、波の位置x=(x, z)にλD(x, t)を加えることで、尖った波を表現する方法のようです。
D(x, t)は、高さフィールドを計算するために生成したh~(k,t)を使って、以下の式で計算できるようです。

exp008.png

その後難しそうな計算が続いてよくわかりませんので、前回の参考文献[3]のソースコードを参考にさせていただきました。

waves関数内のchoppyの部分ですが、-i(n1,n2)/sqrt(n1^2+n2^2) * h~(n1, n2)を計算して、それを逆フーリエ変換して符号の調整を行うとDが計算できるようです。
FFTW用をDFT用に書き換えたため間違っているかもしれませんが、逆フーリエ変換後のdx(赤)とdz(緑)として、下図のようなデータが得られました。

choppy_after.png

実行結果

FFTがまだ実装できていないので、とりあえず64x64のメッシュをワイヤフレームでOpenGLで描画してみました。



最初の方がλ=0で、Choppyなしの波になっています。後半はλを少しずつ増やしていき、今回の例では0.6辺りが違和感ない係数でした。

Choppyを入れるとかなり波っぽくなっている感じがします。

次はFFTの実装とちゃんとしたレンダリングを行いたいと思います。
posted by シンドラー at 02:56 | Comment(2) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
海面生成のソースコードを共有いただけないでしょうか?
OpenGL ES 2.0 (iOS)で海面の描画にチャレンジしていて、
現在高校物理程度の波の式の複数合成で実装していますが、現実の酔うな海面にはほど遠いです。
こちらに記載のある方法でソースコードをもとに1から作り直したいと思っています。
どうぞよろしく御願いします。

Posted by 角 at 2015年06月22日 12:39
↓で公開しました。FFTはまだ携帯端末では重いかなーと思いますが参考までに。

OpenCVで海面生成のサンプル
http://sssiii.seesaa.net/article/421662677.html
Posted by シンドラー at 2015年07月02日 19:04
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/292275004
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック