Comments
Description
Transcript
第6回 「アニメーション(2)」 パーティクルアニメーション
2013年度 春学期 火曜日2時限目 λ18 教室 デザイン戦略(コンピュータアニメーション) 担当:中村 太戯留 第6回 「アニメーション(2)」 ■ パーティクルアニメーション パーティクルは「粒子」や「分子」という意味であり、「運動する点(の集まり)」として表現された アニメーションのことを、パーティクルアニメーションと呼ぶ。この1つ1つのパーティクルに対し て、物理的な計算処理を施し、物理現象をシミュレートできるようになっている。 手順(雪を降らせる) : 1. メインメニューを[ダイナミクス]に切り替える 2. [ウィンドウ] – [設定/ プリファレンス ] – [プリファレンス]を開き、 [設定]タブで時間= NTCS(30fps), [タイムスライダ]タブでアニメーション時間を 720 フレームに設定する 3. (放出源の平面)[作成] – [ポリゴンプリミティブ] – [プレーン■]を作成し、幅の分割数=16、 高さの分割数=16 に設定し平面を作成する。名前を「emitterPlane1」に変更し、移動 Y = 20、 幅 = 50、高さ = 50 に設定する 4. 平面を選択し、 [パーティクル] – [オブジェクトから放出] (放出源にする)を実行する。 5. (放出源の設定)名称を「emitter1」から「snowEmitter1」に変更し、その「snowEmitter1」 を選択してアトリビュートエディタを開き、エミッタタイプ = サーフェス、レート =300、スピ ード = 2、ランダムスピード = 1、法線のスピード = -1 に設定する 6. (放出物の設定)名称を「particle1」から「snowParticle1」に変更し、その「snowParticle1」 を選択してアトリビュートエディタを開き、ライフスパンモード = 定数、ライフスパン = 10、 デプスソート = オン、パーティクルのレンダータイプ = マルチストリーク、ここで[カレントレ ンダータイプ]ボタンを押し、ラインの幅 = 3、マルチ数 = 10、マルチ半径 = 0.3、尾の減衰 = 0.5 に設定する 7. (乱気流の設定)「snowParticle1」を選択して[フィールド] – [乱気流]を選択し、名称を 「snowTurbulence Field1」に変更し、アトリビュートエディタで、マグニチュード= 5、減衰 = 0 に設定する 8. 「emitterPlane1」を[Ctrl]-h で非表示にする 9. ハイパーシェードで[Lambert シェーダ]に白色を割り当て、snowParticle1 を選択して、ハイ パーシェードのマテリアル上で右プレスして、[マテリアルを選択項目に割り当て]を実行する 図 6-1:パーティクルアニメーションの例(雪) 演習 1:手順 1~9 と図 6-1 を参考にして、雪を降らせてみなさい。また、パラメータを調整して、 1 2013年度 春学期 火曜日2時限目 λ18 教室 デザイン戦略(コンピュータアニメーション) 担当:中村 太戯留 自分の好きな雪を表現してみなさい。 (レンダリングの際は Maya ハードウェアを使用のこと) また、レンダリング時にアルファチャンネルをオンにして、Final Cut Pro で他のシーンや実写映 像と合成することで、特定のシーンに雪を降らせることができるので試してみるとよい。 ■ MEL:スクリプトジョブ scriptJob というコマンドを用いることにより、Maya の中で何らかの変化があった時に、特定の コマンドやプロシージャを実行することができる。このコマンドでは、実行する内容をジョブという 形式で覚えており、各ジョブにはジョブ番号が自動的に割り振れている。一方、この番号を指定して ジョブを削除することにより、その実行を止めることができる。 scriptJob -conditionTrue "SomethingSelected" "delete"; 演習2:複数(5 こくらい)の球を作成し、一旦、非選択状態にしてから、上記のコマンドを実行し、そ して球を順に3つ選択してみなさい。それらが消えることを確認しなさい。 scriptJob scriptJob -listJobs ; -kill 番号 ; // 番号は 30 などの数字にすること 演習3:次にジョブのリストを表示し、ジョブ番号を指定してスクリプトジョブを止めなさい。その 後、残りの球を選択し、球が消えないことを確認しなさい。 global proc ex61() { float $x = `getAttr sphere1.tx`; if($x > 5.0) { setAttr sphere1.tx 5.0; } } sphere -r 1 -n sphere1; scriptJob -attributeChange sphere1.tx ex61; スクリプト 6-1: ex61.mel 演習 4:スクリプト 6-1 を実行し、球の X 座標を 5 より大きい値にするとどうなるか観察しなさい。 その後、ジョブ番号を指定してそのスクリプトジョブを停止しなさい。 ■ MEL:エクスプレッション expression というコマンドを用いることにより、アトリビュートを数式やプロシージャを用いてア ニメーションさせることができる。エクスプレッションでは、frame (現在のフレーム数)と time (現在 の時間、NTSC の場合、1フレームあたり 1/30=0.033 秒ずつ進む)というキーワードを用いて式や プロシージャを作成することができる。なお、MEL の変数のように$をつける必要はない。 sphere -r 1 -n sphere1; expression -string "sphere1.tx = 5 * sin(time);"; 演習 5:上記のコマンドを実行し、その後アニメーションを実行し、球の動きを観察しなさい。 2 2013年度 春学期 火曜日2時限目 λ18 教室 デザイン戦略(コンピュータアニメーション) 担当:中村 太戯留 global proc ex62(int $num) { int $n; for($n = 0; $n < $num; $n++) { string $name[] = `cone`; move ($n * 2) 0 0; float $val = $n * 0.3; expression -object $name[0] -string ("sy = 3 * sin(time + " + $val + ");"); } } ex62(10); スクリプト 6-2: ex62.mel 演習 6:スクリプト 6-2 を実行し、その後アニメーションを実行し、円錐の動きを観察しなさい。 ■ MEL:パーティクル particle というコマンドを用いることにより、必要な数のパーティクル(大きさのない点の集合)を 作ることができる。具体的には、-p フラグの右に座標値をつけたものを、複数個列挙する。 particle -p 0 0 1 -p 1 0 0; 演習 7:上記のコマンドを実行し、作成されたパーティクルを観察しなさい。 global proc ex63() { int $n; float $x, $y, $z; string $points = ""; for($n = 0; $n < 10; $n++) { $x = rand(-5.0, 5.0); $y = rand(-5.0, 5.0); $z = rand(-5.0, 5.0); $points = $points + " -p } eval("particle" + $points); // X 方向のランダムな座標値 // Y 方向のランダムな座標値 // Z 方向のランダムな座標値 " + $x + " " + $y + " " + $z; } ex63(); スクリプト 6-3: ex63.mel 演習 8:スクリプト 6-3 を実行してみなさい。次に、パーティクルの個数、XYZ 方向のそれぞれの 範囲、そしてアトリビュートのパーティクルのレンダータイプ(particleRenderType:0、マル チポイント;1、マルチストリーク;2、数値;3、ポイント;4、球体;5、スプライト;6、ス トリーク;7、メタボールサーフェス;8、クラウド;9、チューブ)を指定できるように改造して みなさい。引数: ex63(int $num, float $rx, float $ry, float $rz, int $rType) 3 2013年度 春学期 火曜日2時限目 λ18 教室 デザイン戦略(コンピュータアニメーション) 担当:中村 太戯留 ■ MEL:エミッタ― emitter というコマンドを用いることにより、パーティクルを自動発生させることができる。また、 点や面から発生させたパーティクルのアトリビュートをキーフレームやエクスプレッションによって 変化させることによりアニメーションを作成することができる。 particle -p 1 0 0 -p 0 1 0 -p 0 0 1; string $name[] = `emitter -rate 10 -minDistance 1.0 -maxDistance 3.0`; particle; connectDynamic -emitters $name[0]; このスクリプトでは、まずパーティクルを3つ作成している。それらのパーティクルを発生源とし たエミッタ―を次に作成している。その際、毎秒 10 個の割合で、エミッタ―からの距離が 1.0~3.0 の間にパーティクルを発生させるようにオプションを設定している。そして、実際にパーティクルを 追加し、それらに直前で作成したエミッタ―(の設定)を結び付けてアニメーションさせている。 演習 9:上記のコマンドを実行し、その後アニメーションを実行し、パーティクルを観察しなさい。 global proc ex64() { string $name[] = `sphere -r 5`; expression -object $name[0] -string "ry = 30 * time"; string $ename[] = `emitter -type "surface" -normalSpeed 1.0 -tangentSpeed 0.0 -rate 1 $name[0]`; string $pname[] = `particle`; expression -object $pname[0] -string "ry = 30 * time"; connectDynamic -emitters $ename $pname[0]; } ex64(); スクリプト 6-4: ex64.mel このスクリプトでは、まず球体を作成し、それが1秒間に30度 Y 軸まわりに回転するように設定 している。そして、その球体の表面 (-type "surface")を発生源として、 法線方向のスピード1 (-normalSpeed 1.0)と接線方向のスピード0(-tangentSpeed 0.0)のパーティクルを、単位面積あたり 毎秒 1 つ(-rate 1)発生させるエミッタ―を作成している。そして、実際にパーティクルを追加し、そ のパーティクルにも1秒間に30度 Y 軸まわりに回転するように設定し、それらに直前で作成したエ ミッタ―(の設定)を結び付けてアニメーションさせている。 演習 10:スクリプト 6-4 を実行し、その後アニメーションを実行し、動きを観察してみなさい。 ■ MEL:フィールド フィールドとは、自然界にある様々な力をシミュレートして、アニメーションさせる方法の総称で ある。具体的には次のものがある:大気(air)、気体の動きをシュミレートするフィールド;ドラッグ (drag)、オブジェクトの動きに対して摩擦のような力が働くフィールド;重力(gravity)、重力をシュ ミレートするフィールド;ニュートン(newton)、2 つのオブジェクトが引力によってお互いに引きあ う動きをシュミレートするフィールド;放射状(radial)、磁石のようにある点から離れたり、吸いつく ような動きをシュミレートするフィールド;乱気流(turbulence)、乱気流のようにランダムな動きを 起こさせるフィールド;均一(uniform)、オブジェクトを一方向へ、一定の力で動かすフィールド;渦 (vortex)、渦や竜巻のような動きをシュミレートするフィールド。 4 2013年度 春学期 火曜日2時限目 λ18 教室 デザイン戦略(コンピュータアニメーション) 担当:中村 太戯留 string $gname[] = `gravity -pos 0 0 0 -magnitude 9.8 -dx 0 -dy -1 -dz 0`; connectDynamic -f $gname[0] $pname[0]; 演習 11:スクリプト 6-4 のプロシージャの最後( } の直前)にこのスクリプトを追加し、実行し、そ の後アニメーションを実行し、動きがどう変化するかを観察しなさい。 ■ MEL:コリジョン コリジョン(衝突)とは、パーティクルがポリゴンや NURBS などのオブジェクトに衝突した際の挙 動をアニメーションとして表現する方法の総称である。 global proc ex65() { // パーティクルの作成 string $ename[] = `emitter -pos 0.0 5.0 0.0 -type "direction" -dx -1.0 -dy -1.0 -dz 0.0 -spread 0.5 -rate 3`; string $pname[] = `particle`; connectDynamic -emitters $ename[0]; // 衝突対象となる平面の作成 string $targetName[] = `polyPlane -w 15 -h 15`; rotate 0 0 45; // パーティクルと平面のコリジョン設定 collision -resilience 0.3 -friction 0.1 $targetName[0] $pname[0]; // パーティクルに重力を設定 string $gname[] = `gravity`; connectDynamic -fields $gname[0] $pname[0]; } ex65(); スクリプト 6-5: ex65.mel このスクリプトでは、エミッタ―を Y 座標が 5 の位置に作成し(-pos 0.0 5.0 0.0)、下方に向かっ て(-type "direction" -dx -1.0 -dy -1.0 -dz 0.0)、90 度の範囲で拡散しながら(-spread 0.5)、毎 秒 3 個(-rate 3)放出するように設定している。そして、実際にパーティクルを追加し、それらに直前 で作成したエミッタ―(の設定)を結び付けてアニメーションさせている。次に、衝突対象となる平面を 作成し、45 度に傾けて配置している。そして、パーティクルと平面のコリジョン(衝突)設定をし、弾 性係数(-resilience 0.3)と摩擦係数(-friction 0.1)を指定している。そして、パーティクルに、下方 向へ落ちてゆくアニメーションをさせるために gravity フィールドを作ってコネクトしている。 演習 12:スクリプト 6-5 を実行し、その後アニメーションを実行し、動きを観察してみなさい。 ■ 参考サイト http://www.not-enough.org/abe/manual/maya/ http://www.not-enough.org/abe/manual/mel-ad09/ 5 2013年度 春学期 火曜日2時限目 λ18 教室 デザイン戦略(コンピュータアニメーション) 担当:中村 太戯留 ■ 火のエフェクト 特殊効果を加えることで、最終的な作品の完成度がかなり向上する。但し、特殊効果はあくまで味 付け的な要素であるため、必要以上に使いすぎると本来伝えたい内容が薄れてしまうため、その特性 と効果を理解したうえで必要な箇所にのみ用いるようにする必要がある。まずは、パーティクルアニ メーションの手法を利用して、物体から燃え上がる炎を表現してみる。 手順: 1. メインメニューを[ダイナミクス]に切り替え、タイムスライダを 150 フレーム程に設定する 2. [作成] – [ポリゴン プリミティブ] – [立方体]を生成する 3. [エフェクト] – [火の作成■]を選択し、[火を出すオブジェクト] = pCube1(オブジェクトの名 称) 、[火のパーティクルの名前] = pFire と入力して、[作成]ボタンを押す 4. メインメニューを[レンダリング]にし、[レンダー] – [カレントフレームのレンダー]を実行する 図 6-2:パーティクルを用いた炎(左)と花火(右)のアニメーションの例 演習13:上記の手順と図 6-2 を参考に立方体から炎が出るアニメーションを作成してみなさい。 演習14:また、上記の手順の3で[エフェクト] – [花火の作成■]を選択するとパーティクルアニメー ションで打ち上げ花火を作ることができるので試してみなさい。 ■ 本日の課題 1.最終課題でどのようなパーティクルアニメーションを利用してみたいか記しなさい。 (課題提出サ イトの「パーティクル」というエクセルファイルに記すこと) 2.雪が降るアニメーションを作成してみなさい。また、好きな景色を作成し、雪と重ねて、画面ダ ンプを取りなさい。(提出:ex61.mb、ex61.png) 3.MEL を用いて好きなパーティクルアニメーションを作成しなさい。画面ダンプも提出のこと。 (提 出:ex62.mel、ex62.mb、ex62.png) 4.(アドバンスト課題)上記1のアニメーションを作成してみなさい。作成に利用した MEL、画面 ダンプも提出のこと。 (提出:ex63.mel[複数あればファイル名は適宜]、ex63.mb、ex63.png) 。 以上 6