« 落とし穴にはまった「スプラインエミッタにする」確認する為のC.O.F.F.E.E.エクスプレッション | トップページ | スプラインのブーリアン »

落とし穴にはまった「スプラインエミッタにする」XPressoのC.O.F.F.E.E.ノードで実験

では、XPressoのC.O.F.F.E.E.ノードで時間を取得して0フレームで初期化するには…

前回の実験結果より結論を言うと、C.O.F.F.E.E.ノード内で時間を取得するのは無理っぽいですね。

仕方がないので、時間を外から取り込むことにします。
新規ノード/XPresso/一般/「時間」

Coffeenode_time_01

C.O.F.F.E.E.ノードの入出力端子を全部削除して、新規で入力端子を「時間」で追加。
これはBaseTimeなんだろうか?

Coffeenode_time_02

確認のため「結果」ノードを追加。
新規ノード/XPresso/一般/「結果」
「結果」の属性マネージャのデータタイプを「時間」に変更。

Coffeenode_time_03

時間ノードと結果ノードを連結。
適当にアニメーションツールバーのスライダーをスライドさせてみる。

Coffeenode_time_04

結果ノードに表示されている数値は実数で単位は秒だなぁ。
C.O.F.F.E.E.ノードの追加した「時間」の端子は属性マネージャではフレームだ。

Coffeenode_time_05

C.O.F.F.E.E.ノードに次のスクリプトで確認。

/*
C.O.F.F.E.E.node入力端子「時間」の型を確認
2009.1.22
*/


main()
{
  println(getclass(Input1));//予想はBaseTime
}

結果は

Coffeenode_time_06

予想通りでした。
このBaseTimeが、レンダリング実行中に時間を刻むことを確認すれば問題は解決する。

/*
C.O.F.F.E.E.nodeに入力されたBaseTimeから秒数を取得
2009.1.22
*/


main()
{
  var sec = Input1->GetSecond();//入力されたBaseTimeから秒数を取得
  println(sec);//コンソールへ表示
}

スクリプトは、これで良し。

Coffeenode_time_08

時間ノードとC.O.F.F.E.E.ノードを連結し、コンソールの表示を消去。
一応、アニメーションツールバーのスライダーを動かして、コンソールに表示される時間が変化するか確認。変化してますね。

では、前回と同じように、レンダリング設定の出力のフレームを「全てのフレーム」へ変更し、「レンダリング後に保存」を実行。
「保存をせずに続行しますか?」ダイアログの「はい」を押して続行。

Coffeenode_time_07

見事に、レンダリング実行中に時間を吐き出しました。

では、ここで更に実験してみます。
シーンに適当なオブジェクトを追加して、XPresso編集ウィンドウにもドロップします。

自分は「立方体」にしました。

先ほどのC.O.F.F.E.E.ノードの入力端子に「リンク」でobjを追加します。
Input1 を tm に変更しました。
立方体ノードの出力端子に「オブジェクト」を追加しC.O.F.F.E.E.ノードに連結します。

Coffeenode_time_09

では、スクリプトです。

/*
0フレームで初期化するための前段階
2009.1.22
*/


main()
{
  var sec = tm->GetSecond();//入力されたBaseTimeから秒数を取得
  var pos = obj->GetPosition();//入力されたオブジェクトのポジションを取得


  pos.z += 100;//ポジションZに100を足す。pos.z = pos.z + 100;

  obj->SetPosition(pos);//入力されたオブジェクトに変更したポジションを適用
}

このスクリプトを実行すると、オブジェクトは画面が更新される(C4Dのイベントが発生する)たび(+Z)軸方向に向かって100づつ移動します。スライダーを0フレームに戻しても画面上には戻ってきません。

では0フレームでポジションを初期化するようにしてみよう。

/*
0フレームでポジションを初期化
2009.1.22
*/


main()
{
  var sec = tm->GetSecond();//入力されたBaseTimeから秒数を取得
  var pos = obj->GetPosition();//入力されたオブジェクトのポジションを取得


  pos.z += 100;//ポジションZに100を足す。pos.z = pos.z + 100;

  if(sec == 0)pos.z = 0;//0フレーム時ポジションzを0に変更

  obj->SetPosition(pos);//入力されたオブジェクトに変更したポジションを適用
}

赤いところを追加しました。
これでフレーム0になるとポジションzが0に初期化されます。

ただし、このスクリプトではx,yは初期化されません。
この方法だとフレームが進んでいなくても、C4Dのイベントが発生するたびポジションが更新されてしまいます。
一見、不便で不具合のようにも思われますが、インタラクティブにオブジェクトを動かす時(他のオブジェクトに干渉させたりするときなど…)に必要になってきます。

では、「レンダリング後に保存」でレンダリングしてみましょう。問題なくレンダリングされたと思います。

どうだろう自分で掘った「落とし穴」にはまってないだろうか?
気になる事が有るけど…

|

« 落とし穴にはまった「スプラインエミッタにする」確認する為のC.O.F.F.E.E.エクスプレッション | トップページ | スプラインのブーリアン »

コメント

この記事へのコメントは終了しました。