今回のCinema 4D Pythonエクササイズは「XPressoを使って時間トラックをXPressoから追加してキーを記録する」です.
時間トラックを追加するというノードは提供されていなかったので必要パラメータはXPressoのユーザデータから取り出して,Pythonノードで作成してみました.
処理内容をもう少し具体的に書くと,
任意のオブジェクトに指定したフレームから指定したフレーム間で時間トラックを作成し,
等間隔にステップ上にキーを記録するスプリプトです.
最低限必要なパラメータはユーザデータとしてXPressoタグに追加しておきます.
Add Time Track: 時間トラックを追加する
Object: 指定したオブジェクトに対して時間トラックを作成する
FPS: ドキュメントのFPSでも良いです
Start Frame: 最初のキーフレームの時間
End Frame: 最後のキーフレームの時間
Key Step: 指定した値ごとにキーを作成する
Value Step: キー毎に加算する時間トラックのパーセント
テストしたスクリプトは以下です.
今回のテストコードでは既存の時間トラックがある場合は,一旦削除してから新しく追加しなおしています.時間トラックは複数追加できるのですが,テスト用のため簡易的なものにしています.
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タグで一つ前のスイッチをオフにします.
###結果:
立方体の45フレームでX方向に移動する元アニメーションに追加した時間トラックを適用したところです.
###課題:
Add Time Trackをオンにした後,カーソルをタイムラインの上にもっていかないと更新が反映されないので,MessageとEventAddの用法に解決の糸口があるかもしれません.
AddUndo()が機能しない.XPressoのPythonノードから立方体を追加するというテストコードでもAddUndo()ができませんでした.スクリプトマネージャから単独のコードで実行するとUndo()できるのでXPressoで使う場合はできないか,別の処理が必要かもしれません.