正式公開版 Ver 0.1(99/9/14公開)
水表面の擬似物理演算サンプルプログラムです。
水サンプル ver0.1をダウンロードする(Windows95/98/NT4.0用、LZH圧縮、100KB)
プログラムソースも公開してます(こちらがメインです)。Visual C++ & MFC用です。
水サンプルVer0.1プログラムソース(Visual C++6.0用、LZH圧縮、30KB)
2000/4/13日 情報追加
dluさんがOpenGL版を作成されたということでリンクしておきます。
http://www.jouban.prug.or.jp/exp/~kit/GLwater.html
ソースが公開されているというのがポイントですので、興味のある方は参照されてください。
しかし、水面は今、流行ですね。
9/22日 関連プログラム公開
BBSの方で、陽炎みたいのも同様の方法でできるのでは?と指摘しましたので、一応それを示しておこうということで公開。↓これです。
ぶれサンプル ver1.0をダウンロードする(Windows95/98用、LZH圧縮、222KB)
ぶれサンプルVer1.0プログラムソース(Visual C++6.0用、LZH圧縮、54KB)
やってることは凄い簡単。単にメッシュでテクスチャのuv座標を揺らしてるだけ。
なお、揺らし方は水サンプルと同じだけど、今回はもっと簡単な方法で処理してます。プログラムこんなん↓
// 1ステップ前の値を保存
for (y = 0; y < MY; y++) {
for (x = 0; x < MX; x++) {
ocu[y][x] = cu[y][x];
ocv[y][x] = cv[y][x];
}
}
// 差分計算
for (y = 1; y < MY - 1; y++) {
for (x = 1; x < MX - 1; x++) {
double du = 0;
double dv = 0;
du += ocu[y + 1][x] * 0.1;
dv += ocv[y + 1][x] * 0.1;
du += ocu[y][x + 1] * 0.1;
dv += ocv[y][x + 1] * 0.1;
du += ocu[y][x - 1] * 0.1;
dv += ocv[y][x - 1] * 0.1;
du += ocu[y - 1][x] * 0.1;
dv += ocv[y - 1][x] * 0.1;
du -= ocu[y][x] * 0.4;
dv -= ocv[y][x] * 0.4;
vcu[y][x] += du;
vcv[y][x] += dv;
cu[y][x] += vcu[y][x] * 0.1;
cv[y][x] += vcv[y][x] * 0.1;
}
}
なぜこうなるのかとかは、各自で考えましょう。
なお、実はばねメッシュとほとんど同じ動きのはずです。試しにスペース押してみましょう(^^;
9/21日 情報追加
かみやんさんとこ、水面が物凄いリアルになってます。
http://www.asahi-net.or.jp/~qs7e-kmy/tawagoto/990921/
ぜひとも見てみましょう。
9/15日 情報追加
とりあえず、反射はレイトレの応用で各頂点毎にテクスチャマップ位置を計算すればよいんだよなぁ。さてどうしよう・・・とか考えていたら、あっさりとかみやんさんに実現されてしまいました(^^;
http://www.asahi-net.or.jp/~qs7e-kmy/tawagoto/990914/index.html
↑これです。
うん、作らないで済んだということで(笑)。あ、あと画像借ります。
いやぁ。さすがです。
9/14日 Ver0.1
BBSの方で水面の話が出たので、なんとなくやってみました。ちなみに2時間で作成。単にばねメッシュなので、正確には水面というより、四方が拘束された真空中のゴム面というとこですが、振動するのでなんとなく水らしいのではないかと。
なお、AnimeBodyで使ってる数値微分と積分を繰り返す方法ではなく、普通に数値積分二回の方法です。
操作方法は、スペースで中央をへこませる。カーソルで回転、Cでクリアです。
グラフィックスまともにして、反射とか屈折処理入れるとそこそこ見えるのではないかと思うので、後でやってみる予定。