PY4D Code "am leben" halten

trustieee

Mitglied
Hey ihr Codinggurus.

Ein ganz einfaches Ding (wie fast immer beim Coden =))

Ich möchte einen Partikel rumschwirren lassen, abhängig von einem Zufallswert soll er nach oben unten , halbrechts etc.. gehen.

Funktioniert ja auch soweit aber es läuft nur die Initialisierung. Dann passiert rein gar nichts mehr.

Code:
import c4d
import random

stepSize = 5
tp.AllocParticles(40)


v_vector = c4d.Vector()

v_vector.x = float(0)
v_vector.y = float(0)
v_vector.z = float(0) 

i=0

def haupt(i,v_vector):
    while i<1000 :
		direction = random.randrange (0,8,1)
		zufallsrichtung (direction)
		
		i += 1
		print direction
    return direction


def zufallsrichtung (direction):

	if direction == 0:  # Norden
		v_vector.y += stepSize  

	elif direction == 1: # Nordost
		v_vector.x += stepSize
		v_vector.y += stepSize
	 
	elif direction == 2: # Ost
		v_vector.x += stepSize

	elif direction == 3: # Südost
		v_vector.x += stepSize
		v_vector.y -= stepSize

	elif direction == 4: # Süd
		  v_vector.y += stepSize

	elif direction == 5: # Südwest
		v_vector.x -= stepSize
		v_vector.y -= stepSize

	elif direction == 6: # West
		  v_vector.x -= stepSize;

	elif direction == 7: # Nordwest
		  v_vector.x -= stepSize;
		  v_vector.y += stepSize;

	return v_vector.x, v_vector.y
	tp.SetPosition(0, v_vector)


def main():
    pass

haupt(i,v_vector)

Könnt ihr mir verraten wie ich das Python Skript verändern muss dass es nicht nur initialisiert, sondern Frame für Frame weitermacht ?
 
Ein *Skript* wird nur einmal ausgeführt, ergo: nein du kannst ihn nicht "offen lassen".
Ein Tag Beispielsweise wird bei jeder Neuzeichnung vom Editor aufgerufen.

Wo du doch in Python codest, warum nicht gleich den PythonGenerator benutzen ? ;)

lg nux

PS: Ich code zwar in Coffee, aber ich weiss genau dass es da was einfacheres gibt als das: :D
Code:
v_vector = c4d.Vector()
 
v_vector.x = float(0)
v_vector.y = float(0)
v_vector.z = float(0)
 
lg nux

PS: Ich code zwar in Coffee, aber ich weiss genau dass es da was einfacheres gibt als das: :D
Code:
v_vector = c4d.Vector()
 
v_vector.x = float(0)
v_vector.y = float(0)
v_vector.z = float(0)

Bin halt ein Coding **** =), sonst würde ich doch nicht so blöde fragen stellen.

Also der Code da oben liegt auf einem Python Tag auf einem Nullobjekt, trotzdem passiert das nur beim ersten Frame.

Also es gibt schöne Beispiele auf der smartpage.

Zum Beispiel Boids:
http://www.smart-page.net/blog/2010/04/10/py4d-examples-particle-party/

Da schwimmen die einmal emittierten Partikel auch frei im Wasser herum...
aber ich kapier nicht warum
 
Ich schätze das liegt daran dass du deine main "pass"t. Warum machst du das ? :'D
Es wird auschließlich die main-Funktion aufgerufen bei der Neuzeichnung von c4d. ;)
 
Brillant :), sehr , sehr nützliche Info

Ja das sind die Kleinigkeiten über die man am Anfang immer stolpert und sich fragt warum geht diese g*ttv%rdamm$! *"$§&* jetzt nicht ...

Code:
import c4d
import random
 
stepSize = 200
random.seed(1)
frame = doc.GetTime().GetFrame(doc.GetFps())
 
 
 
 
v_vector = c4d.Vector()
 
v_vector.x = float(0)
v_vector.y = float(0)
v_vector.z = float(0) 
 
i=0
frame = None 
def haupt(i,v_vector):
 
    tp.FreeAllParticles()
    tp.AllocParticles(10)
    direction = random.randrange (0,8,1)
    while i < 10: 
        zufallsrichtung (direction,i)
        print "Vektor davor: ", v_vector
        tp.SetPosition(i, v_vector)
        print "Vektor danach: ", v_vector
        i+= 1
    print direction
    return direction
 
 
def zufallsrichtung (direction,i):
 
    if direction == 0:  # Norden
        v_vector.y += stepSize  
 
    elif direction == 1: # Nordost
        v_vector.x += stepSize
        v_vector.y += stepSize
     
    elif direction == 2: # Ost
        v_vector.x += stepSize
 
    elif direction == 3: # Südost
        v_vector.x += stepSize
        v_vector.y -= stepSize
 
    elif direction == 4: # Süd
          v_vector.y += stepSize
 
    elif direction == 5: # Südwest
        v_vector.x -= stepSize
        v_vector.y -= stepSize
 
    elif direction == 6: # West
          v_vector.x -= stepSize;
 
    elif direction == 7: # Nordwest
          v_vector.x -= stepSize;
          v_vector.y += stepSize;

    return v_vector 

   
 
 
def main():
    haupt(i,v_vector)

Stromberg würde sagen: läuft !

Nächste Frage (das hört nie auf): Alle Partikel laufen gleich , ist ja quatsch, wie kann man jedem Partikel ein eigenes Random geben ?
Muss ich da für jeden eine extra Partikelgruppe anlegen ?
 
Zuletzt bearbeitet:
Ah sehr schön. :)

Nein brauchst du nicht. Aber jeder Partikel hat einen eigenen Index. Durch einen guten Algorythmus bekommt man gute zufällige Werte für jeden Partikel. Ich habe schon öfters solche Algorythmen finden müssen, das ist leider garnicht so leicht. Aber ungefähr so könnte einer aussehen, leider nur in COFFEE. Dürfte aber leicht übertragbar sein. ;)

Code:
rnd = new(Random);
rnd->Init(2390135);
rnd = rnd->Get01();
rnd_val = Modulo(rnd*i*986141*Modulo((i+1),21.233)+rnd*pow(i+1,2)*i, maxvalue)

Werde mir demnächst auch Python ansehen, damit kann man einfach mehr machen. Auch wenn ich den Syntax hasse >_>

//edit:
Jetzt hab ich mal ne Frage:
Woher kommt die Variable tp ?
Und das Thinking Particles Modul hast du doch auch nicht importiert.
Habe gerade angefangen Python zu lernen ^^
 
Zuletzt bearbeitet:
Okay vielen Dank God of Coding,

ich werde mich da mal versuchen durchzuwursteln (nach einem starken Kaffee)


Jetzt hab ich mal ne Frage:
Woher kommt die Variable tp ?
Und das Thinking Particles Modul hast du doch auch nicht importiert.
Habe gerade angefangen Python zu lernen ^^

Tolle Sache, und ja du läufst den richtigen Pfad des Lichts =)
Kenne zwar Coffee nicht, aber für Codingeinsteiger finde ich es spitze und einfach, gerade wegen der minimalen Syntax.

Und zu deiner Frage: ich versteh es auch nicht, und eine Coderin die ich gefragt habe ebenso nicht.
Wahrscheinlich ist das eine unkommentierte Geheimfunktion.

Falls du es in einen Py4D Generator packst funktioniert es auch nicht ...

Aber mit
from modules import thinkingparticles
und dann alles ausschreiben kommst du auch zum Ziel ...

Ich habe es auch nur aus einem Beispiel von der Smartpage.
Kannst du dir ja mal anschauen ist echt klasse.
 
Mach dat' ;-)

Hm komisch. Eben, im Tag funktioniert das gut, aber im Generator nicht. Und mit import tp hab ichs auch nicht hinbekommen :(

Code:
import c4d
from c4d import modules
from modules import thinkingparticles
?

Wie verwende ich dann tp ? Muss ich soaeter mal ausprobieren
Eigentlich muesste es ja jedesmal so heissen:
Code:
thinkingparticles.AllocParticles(100)


Danke fuer die Info, ich konnte im Netz rein garnichts dazu finden. ;)
 
Hmm

Code:
import c4d
from c4d import modules
from modules import thinkingparticles

funktioniert zwar, aber ich weiss nicht wie ich es weiter verwenden kann. In der Doc steht auch nichts dazu. :-/
 
Code:
import c4d
from c4d.modules import thinkingparticles 

partikelsystem = doc.GetParticleSystem()

partikelsystem.AllocParticles(1)


print partikelsystem.IsBorn(0)
vector = c4d.Vector()
vector.x = 40
vector.y = 80
vector.z = 50

partikelsystem.SetPosition(0,vector)

Bitteschön, hab selber lange gesucht =)

Der allesentscheidende Satz in der Doku lautet:
The master system is the main TP engine class. There can only be one master system per document. You can get it with BaseDocument.GetParticleSystem.

Wenn du Lust hast können wir ja unser gefährliches Halbwissen zusammen packen und experimentieren und voneinander lernen (gut zugegeben ich wohl mehr von dir als andersrum) :D
 
Zurück