Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
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/

zum Seitenanfang zum Seitenende 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.
zum Seitenanfang zum Seitenende 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:
Quellcode:
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.
zum Seitenanfang zum Seitenende 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:
Quellcode:
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.

Quellcode:
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.
zum Seitenanfang zum Seitenende 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/

zum Seitenanfang zum Seitenende 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

zum Seitenanfang zum Seitenende Profil || Suche