動機

唐突にd3moduleで波紋を描画してみたくなりました。

しかし、d3moduleでは球は描画できても円は描画できません。
仕方がないのでモジュールを作ります。

円描画モジュール

#define global RIPPLE_DIV 15    // 波紋を何分割して描画するか(大きければ大きいほどなめらかな円に近づく)

;円の描画部分はellerさんの「はずむ虹の輪」を参考にしています。
#module
;輪を描画
;強制的にxy平面に描画します。
#deffunc m_d3circle int _x, int _y, int _z, int _r
  d3setlocal _x, _y, _z  ;中心座標
  d3initlineto
  repeat RIPPLE_DIV + 1
    t = 2.0 * PI / RIPPLE_DIV * cnt
    d3lineto cos( t ) * _r, sin( t ) * _r
  loop
  return
#global
すみません。
ellerさんが「はずむ虹の輪」で波紋やってたのを思い出したのでスクリプト探して参考にしました。

雨を降らせてみた

ただ波紋を表示するのはあまりに不自然です。
雨でも降らすことにしました。

スクリプトはsample_06_snow_night.hspあたりを参考にしてみます。

雨の落下速度は終端速度に達しているころなので等速。
調べるとφ1.0で680cm/sec、φ2.0で962cm/secらしいです。
大きさはφ1.0~2.0ぐらいとしてランダムに決める。落下速度は直径に従う。

で、後は波紋を書けばok。

ようやく波紋

波紋。波の伝播速度の式を調べてみました。

波の伝播速度 = sqrt( g * h )
g:重力加速度
h:深さ

なるほど。深さ(水深)だけで決まるようです。
深いほど速く、浅いほど遅い。
遅すぎるとイライラするので、2.5cmぐらいで。

サンプルとスクリーンショット

という感じで出来上がったサンプルです。
雨が降るサンプル
好きに使ってください。

実行中のSS。
縮小すると何がなんだか分からないので、そのままの大きさで失礼します。
実行中のSS