スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
漸く思い通りに MEL が書けるようになってきたので。

再帰プロシージャによってフラクタルな図形を
モデリングしてみたいなと以前から思っていました。

フラクタルとは自己相似、
つまり全体がそれ自身の一部と相似になっているものです。



最も簡単なフラクタルのアルゴリズムの一例として
中点変位法というものがあります。

二次元の場合、ある線分の垂直方向にその中点を移動し、
それを新しく生成された線分に対しても再帰的に行っていく計算方法の事です。

0508-1.png

とりあえずこれを MEL で書いて三次元で実装しようとしてみました。

始めに考えたのが、
まず仮引数として渡された face の法線ベクトルを変数に格納しておいて、
face を 分割し、真ん中に生成された vertex を face の法線方向に移動、
生成された各々の face を実引数として渡して再帰させるという方法です。

face を分割する段階で polySplit コマンドを使用しようとしたのですが
うまく全ての中点を結ぶ事が難しい上、できればポリゴンの頂点数に関わらず
対応させられるようにしたいので
polySubdivideFacet コマンドにより分割させる事しました。
その場合 face を1つずつ分割すると思い通りの結果にならなくなるので、
全ての face を一気に分割させなければならなくなりました。

したがって、見た目上は再帰関数の様ではありますが、
実際には分割する際に全ての face に対して行っているので
厳密には本当の意味での再帰関数とは異なります。


{
int $limitCount = 4;
float $randomAmp = 0.5;
string $selList[] = `ls -sl`;
centerPointDisplacement($selList, $limitCount, $randomAmp);
}

proc centerPointDisplacement(string $source[], int $limitCount, float $randomAmp)
{
string $sourceList[] = `filterExpand -selectionMask 34`;
string $nodeName = `plugNode $sourceList[0]`;
float $scale = 0.5/(log(`size $sourceList`)/log(4) + 1);
vector $normalList[];
for($i = 0; $i < `size $sourceList`; $i++){
string $normalAll[] = `polyInfo -faceNormals $sourceList[$i]`;
string $buffer[];
tokenizeList $normalAll[0] $buffer;
$normalList[$i] = <<(float)$buffer[2], (float)$buffer[3], (float)$buffer[4]>>;
}
polySubdivideFacet -dv 1 -m 0 -ch 1 $source;
string $faceAll[] = `polyListComponentConversion -toFace`;
string $faceList[] = `filterExpand -selectionMask 34`;
for($i = 0; $i < `size $sourceList`; $i++){
string $vertexAll[] = `polyInfo -faceToVertex $faceList[$i]`;
string $buffer[];
tokenizeList $vertexAll[0] $buffer;
vector $moveVec = unit($normalList[$i]) * $scale * rand(1 - $randomAmp, 1 + $randomAmp);
move -r ($moveVec.x) ($moveVec.y) ($moveVec.z) ($nodeName + ".vtx[" + (float)$buffer[5] + "]");
}
if(`size $faceList` < pow(4,$limitCount)) centerPointDisplacement($faceList, $limitCount, $randomAmp);
}


適当な face (1つの face 面積 50 unit2 以下くらい)を選択して
上のソースコードを実行してみてください。
一応それらしい事はできているのですが、
私が思い描いていたものとは少し異なりました。

二次元での中点変位法を参考にして三次元でも同様の事をしようと試みたのですが
三次元での中点変位法はこれ以外にも幾つか方法があるようです。
機会があればそちらも是非ためしてみようと思います。

最終的にはマンデルブロ集合やジュリア集合くらいのものを使って
三次元で面白いものが作れればいいかなと思っています。

0508_2.png

コメント
ほえ~。
こんな図形の作り方があるのですね。
MEL内で使用したコマンドを書いてもらえるのは
非常に勉強になります。
polySplitやpolySubdivideFacetなど
今まで存在すら知りませんでした^^;
なんか、こう、考え方が
”理系!”って感じの匂いがして素敵です。
2010.05.26 05:58 | URL | ほえ~ | 編集
>>ほえ~ さん
コメントありがとうございます!
恐縮ながらご参考にして頂いているようで非常に嬉しいです。
それらのコマンドは実際に Maya 上での
Split Polygon Tool や Add Divisions To Faces の
History を確認したりなどしてコマンドを存じ上げる事も多いです。
2010.05.27 21:54 | URL | らい | 編集
管理者のみ閲覧可能にする
Profile
HN らい

都内某社テクニカルディレクター
都内某専門学校講師
都内某企業講師
元中国某社S3Dスーパーバイザー
Contact
(ENGLISH OK. 可以用中文。)
Categories
Archives
RSS Link
QR Code