<- Back

●Mayaでメタボール


メタボールの話です。メタボリックシンドロームではありません。CGの基本形状のひとつで、2個以上のメタボールをお互いに近づけると水銀のように滑らかに融合します。水などの液体を作るときによく使用されます。ちょっとした仕事でメタボールを使いたかったのですが、僕が使っているMayaはプリミティブとしてメタボールは持っていません。パーティクルのレンダリングタイプとして選択できるだけです(ブロッビーサーフェス)。

しかしパーティクルというのは物理シミュレーションさせることを前提としているので、粒ひとつひとつを手で動かすようにはできていないわけです。水のように不定形で大量のパーティクルを使うのではなく、数個のメタボールを自分の思い通りにアニメーションさせる、もしくはメタボールでインタラクティブにモデリングをするといったことは通常できません。したがってエクスプレッションを使ってちょっとトリッキーなことをやる必要があります。

この方法は僕の過去のウェブサイトに載せたことがあるので、もしかしたら見た方もいるかもしれませんが、あらためてここで紹介しようと思います。パーティクルの粒子を個別にインタラクティブに動かしたり大きさを変えたりすることはできません。やろうと思ったらエクスプレッションで制御するしかないわけです。そこで考えたのは、パーティクルの粒子の数と同じ個数だけNurbsの球(ポリゴンの球でも良い)を作り、個々の粒子の位置、大きさを、Nurbs球のそれと連動させれば良いということです。実を言うと球ではなくロケータでも良いのですが、球のほうが見た目がパーティクル粒子と同じなので感覚的にわかりやすいでしょう。

この方法をつかってとりあえずやっつけで作ってみたのがこの謎のキャラです(笑)。



●Nurbs球とパーティクル粒子を同じ個数作成する

Nurbs球は普通にメニューから作成し、必要な個数デュプリケートして増やしておきます。パーティクルも"nParticle tool"等で作成しますが、下記スクリプトを実行すれば簡単に指定した個数のパーティクルを作ることができます(この例では40個のパーティクルが作られます)。

int $num = 40;
string $cmd = "nParticle ";
for($i = 0; $i < $num; $i++) {
   $cmd = $cmd+"-p 0.0 0.0 0.0 ";
}
eval $cmd;
ちなみにパーティクルはクラシックパーティクルではなくNパーティクルを使用します。理由はNパーティクルはポリゴンに変換できるからです。



●パーティクルにエクスプレッションを仕込む

パーティクルができたら、"Add Dynamic Attributes"で"radiusPP"を加えます。そして"Per Particle(Array) Attributes"の"Radius PP"のところに"Runtime Expression Before Dynamics"として、下記のスクリプトを仕込みます。

matrix $pos[40][3];
float $rad[];
string $paramA = " ";
string $paramB = " ";

for($i = 0; $i < 40; $i++) {
   $pos[$i][0] = `getAttr ("nurbsSphere"+($i+1)+".tx")`;
   $pos[$i][1] = `getAttr ("nurbsSphere"+($i+1)+".ty")`;
   $pos[$i][2] = `getAttr ("nurbsSphere"+($i+1)+".tz")`;
   $rad[$i]    = `getAttr ("nurbsSphere"+($i+1)+".scaleX")`;
   $paramA = ($paramA+" "+$pos[$i][0]+" "+$pos[$i][1]+" "+$pos[$i][2]);
   $paramB = ($paramB+" "+$rad[$i]);
}

eval("setAttr nParticleShape1.position -type vectorArray 40 "+$paramA);
eval("setAttr nParticleShape1.radiusPP -type doubleArray 40 "+$paramB);
このエクスプレッションは、パーティクルの名前が"nParticle1"、粒子数が40、Nurbs球の名前が"nurbsSphere1〜40"であることを前提にしています。それぞれが異なる場合はそれに合わせて該当部分を書き直さなければなりません。

以上で、Nurbs球を動かしたりスケールをかけたりすると、それぞれに対応したパーティクル粒子が一緒に動いたり大きさが変化したりします。ただし、エクスプレッションを動作させるためにはアニメーションスライダを1コマでもよいので動かす必要があります。また、Nパーティクルはデフォルトで既に重力などの影響を受けるようになっているので、全てのダイナミクス機能をオフにしておかないと、勝手に動いてしまいます。また、パーティクルのままではレンダリング結果がおかしくなるので、ポリゴンに変換しておきましょう(ポリゴン変換後もパーティクルの位置・大きさは変更可能です)。もちろんNurbs球はテンプレート化もしくはインビジブルにしておかないとレンダリングされてしまいます。



●問題点


<- Back