3Dで雨を降らす
Posted 2013.04.13 in 流動指向ゲームエンジン『Fooo』
以前に書いた 「雨を降らす」 の記事では、
2Dで雨を降らせていたが、3Dが扱えるということで今回は3Dで雨を降らせてみよう。
2Dの時は雨粒の大きさで距離感を表現していたが、
3Dでは雨粒を3D空間に配置できるので実際に遠くの位置に配置できる。
雨粒を3D空間に配置できるということは、雨粒を別の角度から見ることもできるということだ!
3D空間の見え方を変えるには、視点と注視点の位置を指定する。
ただしパラメータで指定するのではなく、ちょっと変わった方法で指定する。
具体的には3Dステージデーカーの子として”Camera”という名前のデーカーを作ると
そのデーカーの位置が視点となる。
同様に”Target”という名前のデーカーを作るとそのデーカーの位置が注視点となる。
デーカーの位置を基準とするので、デーカーを動かせば視点を操作できるという仕掛けだ。
class 雨クラス
{
method 雨クラス()
{
}
method OnEnter()
{
int $number = 0;
while(true)
{
string $name = "雨粒"+String($number++);
ThreadCreate(call=@雨粒スレッド(name=$name));
wait 10;
}
}
method 雨粒スレッド(string $name)
{
float $x = Float(rand_range(-5000,5000));
float $y = 10000.0;
float $z = Float(rand_range(-5000,5000));
int $time = 1000;
Create3DImage(name=$name
, x=$x, y=$y, z=$z, rz=-90.0, ox="Center", oy="Middle", sx=500%, sy=500%
, image="雨粒.png", sampling="BieLinear", back=true);
Enter(to=$name);
Move3D(to=$name, time=$time, y=0.0);
WaitDecor(to=$name);
Delete(to=$name);
}
}
method Main()
{
Create3DStage(name="Stage", w=1280, h=720);
Create3DModel(name="Stage/空", model="空.lwo", render="Color");
Create3DObject(name="Stage/雨", class=@雨クラス());
Create3DNode(name="Stage/Target", y=1000.0);
Create3DNode(name="Stage/Camera", y=0.0, z=-10.0);
Enter(to="Stage");
Enter(to="Stage/*");
// 視点を移動
Move3D(to="Stage/Camera", time=10000, y=1000.0, z=-2000.0, step="AccSig");
}