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

2010年2月27日土曜日

パーティクル・インスタンサーの回転速度を特定の期間だけ遅くする

パーティクル・エクスプレッションでrotPPを使って、インスタンサーを回転させている場合。
パーティクルのConserveを下げて、急激に移動速度を落としたり、停止しても当然ながら回転数は落ちない。
エクスプレッションなのでConserveの影響は受けないからだ。

タイムワープの効果を出すためにパーティクルの速度を落としても、これではおかしい。
タイムワープをするときには、カメラがインスタンサーに近づきクローズアップされることも多いので
余計に目立つ。

以前、if分を使って、その回転数を変えようとしたがうまくいかなかったのであきらめたが、今回は時間があるので特定フレームの回転をかえるのに再チャレンジした。

----------------------------------------
まずif文を使うテストをおこなった。
ポリゴンのTorusを作成してz軸を回転させるためのエクスプレッションを作成。
pTorus1.rotateZ += 0.1;

これをフレーム300に達したとき回転を変えるようにしたいので、
まずフレーム300に達したときにフレーム数をプリントするエクスプレッションを作成して、きちんと動作するかどうか試してみた。

if (frame > 300){
$frame = frame;
print ($frame+"\n");
}


これはちゃんと動いたのでif文をちゃんと機能させられることがわかった。
次にこれを回転を変えるために用いてみる。

----------------------------------------
テスト1:
フレーム300に到達したらpTorus2のz軸の回転を0.1にする。
それ以外(この場合は1-299)は回転は1。
if (frame > 300){
pTorus1.rotateZ += 0.1;
}
else
{pTorus1.rotateZ += 1;}



テスト2:
フレーム300~599の間はZ軸の回転を0.1にする。
それ以外(1~299と600以降)の回転は1。

if (frame > 300 && frame < 600){
pTorus1.rotateZ += 0.1;
}
else
{pTorus1.rotateZ += 1;}


----------------------
では実際のパーティクル・エクスプレッションで試してみる。

前準備:
インスタンサーを追加し、パーティクル単位アトリビュートに
rotPPという名前のアトリビュートをvectorで作成し、以下のエクスプレッションを追加。

<Creation> 
particleShape1.rotPP=rand(0,360);

<Runtime before dynamics>
particleShape1.rotPP += 10;

InsatncerセクションのRoationOptionにあるRotationをrotPPに変えておく。

ーーーーーーーーーーーーーーーー
このRuntimeのほうをさきほどのif文と同じようにしてやればうまくいくはず。

if (frame > 300 && frame < 600){
particleShape1.rotPP += 1;
}
else
{particleShape1.rotPP += 10;}

----------------------------------------
うまくいったが、
フレーム数を変更しやすくするために変数を使うように修正。
// put time warp start/end frames.
int $start = 30;
int $end   = 60;

if (frame > $start && frame < $end){
particleShape1.rotPP += 1;
}
else
{particleShape1.rotPP += 10;}


今回はこれでなんとか動作してくれるものができたし、これで支障がないので終わりとする。
本来ならスピードが落ちるまでの時間を調整し、徐々にスピードが落ちるところまで表現したいところなので、それはまた次回までの課題とする。

0 件のコメント:

コメントを投稿