Partikelenginge -> Bewegung

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

M0rgenstern

Betreff: Partikelenginge -> Bewegung

BeitragMo, Apr 05, 2010 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey Leute.
Ich bin gerade aus Spaß und wegen dem Lerneffekt dabei eine Partikelengine zu schreiben.
Ich möchte dazu nen kleinen Editor schreiben um Emitter zu setzen und diesen bestimmte Werte zuzuteilen.
Das ganze sollte von den Werten etc schon ein wenig komplexer werden (Farben stufenlos einstellen, Austrittswinkel etc.)
Ich habe die Klasse für die Partikel auch schon fertig.
Die Bewegung wird momentan aber folgendermaßen berechnet:

BlitzMax: [AUSKLAPPEN]
	Method Move()
fYSpeed = fYSpeed + fGrav
fX = fX + fXspeed
fY = fY + fYSpeed
End Method


Ich habe aber auch ein Attribut "fAngle". Vorher habe ich die Bewegung mit Sinus und Cosinus berechnet, habe aber die Gravitation nicht einberechnen können.
Meine Frage wäre jetzt: Wie stelle ich eben dieses am besten an? Also die Bewegung durch Winkel zu errechnen aber die Gravitation mit einzubeziehen.

Ich habe mir sowas gedacht:
BlitzMax: [AUSKLAPPEN]
fx = fx + Sin(fangle) * fxspeed
fy = fy - Cos(fangle) * fyspeed
fyspeed = fyspeed + fgrav
fy = fy + fyspeed


Aber ich finde das ist irgendwie blöd, weil dann die YKoordinate zweimal neu berechnet wird. Das sieht mit Sicherheit auch nicht unbedingt sehr gut aus, je nach Partikel Geschwindigkeit.

Vielleicht kann mir ja jemand nen Ansatz geben.

Lg, M0rgenstern

mpmxyz

BeitragMo, Apr 05, 2010 11:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn sich die Bewegungsrichtung nicht im Verlauf des Partikellebens drehen soll, berechnest du die Teilgeschwindigkeiten beim Erstellen des Partikels.
Dann kannst du darauf die Gravitation wirken lassen; die Bewegungsrichtung an sich gibt es nicht mehr.
(->Sinus- und Cosinusberechnungen gespart!)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragMo, Apr 05, 2010 11:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, soweit war ich ja im Code oben schon.
Aber das Problem ist: Ich will das so programmieren, dass man den Austrittswinkel der Teilchen ändern kann.
Und da dachte ich müsste ich schon noch mit Sinus und Cosinus rechnen.

Oder habe ich grade einen Denkfehler drin?

Lg, M0rgenstern.

mpmxyz

BeitragMo, Apr 05, 2010 11:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, du hast einen Gedankenfehler, denkst aber richtig:
Beim Erstellen des Partikels nutzt du noch Sinus und Cosinus, um die Geschwindigkeitskomponenten zu berechnen. (Der Winkel ist der von dir angesprochene Austrittswinkel.)
Danach nutzt du aber diese und brauchst weder die Richtung noch Sinus oder Cosinus.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

M0rgenstern

BeitragMo, Apr 05, 2010 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, die Frage ist jetzt vielleicht dämlich, aber: wie berechne ich die Geschwindigkeit abhängig von dem Winkel?
Oben die Formel umstellen wäre eher kompliziert.

Lg, M0rgenstern

Thunder

BeitragMo, Apr 05, 2010 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme an so:

BlitzMax: [AUSKLAPPEN]
fspeed=20
fxspeed=fspeed*Cos(fangle)
fyspeed=fspeed*Sin(fangle)


fspeed stellt dabei die Gesamtgeschwindigkeit dar. Ich glaube mpmxyz hat das so gemeint.
Und diese Berechnung sollst du eben nur machen, wenn du einen neuen Partikel erstellst.

mfg Thunder
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

M0rgenstern

BeitragMo, Apr 05, 2010 22:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm...
Also das funktioniert ganz gut, aber ich habe noch ein Problem: Die Partikel sind immer symmetrisch.
Das heißt, wenn ich den Winkel auf 90 stelle, dann fliegen die Partikel nach links und rechts.
Es sollte aber so sein, dass sie nur nach rechts bzw links fliegen.

Hier der Code:

BlitzMax: [AUSKLAPPEN]
Particle.fAngle = Rand(-90, -90)
Particle.iDuration = Rand(4000, 6000)
Particle.iStart = MilliSecs()
Particle.fGrav = pGrav
Particle.fSpeed = Rnd(-5, 5)
Particle.fXspeed = Particle.fSpeed * Cos(Particle.fAngle)
Particle.fYSpeed = Particle.fSpeed * Sin(Particle.fAngle)


Und die Bewegung:

BlitzMax: [AUSKLAPPEN]
Method Move()
fYSpeed = fYSpeed + fGrav
fX = fX + fXspeed
fY = fY + fYSpeed
End Method


Lg, M0rgenstern

Thunder

BeitragMo, Apr 05, 2010 22:39
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzMax: [AUSKLAPPEN]
Particle.fAngle = Rand(-90, -90)


Steht das wirklich so im Code?
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

M0rgenstern

BeitragMo, Apr 05, 2010 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja.
Wahlweise auch mit 90, 90
Warum?

Lg, M0rgenstern

Thunder

BeitragMo, Apr 05, 2010 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, wenn du Rand(-90,-90) verwendest, kannst du gleich -90 schreiben, oder?
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

M0rgenstern

BeitragMo, Apr 05, 2010 23:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, ist mir schon bewusst.
Aber eigentlich sollen da zwei verschiedene Zahlen hin, um einen bestimmten Bereich zu nutzen. Aber ich wollte erstmal ausprobieren bei welchen Zahlen etwa welche Richtungen entstehen und hab den Code halt nicht umgeschrieben.

Es geht ja auch nur um das Problem mit der Symmetrie.

Lg, M0rgenstern

Thunder

BeitragMo, Apr 05, 2010 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja und dieses Problem resultiert doch aus diesem 90° Winkel nicht?
Wenn du sie nur nach rechts/links fliegen lassen willst, musst du den Winkel einschränken.
]-90;+90[ = rechts
]+90;270[ = links

Oder verstehe ich das Problem falsch?
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

M0rgenstern

BeitragMo, Apr 05, 2010 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, eben nicht.
Wenn ich als Winkel +90° bzw. -90° habe, dann passiert folgendes:

Links und rechts von der Maus treten Partikel aus, die sich dann auch entsprechend nach links/rechts bewegen.
Also als würde eine Symmetrieachse durch die Maus verlaufen (Momentan werden die Partikel halt an der Masu erstellt).
Und ich möchte es so, dass die Partikel nur nach links oder rechts bewegt werden, also nur in eine Richtung udn nicht nochmal symmetrisch gleichzeitig in die andere Richtung.

Lg, M0rgenstern

Xeres

Moderator

BeitragMo, Apr 05, 2010 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Negative Winkel decken den selben Bereich mit negativen Vorzeichen ab... soll heißen: Nimm nur Positive Winkel.
-90° = +270° = Unten
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Thunder

BeitragMo, Apr 05, 2010 23:43
Antworten mit Zitat
Benutzer-Profile anzeigen
@Xeres: kann ich so nicht bestätigen.

@M0rgenstern: Deine Überlegungen (deine geposteten Codes) funktionieren theoretisch:

BlitzMax: [AUSKLAPPEN]
Strict

Global pGrav#=0.05

Type TParticle
Field fAngle,iDuration,iStart,fX#,fY#
Field fGrav#,fSpeed,fXspeed#,fYSpeed#
Function Create:TParticle(x,y)
Local Particle:TParticle=New TParticle
Particle.fAngle = Rand(-89,89)
Particle.iDuration = Rand(4000, 6000)
Particle.iStart = MilliSecs()
Particle.fGrav = pGrav
Particle.fX=x
Particle.fY=y
Particle.fSpeed = Rnd(7)
Particle.fXspeed = Particle.fSpeed * Cos(Particle.fAngle)
Particle.fYSpeed = Particle.fSpeed * Sin(Particle.fAngle)
Return Particle
EndFunction
Method Move()
fYSpeed = fYSpeed + fGrav
fX = fX + fXspeed
fY = fY + fYSpeed
End Method
EndType


Graphics 800,600

Local particlelist:TList=CreateList()

Repeat
Cls
DrawRect MouseX()-1,0,1,600
If MouseHit(1) Then particlelist.addlast(TParticle.Create(MouseX(),MouseY()))
For Local p:TParticle=EachIn particlelist
Plot p.fX,p.fY
p.Move()
Next
Flip
Until AppTerminate()
End


Das ist jetzt nur eine kleine Implementation (die uA auch zeigt, dass -90° bis +90° den rechten Abschnitt darstellt). Bei mir werden NUR Partikel erzeugt, die nach rechts fliegen.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

M0rgenstern

BeitragMo, Apr 05, 2010 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist mir im Prinzip schon bewusst. Das Gespräch kam grade ja auch nur auf, weil ich halt im Code -90 stehen hatte.
Aber da liegt auch nicht das Problem.

Ich glaube ich erklärs mal an nem Beispiel, also:
Meine Partikel werden momentan an der Maus erstellt. Die anfänglichen Koordinaten der Partikel sind also die der Maus in diesem Moment.
Der Winkel, in dem die Partikel austreten beträgt 90°. Damit will ich erreichen, dass die Partikel sich von der Maus nach rechts bewegen. Das tun sie auch. Aber gleichzeitig bewegen sich andere Partikel, mit der gleichen Voraussetzung nach links. Und genau das soll halt nicht sein.
Ich weiß aber auch nicht, wie ich das genau berechnen muss, dass der gewünschte Effekt eintritt.

Hoffe, dass das ein wenig mehr Licht in die Sache bringt.

Lg, M0rgenstern

Thunder

BeitragMo, Apr 05, 2010 23:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau das ist der Punkt, den ich nicht ganz verstehe. Wie können sich die Partikel bei einem Winkel von -90° (=Oben) nach links bzw rechts bewegen? Bei einem solchen Winkel sollten sie doch eine Gerade beschreiben.
Lässt du irgendwelche Zusatzparameter in die Bewegung einwirken?

Edit: aha, verstehe. Die 90° waren schon umgerechnet.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
  • Zuletzt bearbeitet von Thunder am Mo, Apr 05, 2010 23:57, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Apr 05, 2010 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
@Thunder: richtig, -90 bis +90 deckt ja auch den ganzen rechten Bereich ab - es sollte trotzdem
a) -Sin heißen, sonst spiegelst du die Achse.
und b) darf die Geschwindigkeit nicht Negativ sein können
Der Fehler ist:
Code: [AUSKLAPPEN]
Rnd(-5, 5)
das Spiegelt nämlich ebenfalls die Achse...
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Mo, Apr 05, 2010 23:56, insgesamt einmal bearbeitet

M0rgenstern

BeitragMo, Apr 05, 2010 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab das Problem gerade gelöst, als ich mir deinen Code angeschaut habe.
Die Zeile in der du die Startgeschwindigkeit setzt unterscheidet sich essentiell von meiner: Ich beziehe einen negativen Bereich mit ein. Meine Startgeschwindigkeit kann auch -5 betragen. Und genau dann tritt der beschriebene Effekt auf.
Habs also jetzt gelöst.

Vielen Dank für eure Hilfe bei diesem (dämlichen) Fehler.

Lg, M0rgenstern

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group