Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
11.05.2001, 12:33
Prophyle



Mir gehts jetzt darum, was dies überhaupt ist.
Ich kann mir zunächst mal ein System vorstellen, das aus lauter einzelnen Teilchen besteht. Alle haben wohl eine eigene Masse, Reibungskoeffizienten, Größe. Sie erfahren während der Berechnung irgendwelche Kräfte, das heißt: Wind, Gravitation. So ein System, stelle ich mir vor, besteht aus ca. 200-500 einzelnen Teilchen. Ließe man diese einzeln berechnen, ist das wahrscheinlich sehr zeitintensiv. Ich glaube deshalb, dass man für dieses System einen gewissen Raum angibt, z.B. einen kugel- oder quaderförmigen, und dann in diesem eine gewisse Anzahl an Partikeln darstellt. Der Raum wird je nach Krafteinwirkung in Größe und Form verändert, bzw. bewegt sich entsprechend.
Liege ich hier richtig, oder ist ein particle-system was ganz anderes?

--

Prophyle, Coder beim SGT: http://mod.famkos.de.
Delphi, C++, Qt

zum Seitenanfang zum Seitenende Profil || Suche
001
11.05.2001, 13:36
blair



Also für SGT kannst du dir das sparen, da arbeite ich schon dran.
Am effizientesten (IMHO) ist es das ganze mit der Tri Api und Triangle Strips zu machen.
Ich hab mal nen partikel system unter ogl geschrieben (mit besagten TS) und das ganze ungefähr so gemacht *in source kram*:

(Das ganze ist eine Class, also ein partikel system)
Eine struct mit den eigenschaften die EIN Partikel haben soll. Dann ein Array mit der range MaxParticles (Nen Define). Jedes Field des Array ist ein Partikel. In der Think funktion wird dann für JEDES partikel die veränderungen berechnet. Dann hab ich in der draw funktion das teil ausgeben lassen.

So hab ichs gemacht, das ist aber wohl nur eine von mehreren möglichkeiten.

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
002
11.05.2001, 15:35
Prophyle



Hm. Wieviele Teilchen sind da drin? Mich interessiert es der Geschwindigkeit wegen, in der das System dann dargestellt wird. Schon allein für jeden einzelnen Körper braucht man ja erstmal den Speicherplatz, in Halflife ist das ein CBaseEntity mit doch recht vielen Variabeln und Funktionen, die gespeichert und berechnet werden möchten.
Ich denke auch dass in diesem Zusammenhang die grafische Darstellung gar nicht so wichtig ist: Es reicht eigentlich ein einziges dreieck pro Partikel, das eine gewisse Farbe hat, und sich immer zum Beobachter hin dreht. Kommt aber auf die Feinheit des Systems drauf an; für Wassertropfen oder Sandstaub, denke ich, reichen die winzigen Dreiecke.

Von der Raum-Berechnungs-Vorstellung ausgehend: Die simpelste Form hier ist eine Pyramide mit vier Seiten. Sie hat vier Ecken. Ich lasse nun nur diese vier Ecken als Körper berechnen. Allerdings kann sich so ein System nicht beliebig verformen; die Verbindungslinien der Ecken müssen berücksichtig werden. Sie können sich nicht sofort beliebig ausdehnen, sondern reagieren wohl ungefähr wie Gummi, oder eine physikalische Feder. Dadurch entsteht dann also ein schwingungsfähiges System; hierfür existieren Dokumentationen, wie diese Schingungen zu berechnen seien. Die Partikel selbst sind konstant, und bleiben gleichmäßig über den Körper verteilt.
Erweitert man die Vorstellung von der Pyramide auf eine Kugel, könnte man sehr viel schöner erscheinende Gebilde erreichen. Generell gilt dann: Je mehr Ecken, desto schöner, aber langsamer.

--

Prophyle, Coder beim SGT: http://mod.famkos.de.
Delphi, C++, Qt

zum Seitenanfang zum Seitenende Profil || Suche
003
11.05.2001, 19:10
blair



Also ich hab das ganze mit 500 Partikeln laufen lassen und das ging ohne probleme! Das ist einer der vorteile der Triangle Strips, du kannst recht viele relativ schnell berechnen lassen.
Nur zur erklärung: Ein partikel ist ein Sprite (um genau zu sein ein polygon mit nem sprite als textur).
Und außerdem ist das so gedacht, das du einen punkt angibst, sowie die eigenschaften des Partikel Systems (Life, Color, Speed, menge der partikel etc) dann macht der rest der code, das wäre also in HL Dimensionen ne Point und keine Brush Entity

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
004
11.05.2001, 19:43
TheTinySteini



Dafür haste glaub ich nen Overflow an Tempentities...

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
005
11.05.2001, 20:26
blair



hmm, wiegesagt: mein system ist bisher ein ogl system

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
006
11.05.2001, 21:02
TheTinySteini



Also, mit dem HL-eigenen Partikelsystem hab ich auf die Schnelle dies hier hingekriegt:

Stark verbesserungswürdig, aber ich krieg die Punkte nicht heller... aber für ein bisschen Schneeatmosphäre tut's schon.

[edit]Ich hab das grad mal in nem dunklen Level getestet, da sieht das richtig geil aus - in Crossfire wirkt der Schnee halt ziemlich deplatziert. Allerdings kann ich von der dunklen Map keinen Screen posten, weil's ne geheime Poke646 Map is :-( [/edit]

[edit 2]Endlich hab ich ne dunkle Stelle im Original-HL gefunden...[/edit 2]

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
007
11.05.2001, 23:47
blair



nett! Und weil ich so weil Prophyle und ich die Idee hatten, postet du uns mal den code... thx *g*

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
008
12.05.2001, 00:18
Prophyle



He leute!
Ich bin mir sicher dass hier ein paar oberchecker(ala prefect oder kriz) rumlaufen, was denkt ihr?
Mich interessiert es ob es sowas schon gibt.

--

Prophyle, Coder beim SGT: http://mod.famkos.de.
Delphi, C++, Qt

zum Seitenanfang zum Seitenende Profil || Suche
009
12.05.2001, 11:55
TheTinySteini



Ok, I'm gonna tell you ;-)

In der entity.cpp gibt's ne Funktion ParticleCallback(), und dadrunter ne Funktion Particles(). Die sind beide auskommentiert - aktiviert sie wieder und schreibt sie so um:
Quellcode:
void ParticleCallback( struct particle_s *particle, float frametime )
{
particle->org.x -= gEngfuncs.pfnRandomFloat( -10.0, 10.0 ) * frametime;
particle->org.y -= gEngfuncs.pfnRandomFloat( -10.0, 10.0 ) * frametime;
particle->org.z += particle->vel.z * frametime;
}

void Particles( void )
{
static float lasttime;
float curtime;

curtime = gEngfuncs.GetClientTime();

if ( ( curtime - lasttime ) < 0.1 )
return;

lasttime = curtime;

// Create a few particles
particle_t *p;
int i;

for ( i = 0; i < 75; i++ )
{
int r, g, b;
p = gEngfuncs.pEfxAPI->R_AllocParticle( ParticleCallback );
if ( !p )
break;

p->org.x = v_origin.x + gEngfuncs.pfnRandomFloat( -300.0, 300.0 );
p->org.y = v_origin.y + gEngfuncs.pfnRandomFloat( -300.0, 300.0 );
p->org.z = v_origin.z + gEngfuncs.pfnRandomFloat( 100.0, 150.0 );
p->vel.z = gEngfuncs.pfnRandomFloat( -125.0, -90.0 );

r = 255;
g = 255;
b = 255;

p->color = gEngfuncs.pEfxAPI->R_LookupColor( r, g, b );
gEngfuncs.pEfxAPI->R_GetPackedColor( &p->packedColor, p->color );

// p->die is set to current time so all you have to do is add an additional time to it
p->die += 2.5;
}
}

Dann etwas weiter unten in der HUD_CreateEntities() ist die Zeile "Particles();" auskommentiert, die aktiviert ihr auch wieder. Und das war's dann auch schon. Easy, huh? Am besten wirkt es wie gesagt in ner dunklen Map...
Der Code braucht natürlich noch viel Optimierung, und vor allem sollte er an die Player-Prediction angekoppelt werden. Denn zur Zeit erstellt er nur ein 300*300 Units großes Schneefeld um den Spieler herum (seltsamerweise reicht das, um den Eindruck vorzutäuschen, dass es überall schneit), wenn man sich nun aber schnell bewegt, dann kommt zwar das Schneefeld schnell genug hinter einem her (alle 0.1 Sekunden wird ein neues erstellt), aber da ja die Flocken noch runterfallen müssen, kommt man fast an die Grenzen des Feldes und somit ist der Effekt getrübt. Probleme gibt's auch noch dann, wenn der Spieler irgendwo runterfällt oder ähnlich. Achja, und es schneit auch in Gebäuden ;-) Man müsste das Ding also an ein Entity koppeln.

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
010
12.05.2001, 12:00
blair



cool! thx

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
011
12.05.2001, 12:13
TheTinySteini



Wer damit guten Schnee hinkriegt, kann ja mal ein Tut für DHCC schreiben *fg*

Btw: Der Vorteil dieser Particles ist, dass man ziemlich viele darstellen kann, ohne dass die Geschwindigkeit groß beeinflusst wird. Mein Schnee zum Beispiel berechnet 1875 Schneeflocken gleichzeitig ;-) Ich glaub das Maximum ist 2000, sonst gibt's nen Fehler von wegen "Not enough free particles".

--

TheTinySteini
Coder Poke646
"Don't Panic" - Hitchhiker's Guide to the Galaxy

zum Seitenanfang zum Seitenende Profil || Suche
012
12.05.2001, 14:01
blair



ich sag doch, man kann viele damit darstellen!

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
013
12.05.2001, 14:18
Creeper



Kennt jemand tuts für Partikel System in HL ??

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
014
12.05.2001, 14:20
blair



Gibts nicht.
Wenn ichs soweit habe, das es funzt kann ich mal eins schreiben.

Übrigens: Man dürfte auch ziemlich coole Fire Effects mit nem Partikelsystem hinkriegen.

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
015
12.05.2001, 14:58
DarKnight



Hmmm. Also ich würde mal sagen, dass Blairs OGL System schon geht. Aber für jedes Partikel eine ganze Struktur (so hab ichs verstanden) zu beanspruchen ist schon wirklich sehr speicherfressend. Allerdings glaube ich auch, dass das heute wirklich nichtmehr viel macht. Man kann sich ja mal die ganzen OPartikeleffekte in Black and White anschaun. Das ist unglaublich was da son an manchen stellen auf den Screen kommt. Und ich sehe dabei keine grossen Einbrüche der Performance.

Ich hätte aber dennoch einen Verbesserungsvorschlag. Man teilt verschiedene Partikel, sagen wir mal immer 10, in eine Struktur ein. Nur die Struktur wird in der Position verändert. In einer Draw Routine werden alle Strukturen durchgegangen und für jede Struktur einfach mehrere Partikel gezeichnet. Dabei beschränkt sich der Speicherverbrauch nur auf den Grafikspeicher. Variablen für jedes einzelne Partikel werden nicht berechnet. Wenn man das jetzt noch alles geschickt anordnet wird man einen guten Effekt hinbekommen obwohl sich die Partikel in Gruppen bewegen (Schnee, Regen und so weiter).

Ich habe dieses System schon in 2D ausprobiert und ich schaffe damit halt die zwanzigfache Menge an Partikeln (ist ja klar, oder) =)

Naja vielleicht hat euch das ja weitergeholfen.

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche
016
12.05.2001, 16:56
Another1



ok, ich würds so machen:

nen particle "organizer"

CParticleEngine oder so mit dieser
struct { Vector origin, Vector velocity, ... } particle_t m_pParticles[256]; // oder mit linked list, wie auch immer
als member variable in CParticleEngine

und dann einfach inner Think function die particles bewegen (in dem Beispiel: origin = origin + velocity*timeFraction; das is alles =P ) und in HUD_DrawTriangles oder so CParticleEngine::Draw(...) aufrufen, welche dann das array (oder die linked list; hier sicher von Vorteil wegen tod/spawn von neuen Partikeln) durch geht
Quellcode:
CParticleEngine::Draw(...)
{
[...]
while(pParticle)
{
    if(pParticle->isActive)
       DrawParticle(pParticle);
    pParticle++;
};
[...]
}

CParticleEngine::Draw(particle_t *pParticle);
is dann der Kern vom Ganzen: Hier kann man ja jetzt für jedes particle_t das malen, was man will (ewtl auch 10 partikel pro Draw aufruf)

ich würde irgendwie davon abraten, das Half-Life interne partikel system zu benutzen, da man ja mit der Triangle API alles eigentlich viel besser machen kann, und auch nicht auf 2000 partikel (oder was auch immer das Maximum ist) beschränkt ist!

das könnte man dann bequem erweitern (CParticleEngine::AddParticle(particle_t* pParticle) u.ä)

--

Another1

...relaxing..atm =)
... und Schweiz suckt!

zum Seitenanfang zum Seitenende Profil || Suche
017
12.05.2001, 17:17
Prophyle



Interessant, was da alles so an den Tag kommt :-)
Aber so wie ich es mir gedacht hab, da kommt anscheinend keiner drauf... Ist auch schwierig, denk ich - und man muss sich wohl länger mal mit Mechanik beschäftigt haben(nicht auto, sondern Physik;).
Ich lass mir das mal durch den Kopf geben, und präsentier euch dann das ergebnis.

--

Prophyle, Coder beim SGT: http://mod.famkos.de.
Delphi, C++, Qt

zum Seitenanfang zum Seitenende Profil || Suche
018
12.05.2001, 17:34
blair



Ich sags doch, die Triangle Strips der TriApi, damit müsste es gehen. Eventuel kann ich sogar einen Teil meines Codes übernehmen.

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche
019
13.05.2001, 00:06
Creeper



Ach, ja warum dass so dunkel ist, also entweder beim Umwandeln von int nach short oder weil das von der HL-Engine noch angepasst wird, z.b in der Helligkeit!

--

Head Coder:Sudden-Impact

Listen to CKY you fuCKYrs http://www.ckymusic.com

zum Seitenanfang zum Seitenende Profil || Suche
020
13.05.2001, 13:28
DarKnight



Wens interessiert: Ich bastele grade noch ane inem universellen System, in dem auch die oben besagte Technik zum Zuge kommt. Ich wurde ausserdem noch ein paar nette Effekte einbauen. Wenn euch besondere Effekte einfallen könnt ihr sie ja mal beschreiben. Für Physikalische Formeln wäre ich auch sehr dankbar, denn damit lässt sich ja bekanntlich nochmahr machen! =)

PS: Das System ist vorerst für 2D geplant. ALlerdings kann man ja 3D später noch hinzufügen.

--

void CHudSayText :: EnsureTextFitsInOneLineAndWrapIfHaveTo( int line ) -- Aja?

zum Seitenanfang zum Seitenende Profil || Suche
021
13.05.2001, 17:23
Prophyle



Anliegendes E-Feld, B-Feld;
Gravitation;
Reibung nach dem Stokeschen Gesetz;
Wind;
Allgemeine Form des Impulserhaltungssatzes;

aber keine Bange, das wird meine Facharbeit, es ist also zu schaffen ;)

--

Prophyle, Coder beim SGT: http://mod.famkos.de.
Delphi, C++, Qt

zum Seitenanfang zum Seitenende Profil || Suche
022
13.05.2001, 18:57
blair



OMG Prophyle, du könntest auch einfach die Nächstbeste UT Version im Unrealed öffnen, und die Physik der FireEngine klauen!

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs

zum Seitenanfang zum Seitenende Profil || Suche