日本でハリウッドVFXを制作! 「経産省アイディアボックス」 結果:  
●まとめエントリはこちら ●FAQ ●お問い合わせは左のメールフォームから

2009年3月18日水曜日

練習 (6) for文

<状況>
前回のfollicleの続き。

ロケーターをコンストレインする方法は、ちゃんと動いてくれたが、キャラクタのサーフェイスがY方向へも動くため、地面にあるデブリを押さえつけるような形になることがあり、ちゃんとコリジョン判定できないことがあると想定されることに気がついた。

それでは、元々のサーフェイス自体をつかうのとあまり代りはない。
なので、シリンダはXZ方向のみ変化させるように変更することにした。


<練習>
これはコンストレイン時に、xzのみをコンストレインすることで解決する。
しかし後で、Y情報も利用したくなったときのためと、位置の微調整が簡単にできるようにするため、locatorを二つ使うことにした。

1つ目のロケーターAはfollicileへpointコンストレイン(xyz)。
2つ目のロケーターBは1つ目のロケーターへpointコンストレイン(xz)。
シリンダは二つ目のロケーターへペアレントする。

手順としては、
ロケーターBとポリゴンシリンダを、原点(0 0 0)に作成し、
それをすぐにペアレントする。
そして次にロケーターAをfollicleへコンストレイン。

{
for ($i=1; $i<48;>
string $lName = ("loc" + $i);
string $l2Name = ("loc" +$i);
string $fName = ("follicle" + $i);
string $cName = ("collision" + $i);

spaceLocator -name $lName;
spaceLocator -name $l2Name;
polyCylinder -name $cName;

select -clear;

select -add $cName;
select -add $l2Name;
parent;

select -clear;
select -add $lName;
select -add $l2Name;

pointConstraint -offset 0 0 0 -skip y -weight 1;

select -clear;
select -add $fName;
select -add $lName;

pointConstraint -offset 0 0 0 -weight 1;

}}

これを実行したところ、parentが実行されたあと、ポイントコンストレインのステップでエラーが発生。
// Error: line 22: Target list was empty or contained no valid targets. //
( // エラー: ターゲット リストが空か有効なターゲットが含まれていません。 // )

アウトライナーをみると、

loc1
loc2

が作成され、loc1が選択された状態になっている。


少なくとも「$lName」が選択されるところまでは実行されたのだろう。

そうすると問題は「$l2Name」のところで問題が起きたことになるが、よくみると
$l2Name変数に値を代入するところに間違いがあった。

ロケーターの名前が一番目のロケーターと同じになっていたのだ。

string $l2Name = ("loc" +$i);

これは以下のようになるべきだった。

string $l2Name = ("loc2_" +$i);

上記の間違いから、「$lName」と「$l2Name」の値が同じ「(loc1)」になっていた。
そのため、

1)「$lName」変数(値「loc1」)を使い「loc1」が作られる。
2)「$l2Name」変数(値「loc1」)を使い「loc1」を作ろうとするが、すでに同じ名前で存在するため自動的に名前が「loc2」になったロケーターが作られた。

アウトライナーを見ると一見、問題ないように思ったが、
本来は

loc1
loc2_1

となるべきだった。



それにより、ロケーター二つを選択するステップで、「$l2Name」を選択する時に、変数の値は「loc1」なのでloc1を再度選択しまった。
よってセレクションリストには、loc1が一つだけなので、上記のようなエラーがでたという具合だ。


これを修正して無事ちゃんと動いてくれた。

 

0 件のコメント:

コメントを投稿