« C4D Python R12 テスト:アニメーションでPythonを使うなら、c4d.BaseTimeの事も少しは理解しないといけないよね… | トップページ | C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-4 »

C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-3

今回はフラグの確認だけ…

  • 生成されたばかりか?
  • 存在しているか?
  • グループを移動したか?
  • 消滅したか?

この4個を確認する。

この4個のフラグの取得は…

TP_MasterSystem.IsBorn() #生成
TP_MasterSystem.Alive() #存在
TP_MasterSystem.EntersGroup() #グループ移動
TP_MasterSystem.IsDie() #消滅

で、できます。

ヌルオブジェクトにPythonタグを取り付けて…

Python_tp_51

グループ移動のフラグも確認するので、グループを1個作っておきます。
カラーの設定も忘れなく…

Python_tp_50

作らなくても、Pythonタグで設定しますけどね…

5フレームで1個パーティクルを放出し、10フレームのところでグループを移動します。
15フレームでパーティクルが消滅します。

Python
import c4d

doc_set = False

def InitDoc():
    #グループ操作:Allの他にグループを1つ追加。カラーも別に設定します。
    global doc_set
    root_gp = tp.GetRootGroup()
    under_gp = root_gp.GetDown()

    #タイムラインの最長時間を20fに
    if doc[c4d.DOCUMENT_MAXTIME] != c4d.BaseTime(20, 30):
        doc[c4d.DOCUMENT_MAXTIME] = c4d.BaseTime(20, 30)

    #UnderGroupの割り当てと挿入
    if not under_gp:
        under_gp = tp.AllocParticleGroup()
        under_gp.InsertUnder(root_gp)

    root_gp.SetColor(c4d.Vector(1.0, 0.0, 0.0))
    under_gp.SetColor(c4d.Vector(0.0, 1.0, 1.0))
    doc_set = True
    c4d.EventAdd()


def main():
    if not tp:return

    #シーンの設定します。
    global doc_set
    if not doc_set:InitDoc()

    #グループの取得
    root_gp = tp.GetRootGroup()
    under_gp = root_gp.GetDown()

    #時間設定
    start = c4d.BaseTime(5, 30) #パーティクル放出時間
    change = c4d.BaseTime(10, 30) #グループ移動時間
    end = c4d.BaseTime(15, 30) #パーティクル消滅時間

    tm = doc.GetTime() #タイムライン時間

    #パーティクルの放出
    if tm == start:
        pt_id = tp.AllocParticle() #パーティクル割り当て

        tp.SetLife(pt_id, end - start) #寿命
        tp.SetGroup(pt_id, under_gp) #UnderGroup所属

    #グループの移動:UnderGroup から AllGroup へ
    if tm == change:
        pts = under_gp.GetParticles()
        tp.SetGroup(pts[0], root_gp)


    #IsBorn、Alive、EntersGroup、IsDieの確認:コンソールへ表示
    root_pts = root_gp.GetParticles()
    under_pts = under_gp.GetParticles()

    if len(root_pts) != 0:
        fm = tm.GetFrame(doc.GetFps())
        bo = tp.IsBorn(root_pts[0])
        al = tp.Alive(root_pts[0])
        eg = tp.EntersGroup(root_pts[0])
        di = tp.IsDie(root_pts[0])
        print 'root', fm, 'Born:',bo, '  Alive:',al, '  EnterGroup:',eg, '  Die:',di

    if len(under_pts) != 0:
        fm = tm.GetFrame(doc.GetFps())
        bo = tp.IsBorn(under_pts[0])
        al = tp.Alive(under_pts[0])
        eg = tp.EntersGroup(under_pts[0])
        di = tp.IsDie(under_pts[0])
        print 'under', fm, 'Born:',bo, '  Alive:',al, '  EnterGroup:',eg, '  Die:',di
under 5 Born: True   Alive: True   EnterGroup: True   Die: False
under 6 Born: False   Alive: True   EnterGroup: False   Die: False
under 7 Born: False   Alive: True   EnterGroup: False   Die: False
under 8 Born: False   Alive: True   EnterGroup: False   Die: False
under 9 Born: False   Alive: True   EnterGroup: False   Die: False
root 10 Born: False   Alive: True   EnterGroup: True   Die: False
root 11 Born: False   Alive: True   EnterGroup: False   Die: False
root 12 Born: False   Alive: True   EnterGroup: False   Die: False
root 13 Born: False   Alive: True   EnterGroup: False   Die: False
root 14 Born: False   Alive: True   EnterGroup: False   Die: False
root 15 Born: False   Alive: False   EnterGroup: False   Die: True

こんな具合だ…
見ての通りだね…

frame 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
ビュー Python_tp_52 Python_tp_52 Python_tp_52 Python_tp_52 Python_tp_52 Python_tp_53 Python_tp_53 Python_tp_53 Python_tp_53 Python_tp_53 Python_tp_54 Python_tp_54 Python_tp_54 Python_tp_54 Python_tp_54 Python_tp_52 Python_tp_52 Python_tp_52 Python_tp_52 Python_tp_52
Group - - - - - Under Under Under Under Under Root Root Root Root Root Root - - - -
IsBorn - - - - - True False False False False False False False False False False - - - -
Alive - - - - - True True True True True True True True True True False - - - -
EnterGroup - - - - - True False False False False True False False False False False - - - -
IsDie - - - - - False False False False False False False False False False True - - - -

このようにして見ると…
Alive()は、きっちり表示されている間だけですね…
IsDie()は、本当に消滅して見えていないフレームがTrueなんだね。

前回、BaseTimeをちょっと学習したので…
調子に乗って、比較にそのまま使っていますが…
誤差があると問題になるから、やはりフレームを取得してから比較した方がいいかなぁ…
それともBaseTimeを量子化しておいて、BaseTimeのまま比較なのか…

|

« C4D Python R12 テスト:アニメーションでPythonを使うなら、c4d.BaseTimeの事も少しは理解しないといけないよね… | トップページ | C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-4 »

コメント

コメントを書く



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




« C4D Python R12 テスト:アニメーションでPythonを使うなら、c4d.BaseTimeの事も少しは理解しないといけないよね… | トップページ | C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-4 »