Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

20.08.2010, 18:53

Partikel - Start, Endfarbe

Hi Leute,

ich habe ein Problem mit meinen Partikeln. Ich will den einzelnen Partikeln ein Start- und Endfarbe zuweisen,
aber das problem ist, dass meine Farbklasse BYTE (0 - 255) als Datentyp für die Farbkomponenten nutzt.
Also wenn ich bei jedem Update das hier mache.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void Init()
{
    //Init zeug
    //
    DeltaColor = static_cast<BYTE>((EndColor - StartColor) / Lifetime); //Lifetime in Sekunden (z.B. 0.4f)
}

void Update(float elapsed)
{
    Color += DeltaColor * elapsed;
}


Da rundet der "DeltaColor" immer auf, was dazu führt, dass die Partikel ihre Endfarbe schon vor ihrem Ende erreichen :(
Habe dieses Problem nun schon seit längerer Zeit, aber ich will die Farbklasse nicht auch "float" umschreiben.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

20.08.2010, 18:58

Typische Probleme inkrementeller Methoden. Aber generell sollte "DeltaColor" abgerundet, nicht aufgerundet sein. Wie kommt's, dass es aufgerundet ist?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

20.08.2010, 19:00

Ja stimmt wird wohl abgerundet, aber trotzdem klappt es nicht -_-
Sollten die Partikel denn dann aber gar nicht erst die Endfarbe erreichen?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

20.08.2010, 19:01

Richtig, sie sollten nie die Endfarbe erreichen, außer Du hast irgendwo noch 'nen anderen Bug und updatest weit über ihre Lifetime hinaus.
Edit: Oder "Color" wird nicht mit "StartColor" initialisiert.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

20.08.2010, 19:03

Ja du hast recht, da war noch ein Bug.
Aber wie geht es denn anders als die inkrmentelle Methode?

6

20.08.2010, 19:07

Wenn du eine Steigung von 0.7 pro Schritt hast bringt es dir das auch nichts das bei jedem Update auf z.B. 234 draufzuzaehlen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

20.08.2010, 19:11

Statt immer mit der Differenz-Zeit zum vorherigen Update zu arbeiten schlage ich immer wieder vor mit absoluten Zeit-Angaben zu arbeiten. Das hat folgenden numerischen Hintergrund:

1) Inkrementell: X += Y * FrameDeltaTime <-- minimale Fehler addieren sich immer mehr auf, je mehr Updates man macht, sofern FrameDeltaTime die Differenz der Zeit zwischen dem vorherigen und dem aktuellen Update ist.

Beipiel:
- Update 1 -> Delta = 0.1 ... Fehler = ~0.05
- Update 2 -> Delta = 0.1 ... Fehler = ~0.05+0.05 = ~0.1
- Update 3 -> Delta = 0.1 ... Fehler = ~0.10+0.05 = ~0.15
- Update 4 -> Delta = 0.1 ... Fehler = ~0.15+0.05 = ~0.2
- Update 5 -> Delta = 0.1 ... Fehler = ~0.20+0.05 = ~0.25

2) Absolut: X = Y * (StartTime - CurrentTime) <-- ein auftretender Fehler ist einmalig und ist beim nächsten Update nicht mehr relevant. StartTime ist hierbei die StartZeit des Effekts (das heißt zum Beispiel die Spawntime des Partikels). CurrentTime ist der Zeitpunkt des Updates.

Beispiel:
- Update 1 -> Differenz = 0.1 ... Fehler = ~0.05
- Update 2 -> Differenz = 0.2 ... Fehler = ~0.05
- Update 3 -> Differenz = 0.3 ... Fehler = ~0.05
- Update 4 -> Differenz = 0.4 ... Fehler = ~0.05
- Update 5 -> Differenz = 0.5 ... Fehler = ~0.05

Der Unterschied ist marginal, die Wirkung von 2) sehr groß, da numerisch stabil, ganz im Gegensatz zu 1).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

20.08.2010, 19:25

Ja stimmt, das klappt besser.
Habe es jetzt so gemacht und für jeden Partikel eine float Array für die Farbe gegeben.
So gehts bestens :P
Danke

Werbeanzeige