水面

2009-11-14

水面1

水面2

あってるのかどうか、判断がつかない。

  • 水面はサイン波の組み合わせ。こんなに波立たせてるのに、コースティクスがいまいち。もっとポリゴン数を上げて、あとサイン波じゃなくてフラクタルとかにしたらそれっぽくなるのかな
  • 水面は反射4屈折6(フレネルなし)だけど、水上にはほとんどコースティクスが確認できず
  • 水中では進んだ距離の指数で青くなっていく、アウトスキャタリング的なことをしてみた(0.75, 0.95, 0.95)、でも効果わかりにくい
  • 水中から見上げる画像は、全反射だけじゃなくて上に抜ける角度にしたかったけど、カメラが実装されてないのでそのまま
  • 水の屈折率は1.3334
  • 放射40万フォトン
  • 今んところレイとの交差判定が総当りなのでむちゃむちゃ重い。32x32で精一杯
  • 水中でも水の密度?によってゆらゆら光が屈折すると面白いかもしれない

フォトンマップ フォトンマップ

追記:よい写真

別アングル

カメラを実装して、別アングルからの画像を作ってみた。

左の絵の別アングル:すごく浅く狭く感じる。水の透明感はいい感じ。

水面4

右の絵の別アングル:球を小さくして浮かして、水中から上を見上げてみた。屈折で透過する領域と全反射する領域ができて満足。画角120度。

水面5

そろそろシーンをソースに書いてるのが辛くなってきた。

カメラのソース:

class Camera {
vec eye, base, xaxis, yaxis;
void lookat(vec org, vec target, vec up, float fov, int width, int height) {
eye = org;
vec zaxis = target.sub(org).normal();
vec tempx = zaxis.cross(up);
xaxis = tempx.scale(2 * sin(fov/2) * width / height / tempx.length() / width);
vec tempy = zaxis.cross(xaxis);
yaxis = tempy.scale(2 * sin(fov/2) / tempy.length() / height);
base = zaxis.add(xaxis.scale(-0.5 * width)).add(yaxis.scale(-0.5 * height));
}
vec raydir(float x, float y) {
return base.add(xaxis.scale(x)).add(yaxis.scale(y)).normal();
}
vec org() {
return eye;
}
}