0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Cinema 4D] 時間トラックにキーをステップ状に作成するXPressoノード

Last updated at Posted at 2019-04-14

今回のCinema 4D Pythonエクササイズは「XPressoを使って時間トラックをXPressoから追加してキーを記録する」です.

時間トラックを追加するというノードは提供されていなかったので必要パラメータはXPressoのユーザデータから取り出して,Pythonノードで作成してみました.

処理内容をもう少し具体的に書くと,
任意のオブジェクトに指定したフレームから指定したフレーム間で時間トラックを作成し,
等間隔にステップ上にキーを記録するスプリプトです.

最低限必要なパラメータはユーザデータとしてXPressoタグに追加しておきます.

Add Time Track: 時間トラックを追加する
Object: 指定したオブジェクトに対して時間トラックを作成する
FPS: ドキュメントのFPSでも良いです
Start Frame: 最初のキーフレームの時間
End Frame: 最後のキーフレームの時間
Key Step: 指定した値ごとにキーを作成する
Value Step: キー毎に加算する時間トラックのパーセント

20190414-3.jpg

テストしたスクリプトは以下です.
今回のテストコードでは既存の時間トラックがある場合は,一旦削除してから新しく追加しなおしています.時間トラックは複数追加できるのですが,テスト用のため簡易的なものにしています.

import c4d
from c4d import gui

def AddTimeTrack(obj, doc):

    findTrack = obj.FindCTrack(c4d.DescID(c4d.DescLevel(c4d.CTtime)))
    if not findTrack:
        print "not find time trackx"
        tTrack   = c4d.CTrack(obj, c4d.DescID(c4d.DescLevel(c4d.CTtime)))
        obj.InsertTrackSorted(tTrack)
        newTrack = tTrack
    else:
        print "already exist time track"
        findTrack.Remove()
        c4d.EventAdd()
        tTrack   = c4d.CTrack(obj, c4d.DescID(c4d.DescLevel(c4d.CTtime)))
        obj.InsertTrackSorted(tTrack)
        newTrack = tTrack

    c4d.EventAdd()
    return newTrack

def main():
    print "AddTimeTrack Test"

    doc     = c4d.documents.GetActiveDocument()
    obj     = object_in
    fps     = fps_in
    frame   = start_in
    fend    = end_in
    fstep   = fstep_in
    stepVar = value_in
    setVar  = 0

    doc.StartUndo()

    tTrack = AddTimeTrack(obj, doc)
    curve  = tTrack.GetCurve()

    while frame < fend:

        fKey = c4d.CKey()
        tTrack.FillKey        ( doc  , obj, fKey )
        fKey.SetTime          ( curve, c4d.BaseTime(frame, fps) )
        fKey.SetInterpolation ( curve, c4d.CINTERPOLATION_STEP )
        fKey.SetValue         ( curve, setVar )
        curve.InsertKey       ( fKey )
        frame  += fstep
        setVar += stepVar

    doc.AddUndo(c4d.UNDOTYPE_NEW, tTrack)
    doc.EndUndo()
    obj.Message(c4d.MSG_UPDATE)
    c4d.EventAdd()

    return

スイッチでノードをオンオフを切り替える時は必要に応じて〈フレーム依存〉と〈フレーム0でリセット〉の二つのオンオフ設定に気を付けた方が良いと思います.また,このXPressoタグの次に動作する二つ目のXPressoタグで一つ前のスイッチをオフにします.

20190414-1.jpg

###結果:

立方体の45フレームでX方向に移動する元アニメーションに追加した時間トラックを適用したところです.
20190414-4.gif

###課題:

Add Time Trackをオンにした後,カーソルをタイムラインの上にもっていかないと更新が反映されないので,MessageとEventAddの用法に解決の糸口があるかもしれません.

AddUndo()が機能しない.XPressoのPythonノードから立方体を追加するというテストコードでもAddUndo()ができませんでした.スクリプトマネージャから単独のコードで実行するとUndo()できるのでXPressoで使う場合はできないか,別の処理が必要かもしれません.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?