« 更に久々… | トップページ | C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを考えてみる。 »

C4D Python R13 テスト:オブジェクトのアニメーショントラックを他の複数のオブジェクトへコピーしてみた。

あぁ、かなり久々のネタで…
どういう風に書いていたのか忘れちゃって…
忘れたついでに、C.O.F.F.E.E.もPythonも、かなり忘れて…
そう言えばなんだか、CoffeeScriptなるものがあるんだね。
全く、まぎらわしいなぁ…

で…

このブログのアニメーショントラックの記事にコメントが付いたので…
C4D Python R12 テスト:アニメーションのトラックにアクセスしてみる。
任意のオブジェクトのアニメーショントラックを複数のオブジェクトへコピーをC4D Pythonで試みた。

あくまでも「試み」なので実用的なスクリプトではないけれど…
でも実用的にするには、スクリプトではC4Dの構造的に無理ではないか?
Plugin形式なら可能だと思うけど…
そう言えば、まだC4D PythonでPluginを書いたことないなぁ…
そのうちに…

あぁ…コメント付いてからかなり時間がたってしまった。

さて、任意のオブジェクト(コピー元)のアニメーショントラックを別の複数のオブジェクト(コピー先)へ複写するには…

スクリプトベースで、どのようにコピー元のオブジェクトとコピー先のオブジェクトを特定させるのか?

c4d.documents.BaseDocumentクラス…
SearchObject()を使って名前で特定するか?
GetActiveObject()で選択されたオブジェクトで特定するのか?

どう考えてもコピー元とコピー先を特定するにはスクリプトでは無理なのか…

ダイアログを使うか…
属性マネージャを使うか…

コピペのように、コピー元オブジェクトを選択して「アニメーションをコピー」スクリプトを実行。次に複数のコピー先オブジェクトを選択して「アニメーションをペースト」スクリプトを実行。これが自然だと思うけど。スクリプト間でオブジェクトの受け渡しはできないよね…グローバル変数でも無理だし…

久々に書いているのでグダグダだ…

さて、今回は単純な試みだけにします。
任意のオブジェクトのアニメーショントラックを別の複数のオブジェクトへC4D Pythonで複写できるのか確かめます。

適当に幾つかのオブジェクトを追加し、その内の1つにキーフレームを設定します。
今回は、立方体1個にアニメーションを設定、幾つかの円錐にアニメーショントラックを複写します。円錐は適当にちりばめておきました。

Animationtrackcopy_01

ビューから一個、はみ出してた…

Animationtrackcopy_02_2

今回のスクリプトの手助けに「テスト作業用」ヌルオブジェクトを使います。
このヌルオブジェクトに2つのユーザデータを設定してコピー元オブジェクトとコピー先オブジェクトを設定しておきます。

Animationtrackcopy_03

コピー先には複数のオブジェクトが設定できるように「含む/除外」を使用しました。
「含む/除外」は、c4dモジュールのInExcludeDataクラスです。
InExcludeDataクラスから設定されているオブジェクトを取得するには、
ObjectFromIndex(doc, index)メソッドを使います。

ユーザデータ「含む/除外」からオブジェクトを取得するテスト
次のスクリプトは、オブジェクトの2番目に設定されているであろう「含む/除外」に設定されているオブジェクトを取得します。

Python

"""
ユーザデータ「含む/除外」からオブジェクトを取得するテスト
"""

import c4d


def main():
    dsts = op[c4d.ID_USERDATA,2] #2番目のユーザデータを取得
    if not isinstance(dsts, c4d.InExcludeData):return
   
    #「含む/除外」からオブジェクトを取得しコンソールに表示
    for c in xrange(dsts.GetObjectCount()):
        print c, " ", dsts.ObjectFromIndex(doc, c)

if __name__=='__main__':
    main()

この結果は、コンソールに表示されます。

0   <c4d.BaseObject object called '円錐/円錐' with ID 5162 at 0x0000000011674050>
1   <c4d.BaseObject object called '円錐.1/円錐' with ID 5162 at 0x0000000011674050>
2   <c4d.BaseObject object called '円錐.2/円錐' with ID 5162 at 0x0000000011674050>
3   <c4d.BaseObject object called '円錐.3/円錐' with ID 5162 at 0x0000000011674050>
4   <c4d.BaseObject object called '円錐.4/円錐' with ID 5162 at 0x0000000011674050>

それでは、「含む/除外」からオブジェクトが取得できた事が確認できたのでアニメーショントラックの複写を試して見ます。

コピー先オブジェクトには、まだトラックは設定されていません。

Animationtrackcopy_04

オブジェクトマネージャで「テスト作業用」ヌルオブジェクトを選択し、次のスクリプトを実行します。

Animationtrackcopy_05

Python

"""
任意のオブジェクトのアニメーショントラックを別の複数のオブジェクトへ複写
"""

import c4d


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

    #ユーザデータの取得
    src = op[c4d.ID_USERDATA,1]
    if not isinstance(src, c4d.BaseObject):return
    dsts = op[c4d.ID_USERDATA,2]
    if not isinstance(dsts, c4d.InExcludeData):return
   
    src_track = src.GetCTracks() #コピー元オブジェクトのアニメーショントラックを取得

    #コピー先オブジェクトにアニメーショントラックを複写
    for c in xrange(dsts.GetObjectCount()):
        dst = dsts.ObjectFromIndex(doc, c) #「含む/除外」からオブジェクトを取得

        #取得したアニメーショントラックを複製しコピー先オブジェクトに適用する
        for trc in src_track:
            clone_track = trc.GetClone()
            dst.InsertTrackSorted(clone_track)

    c4d.EventAdd(c4d.EVENT_ANIMATE)

if __name__=='__main__':
    main()

結果は問題なく「タイムライン」ウィンドウにはアニメーショントラックが複写されました。

Animationtrackcopy_06

上のスクリプトは、取得したアニメーショントラックを複製して新たなトラックを取得しそれを別のオブジェクトに取り付けています。

Animationtrackcopy_07

では、複製せずに取得したアニメーショントラックをそのまま適用するとどうなるのか?

Python

"""
任意のオブジェクトのアニメーショントラックを別のオブジェクトへそのまま適用すると
"""

import c4d


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

    #ユーザデータの取得
    src = op[c4d.ID_USERDATA,1]
    if not isinstance(src, c4d.BaseObject):return
    dsts = op[c4d.ID_USERDATA,2]
    if not isinstance(dsts, c4d.InExcludeData):return
   
    src_track = src.GetCTracks() #コピー元オブジェクトのアニメーショントラックを取得

    #コピー先オブジェクトにアニメーショントラックを複写
    for c in xrange(dsts.GetObjectCount()):
        dst = dsts.ObjectFromIndex(doc, c) #「含む/除外」からオブジェクトを取得

        #取得したアニメーショントラックをそのままオブジェクトに適用する
        for trc in src_track:
            dst.InsertTrackSorted(trc) #取得したトラックをそのまま適用

    c4d.EventAdd(c4d.EVENT_ANIMATE)

if __name__=='__main__':
    main()

取得したトラックをそのまま適用すると、複写されずに指定したオブジェクトへ付替え(移動)する事になるのだ。

Animationtrackcopy_08

このスクリプトだと、「立方体」に設定されていたトラックが、「円錐」、「円錐.1」と移動し…
最終的に最後に指定された「円錐.4」へ移動するという結果になります。

アニメーショントラックの複写はC4D Pythonでは可能だということだけど…
実用的なものにしようとすると、Plugin形式にしないとダメだろうか…?

|

« 更に久々… | トップページ | C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを考えてみる。 »

コメント

コメントを書く



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




« 更に久々… | トップページ | C4D Python R13 テスト:アニメーショントラックを他のオブジェクトへコピーするスクリプトを考えてみる。 »