« C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-3 | トップページ | もう… C4D R13なのね… »

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

むむむ…
やっぱり、FreeParticle()やFreeAllParticles()が必要か?

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

Python_tp_55

コードは以下の通りに…

Python
import c4d
from random import random

def main():
    tm = doc.GetTime()

    if tm == c4d.BaseTime(0.0):
        ptcl = tp.AllocParticles(10)
        for id in ptcl:
            tp.SetLife(id, c4d.BaseTime(10))
            tp.SetPosition(id, c4d.Vector((random()-0.5)*100, (random()-0.5)*100, 0.0))
            tp.SetVelocity(id, c4d.Vector(0.0, 0.0, 100.0))

randomモジュールをまだ細かく見ていないので、まだメソッドを理解していない…

タイムラインの0フレームで、TPパーティクルを10個アロケートして、有効期間、位置、速度を設定。

タイムラインが0フレームに戻るたび、ThinkingParticlesもリセットされるようだから、パーティクルの開放、FreeAllParticles()やFreeParticle()メソッドは必要ないのでは?

と思いましたが…

丁度、パーティクルをアロケートするフレームで停止している状態で、イベントが発生すると、パーティクルがどんどんアロケートしてしまう。

Python_tp_57

0フレームで停止中は全てのパーティクルを開放してアロケートしなおすか?
アニメーション開始の0フレームだけでパーティクルをアロケートしているから許されるけど…

Python
import c4d
from random import random

def main():
    tm = doc.GetTime()

    if tm == c4d.BaseTime(0.0):

        tp.FreeAllParticles() #パーティクルの開放

        ptcl = tp.AllocParticles(10)
        for id in ptcl:
            tp.SetLife(id, c4d.BaseTime(10))
            tp.SetPosition(id, c4d.Vector((random()-0.5)*100, (random()-0.5)*100, 0.0))
            tp.SetVelocity(id, c4d.Vector(0.0, 0.0, 100.0))

これで、確かに意図しないパーティクルのアロケートはしませんが…

乱数が、毎度違う数値が割り当てられてしまいます。

Python_tp_58

random()メソッド0.0~1.0の乱数発生を使っていますが、uniform()メソッド任意の範囲の乱数発生があるみたいだね…

再生を繰り返すたびに、0フレームのパーティクルの位置が変化してしまうのは、randomモジュールのseed()メソッドを使用していないからだね。

Python
import c4d
from random import uniform
from random import seed

def main():
    tm = doc.GetTime()

    if tm == c4d.BaseTime(0.0):
        tp.FreeAllParticles()
        ptcl = tp.AllocParticles(10)
        for id in ptcl:

            seed(id) #ランダムシード

            tp.SetLife(id, c4d.BaseTime(10))
            tp.SetPosition(id, c4d.Vector(uniform(-50.0, 50.0), uniform(-50.0, 50.0), 0.0))
            tp.SetVelocity(id, c4d.Vector(0.0, 0.0, 100.0))

ランダムシードにパーティクルIDを使用しました。
多分この値も、TP_MasterSystem.SetRandomSeed()で設定しておいた方が良いね…
これも、完璧ではないけどね…

|

« C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-3 | トップページ | もう… C4D R13なのね… »

コメント

コメントを書く



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




« C4D Python R12 テスト:C4D ThinkingParticlesとC4D Pythonと試行錯誤-3 | トップページ | もう… C4D R13なのね… »