« C4D レンダリング設定のアンチエイリアス設定を操作するスクリプト | トップページ | ポリゴンオブジェクトを1フレームごとにobj形式で保存 »

[artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-04]の解決法

artist side/C4Dコミュニティ 「キャラクタを1フレーム毎にobj形式でXPressoでの保存」?-04
http://villager-and-c4d.cocolog-nifty.com/blog/2009/07/artist-sidec4-3.html

の解決法です。
ただし、記事の解決であって、artist sideの質問の解決ではありません。

[bool]BaseDocument::SetTime([BaseTime]tm);

を使ってスクリプト内でタイムライン上を時間移動してアニメーションの結果を得る事に失敗しましたが…
ただ、SetTime()を実行する前に、ある事をすると…

前回の記事での失敗は…

オブジェクトにキーフレームを設定し、そのオブジェクトに対して前回の記事のユーザスクリプトを実行し、その結果は次のようでしたね。

/*
思ったようには行かないのだ…
残念ながら…
2009.7.12
*/


main(doc , op)
{
  var mnf = int(doc->GetMinTime()->GetFrame(doc->GetFps()));//アニメーションの最初のフレーム
  var mxf = int(doc->GetMaxTime()->GetFrame(doc->GetFps()));//アニメーションの最後のフレーム
  var tm = new(BaseTime);
  var c;

  for(c = mnf ; c <= mxf ; c++){
    tm->SetFrame(c , doc->GetFps());
    doc->SetTime(tm);
    EventAdd();
    println(c , " " , op->GetPosition());
  }
}

0 [-40.448509,40.314606,-19.697220]
1 [-40.448509,40.314606,-19.697220]
2 [-40.448509,40.314606,-19.697220]
3 [-40.448509,40.314606,-19.697220]
4 [-40.448509,40.314606,-19.697220]
5 [-40.448509,40.314606,-19.697220]
        :
        :
85 [-40.448509,40.314606,-19.697220]
86 [-40.448509,40.314606,-19.697220]
87 [-40.448509,40.314606,-19.697220]
88 [-40.448509,40.314606,-19.697220]
89 [-40.448509,40.314606,-19.697220]
90 [-40.448509,40.314606,-19.697220]

キーフレームが設定されているにもかかわらず、タイムラインの時間を進めても、スクリプト内で取得した位置の値は変化なしでした。

では、次のように追加変更します。

/*
今度は思ったように取得が可能
BaseDocument::AnimateDOcument()を使用。
2009.7.21
*/


main(doc , op)
{
  var mnf = int(doc->GetMinTime()->GetFrame(doc->GetFps()));//アニメーションの最初のフレーム
  var mxf = int(doc->GetMaxTime()->GetFrame(doc->GetFps()));//アニメーションの最後のフレーム
  var tm = new(BaseTime);
  var c;

  for(c = mnf ; c <= mxf ; c++){
    tm->SetFrame(c , doc->GetFps());
    doc->AnimateDocument(ANIMATE_QUICK);
    doc->SetTime(tm);
    println(c , " " , op->GetPosition());
  }
}

0 [128.843079,46.651550,152.723999]
1 [128.746429,46.588470,152.594727]
2 [128.459427,46.401131,152.210800]
3 [127.986267,46.092297,151.577881]
4 [127.331467,45.664894,150.701965]
5 [126.499115,45.121601,149.588562]
        :
        :
85 [-131.690491,-123.403526,-195.781921]
86 [-132.522842,-123.946815,-196.895325]
87 [-133.177643,-124.374214,-197.771240]
88 [-133.650803,-124.683052,-198.404160]
89 [-133.937805,-124.870392,-198.788086]
90 [-134.034454,-124.933472,-198.917358]

アニメーションで変化しているオブジェクトの位置を取得できています。

DSKによると…

[bool]BaseDocument::AnimateDocument([int]flag);

をBaseDocument::SetTime()を実行する前に呼び出してくださいとありました。

BaseDocument::AnimateDocument()はドキュメント全体をアニメーションさせます。
が、任意のオブジェクトのみのアニメーションは、

[bool]BaseDocument::AnimateObject([BaseObject]obj , [BaseTime]tm , [int]flag);

と、言う事で、BaseDocument::AnimateObject()を使用すると、

/*
今度は思ったように取得が可能
BaseDocument::AnimateObject()を使用
2009.7.21
*/


main(doc , op)
{
  var mnf = int(doc->GetMinTime()->GetFrame(doc->GetFps()));//アニメーションの最初のフレーム
  var mxf = int(doc->GetMaxTime()->GetFrame(doc->GetFps()));//アニメーションの最後のフレーム
  var tm = new(BaseTime);
  var c;

  for(c = mnf ; c <= mxf ; c++){
    tm->SetFrame(c , doc->GetFps());
    doc->AnimateObject(op , tm , ANIMATE_QUICK);
    println(c , " " , op->GetPosition());
  }
}

コンソールに表示される結果は、同じです。
AnimateObject()でタイムラインの時間を設定できるので、SetTime()は、削除しました。

AnimateDocument()とAnimateObject()のflagは、共通です。
他にも、いくつかありますが、今回は触れません。

これで、トラックやキーフレームにアクセスする事無く、アニメーションデータを取得できます。

|

« C4D レンダリング設定のアンチエイリアス設定を操作するスクリプト | トップページ | ポリゴンオブジェクトを1フレームごとにobj形式で保存 »