000
08.11.2001, 20:08
Mazze
|
Hi! Ich programmier grad eine Particle Engine! Das läuft auch relativ gut, aber jetzt hab ich ein Problem. Um dies genauer zu schildern poste ich jetzt mal ein paar selbstgemalte Bilder, also nicht meckern =) Also das hab ich bis jetzt geschafft:
 Also ich hab ne Position wo das Particle erstellt wird. Dann hab ich noch einen Vector, der die Richtung angibt. In meinem Fall 0, 0, 10, d. h. nach oben! Das ist aber ziemlich scheisse wenn die ganzen Particles nur nach oben fliegen und darum hab ich gedacht es wär nicht schlecht wenn ich eine Gradzahl angeben könnte, die besagt wie weit das ganze Ausgebreitet wird! Etwa so:
 Nur ich weiß nicht so ganz wie ich das anstellen soll. Braucht man da etwa Sachen wie Sinus und Cosinus? War nur ein Gedanke, ich weiß nicht, da ich das noch gar nicht in der Schule gemacht hab! Kann mir jemand wenigstens einen Denkanstoß geben?
thx Matze
--
BattleTech-MOD: http://bthl.unitedgaming.net/
|
|
Profil || Suche
|
001
08.11.2001, 21:02
hausi
|
Ist schon in Velocity drin. Einfach dort mal die Werte ändern... [Edit] Falls du das unbedingt in Grad angeben willst, dann poste nochmal...
--
Dieser Beitrag wurde am 08.11.2001 um 21:03 von Superhausi bearbeitet.
|
|
Profil || Suche
|
002
09.11.2001, 14:00
Mazze
|
Wie das ist schon drin??? Ich hab ein Array von Particles, z.B. so Particles[100]; Diese will ich irgendwie zur angabe der velocity ausrichten, aber halt versetzt. Irgendsowas:
for(int i = 0; i <= 100; i++) Particles[ i ] = pParent->vecVelocity * (pParent->Angle * gEngfuncs.pfnRandomFloat(2, 5);
Das wird nicht funktionieren, aber dass du mal siehst wie ich mir das vorstelle!
--
BattleTech-MOD: http://bthl.unitedgaming.net/
Dieser Beitrag wurde am 09.11.2001 um 14:00 von Mazze bearbeitet.
|
|
Profil || Suche
|
003
09.11.2001, 18:02
Killing Me Softly
|
ok;
1. du hast Particles 2. jedes Particle hat eine Position (vecPosition) und eine Richtung/Geschwindigkeit in der es fliegt (vecVelocity)
Als erstes basteln wir uns eine Funktion, die uns einen Zufallsvektor liefert:
Vector RandomVector(void) { return Vector(gEngfuncs.pfnRandomFloat(-1.0, 1.0), gEngfuncs.pfnRandomFloat(-1.0, 1.0), gEngfuncs.pfnRandomFloat(-1.0, 1.0)).Normalize(); }
als nächstes (da wir gerade so schön am beasteln sind) kommt ne Funktion, die uns ein Particle erzeugt. Dieser Funktion übergeben wir die Position, die Richtung und einen Streuungsfaktor.
Particle *CreateParticle (Vector vPos, Vector vVel, float flSpread) { Particle *particle = new Particle; particle->vecPosition = vPos; particle->vecVelocity = vVel + RandomVector() * flSpread;
return particle; }
Das war's. Das Ganze arbeitet zwar nicht mit Gradangaben (aber wer will das schon, wenn er nicht unbedingt muss), aber erfüllt seinen Zweck.
--
Der Horizont vieler Menschen ist ein Kreis mit Radius Null - und das nennen sie ihren Standpunkt.
Dieser Beitrag wurde am 09.11.2001 um 18:03 von Killing Me Softly bearbeitet.
|
|
Profil || Suche
|
004
09.11.2001, 22:15
Mazze
|
OK. habs jetzt so ähnlich gemacht, wie du gesagt hast und es funktioniert! Vielleicht nicht ganz so elegant wie mit den Gradzahlen, aber es funktioniert....
Was hat es eigentlich mit dem Normalize auf sich?
--
BattleTech-MOD: http://bthl.unitedgaming.net/
|
|
Profil || Suche
|
005
09.11.2001, 23:17
Tron
|
@Mazze: normalize bringt einen vector auf die laenge 1 (einheitsvektor)
@Killing Me Softly: deine funktion RandomVector() hat 2 fehler: 1. normalize macht aerger wenn alle 3 zufallszahlen 0 sind (ist zwar selten, kommt aber vor) 2. die vektoren sind nicht regelmaesig auf einer kugel verteilt
besser waere: inline float Rand() { return gEngfuncs.pfnRandomFloat(-1.0, 1.0); }
Vector RandomVector() { Vector Vec; do { Vec = Vector(Rand(), Rand(), Rand()); } while ((!Vec.Length()) || (Vec.Length > 1.0f)); return Vec.Normalize(); }
das braucht im schnitt 1.90986 schleifendurchlaeufe, bis ein vektor gefunden wurde.
--
'KEINE PANIK' - aus der Triologie in fuenf Baenden von Douglas Adams
'FÜR DEINN FERD' - aus 'Gevatter Tod' von Terry Pratchett
|
|
Profil || Suche
|