« C4D Python R12 テスト:オブジェクトからキーフレームにもアクセスしてみる。 | トップページ | C4D 法線を基準に歪んだポリゴンを手動で平面にするよ。 »

C4D Python R12 テスト:オブジェクトにアニメーショントラックを追加する。

C4D Pythonで、四苦八苦中のユーザの手がかり足がかりになると良いのですが…

何かにアニメーショントラックを取り付けるのに、

BaseList2D.InsertTrackSorted()

これを使えば良いのだ…
ただしBaseList2Dクラスを継承しているクラスのインスタンスに限るわけだ…

問題なのは、一体どのパラメータをキーフレーム補間するのか?という事だろう…
オブジェクトの位置?それとも角度?立方体の分割数?C4Dの殆どのパラメータをアニメートできるわけだけど…
取り付けるアニメーショントラックが、どのパラメータに対応させるのかを指定しなければ駄目なのだ…

と、偉そうに書いてみたけど、自分も最近知ったのだ…エへへェ…

オブジェクトの位置トラックは…

Python_ctrack_08

オブジェクトの下に、位置フォルダの様なアイコン…更に下に位置X/Y/Zと言う具合の階層だね…

もったいぶらずに、とっととコードを…

Python
'''
オブジェクトに位置トラックを追加する最小C4D.Pythonコード
2011.5.28
'''


import c4d

def main():
    if not isinstance(op, c4d.BaseObject):return

    #オブジェクトに「位置」トラックを設定
    #description IDの設定
    pos_x_id = c4d.DescID(
        c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0),
        c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0)
    )
    pos_y_id = c4d.DescID(
        c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0),
        c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)
    )
    pos_z_id = c4d.DescID(
        c4d.DescLevel(c4d.ID_BASEOBJECT_POSITION, c4d.DTYPE_VECTOR, 0),
        c4d.DescLevel(c4d.VECTOR_Z, c4d.DTYPE_REAL, 0)
    )
    #トラックの作成
    pos_x = c4d.CTrack(op, pos_x_id)
    pos_y = c4d.CTrack(op, pos_y_id)
    pos_z = c4d.CTrack(op, pos_z_id)
    #オブジェクトに「位置」トラックを挿入
    op.InsertTrackSorted(pos_x)
    op.InsertTrackSorted(pos_y)
    op.InsertTrackSorted(pos_z)


    #キーフレームの設定に試みる
    interval = 10.0/doc.GetFps() #10フレーム間隔
    curve = pos_x.GetCurve()
    for t in xrange(10):
        bt = c4d.BaseTime(t * interval)
        keys = curve.AddKey(bt)
        keys['key'].SetValue(curve, t % 2*100)


if __name__ == '__main__':
    main()
    c4d.EventAdd()

本当は、たまたま問題なく動いたと言うレベル…

適当なオブジェクトを選択してスクリプトを実行してみてください。

ここでは、立方体を選択して実行してみました。

Python_ctrack_09

この様に、無事にトラックを追加しキーフレームも設定できました。
ただね、勉強不足なので、キーフレームの追加の部分はベストなのかどうか…
キーフレームの自動接線の設定がわかりませんし…左と右の時間と値で調整するしかないのか?

c4d.DescLevel()で使用した定数、c4d.ID_BASEOBJECT_POSITIONとc4d.VECTOR_Xは…

Python_ctrack_10

こんな具合に取得したのだが…
他のパラメータでは上手く動作するのだろうか?

立方体のサイズを試してみよう。サイズと言ってもスケールじゃないよ。

Python_ctrack_11

c4d.PRIM_CUBE_LEN
c4d.VECTOR_X
が取得できた…早速試してみよう。

Python
'''
立方体オブジェクトにサイズトラックを追加する最小C4D.Pythonコード
2011.5.28
'''


import c4d

def main():
    if not op.CheckType(c4d.Ocube):return #立方体かチェックする

    #オブジェクトに「サイズ」トラックを設定
    #description IDの設定
    size_x_id = c4d.DescID(
        c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR, 0),
        c4d.DescLevel(c4d.VECTOR_X, c4d.DTYPE_REAL, 0)
    )
    size_y_id = c4d.DescID(
        c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR, 0),
        c4d.DescLevel(c4d.VECTOR_Y, c4d.DTYPE_REAL, 0)
    )
    size_z_id = c4d.DescID(
        c4d.DescLevel(c4d.PRIM_CUBE_LEN, c4d.DTYPE_VECTOR, 0),
        c4d.DescLevel(c4d.VECTOR_Z, c4d.DTYPE_REAL, 0)
    )
    #トラックの作成
    size_x = c4d.CTrack(op, size_x_id)
    size_y = c4d.CTrack(op, size_y_id)
    size_z = c4d.CTrack(op, size_z_id)
    #オブジェクトに「サイズ」トラックを挿入
    op.InsertTrackSorted(size_x)
    op.InsertTrackSorted(size_y)
    op.InsertTrackSorted(size_z)


    #キーフレームの設定に試みる
    interval = 10.0/doc.GetFps() #10フレーム間隔
    curve = size_x.GetCurve()
    for t in xrange(10):
        bt = c4d.BaseTime(t * interval)
        keys = curve.AddKey(bt)
        keys['key'].SetValue(curve, t % 2*100)


if __name__ == '__main__':
    main()
    c4d.EventAdd()

Python_ctrack_12

一応、動いたね…
他のパラメータはどうだろう…
興味のある人は試してみてください…

これで少しは、C4D Pythonでアニメーショントラックの作成の手がかりになっただろうか…

|

« C4D Python R12 テスト:オブジェクトからキーフレームにもアクセスしてみる。 | トップページ | C4D 法線を基準に歪んだポリゴンを手動で平面にするよ。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




« C4D Python R12 テスト:オブジェクトからキーフレームにもアクセスしてみる。 | トップページ | C4D 法線を基準に歪んだポリゴンを手動で平面にするよ。 »