正規分布関数の確率密度関数を応用した関数を使って平面形状から山のモデルを作るMELスクリプトです。
引数説明
$repeatNum >作る山の数
$offsetMax >山の位置の最大ずれ幅
$scaleMax >山の最大の高さ
$varMax >山の緩やかさの最大値
実行例
以下に理論の簡単な説明を記します。
ここで使った関数を山関数と呼ぶことにします。
最初に山関数の定義をします。山関数は正規分布を応用するのでベースとなる正規分布の確率密度関数を見てみます。
σが標準偏差、μが平均を表しています。正規分布について詳しくはWikipediaに任せます。
グラフにすると次のような形になります。(Wikipediaより)
ここで1/sqrt(2πσ)の部分は正規化をするための係数で、山関数には不要な部分なので省きます。
次に2σ^2の部分ですが、こちらもわかりやすくvというひとつの値にまとめます。すると、次のような式にまとまります。
これを2次元に拡張して、山の高さを調整する係数wをかけてやれば、1つだけ山を作るための山関数の完成です。
この関数のパラメータは以下のようになります。
v >山の緩やかさを表し、大きいほど緩やかな山になる。
μx >山の中心位置のx座標のずれ
μz >山の中心位置のz座標のずれ
w >山の高さ
この関数を3次元で表すと次のような山型の形状が現れます。 上記のパラメータに対してランダムなパラメータを用いてこのような形状を生成してゆき、それらを何個も重ね合わせれば山の完成です。
おもしろいので是非やってみてください。
global proc makeMountain(float $repeatNum, float $offsetMax, float $scaleMax, float $varMax) { int $i, $j; float $x, $z; float $offset_y, $offset_x[], $offset_z[]; float $scale[], $var[]; string $vtxName; for($j=0; $j<$repeatNum; $j++){ $offset_x[$j] = rand(-$offsetMax, $offsetMax); $offset_z[$j] = rand(-$offsetMax, $offsetMax); $scale[$j] = rand(0.1, $scaleMax); $var[$j] = rand(0.1, $varMax); } string $sels[] = `ls -sl`; string $pl = $sels[0]; vector $v_all[]=`xform -q -ws -t ($pl+".vtx[*]")`; $i=0; for($pos in $v_all){ $pos_y = $pos.y; for($j=0; $j<$repeatNum; $j++){ $x = $pos.x+$offset_x[$j]; $z = $pos.z+$offset_z[$j]; $pos_y+=exp(-$z*$z/$var[$j]) *exp(-$x*$x/$var[$j])*$scale[$j]; } $vtx = $plane+".vtx["+$i+"]"; xform -ws -t ($pos.x) $pos_y ($pos.z) $vtx; $i++; } }
引数説明
$repeatNum >作る山の数
$offsetMax >山の位置の最大ずれ幅
$scaleMax >山の最大の高さ
$varMax >山の緩やかさの最大値
実行例
makeMountain(100, 10, 3, 10);
以下に理論の簡単な説明を記します。
ここで使った関数を山関数と呼ぶことにします。
最初に山関数の定義をします。山関数は正規分布を応用するのでベースとなる正規分布の確率密度関数を見てみます。
σが標準偏差、μが平均を表しています。正規分布について詳しくはWikipediaに任せます。
グラフにすると次のような形になります。(Wikipediaより)
ここで1/sqrt(2πσ)の部分は正規化をするための係数で、山関数には不要な部分なので省きます。
次に2σ^2の部分ですが、こちらもわかりやすくvというひとつの値にまとめます。すると、次のような式にまとまります。
これを2次元に拡張して、山の高さを調整する係数wをかけてやれば、1つだけ山を作るための山関数の完成です。
この関数のパラメータは以下のようになります。
v >山の緩やかさを表し、大きいほど緩やかな山になる。
μx >山の中心位置のx座標のずれ
μz >山の中心位置のz座標のずれ
w >山の高さ
この関数を3次元で表すと次のような山型の形状が現れます。 上記のパラメータに対してランダムなパラメータを用いてこのような形状を生成してゆき、それらを何個も重ね合わせれば山の完成です。
おもしろいので是非やってみてください。