Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 23:21

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Aug 22, 2013 10:08 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Hallo zusammen,

ich beschäftige mich gerade mit Kollisionserkennung bei Partikel-Simulationen, sowie dem zugehörigem Impulse/Resonse für Kollision auf Statische Ebenen. Dabei habe ich aber gerade ein paar Schwierigkeiten. Es scheint so das irgendetwas in meiner Implementierung fehlt. Wenn ich das in einer realen Partikel-Simulation anwende, springen manche Partikel am Rand entlang - bleiben aber auf der Ebene, bzw. darüber, wie als würden die darüber schweben. Daher bin ich mir sicher, das ich irgend etwas falsch mache.

Was ich habe ist eine Ebene (Plane) mit einer Oberflächen-Normale und der zugehörigen Distanz zum Ursprung, sowie eine Partikel-Position, Partikel-Velocity und den Partikel-Radius.

Bisher mache ich das so: (Siehe jsfiddle: http://jsfiddle.net/k2LTb/)

- Ich hole mir den "Closest point on plane" (Nächstliegender Punkt auf der Ebene in Deutsch???) mittels einfacher Formel:

P = Plane Position (Vector)
N = Plane Normal (Vector)
d = Plane Distance (Scalar)

Closest Point = P + (N * -(N dot P) + d)

- Als nächstes kann ich das Skalarprodukt auf die Distanz zwischen Partikel Position und Closest Point bestimmen (Damit weiß ich schonmal ob der Partikel hinter/vor oder auf der Ebene liegt)

C = Closest Point (Vector)
N = Plane Normal (Vector)
P = Partikel Position (Vector)
r = Partikel Radius (Float)

Closest Distance = ((P - C) dot N) - r

- Nun projeziere ich die Partikel-Velocity auf die Ebenen-Normale (Wichtig um den exakten Zeitpunkt zu bestimmen wann der Partikel auf die Ebene auftrifft)

N = Plane Normal (Vector)
V = Partikel Velocity (Vector)

Proj Vel = -(V dot N)

- Ist Proj Vel > Closest Distance dann bestimme exakten Punkt wenn Partikel auf Ebene auftritt (Corrected Position)

V = Partikel Velocity (Vector)
P = Partikel Position (Vector)
Vc = Neue temporäre Velocity zum zurücksetzten des Partikel auf den Contact point (Vector)
Pc = Korrigierte Partikel Position (Vector)

t = Closest Distance / Proj Vel = Time of Impact
Vc = V - V * (1 - t)
Pc = P + Vc
P = Pc

- Response für Partikel - Statische Kollision

V = Partikel Velocity (Vector)
N = Ebene Normal (Vector)

Kr = CoEfficient of Restitution (Bounciness) = 0.0 (Float)
Vn = N * N dot V (Beschleunigungs-Vektor auf Ebene Normal projeziert)
Vt = V - Vn (Tangente des Beschleunigungs-Vektor auf Ebene Normal projeziert)
R = Vt - Vn * Kr (Neue Partikel-Velocity)
V = R



Nun ist die Frage, was ist hier faul, bzw. wie macht man es richtig?

Eine Frage dazu hab ich noch zusätzlich: Wie berechne ich einen Kollisions-Impulse anstatt einer modifikation der Velocity? Also einen Impulse (So? I = V - R ?)

Danke schonmal,
Final


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 22, 2013 15:14 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Hi Finalspace,

ich habe mal meine Änderungen geforkt.
Die Änderungen sind mit Note 1 + 2 markiert.


Zumindest einen einigermaßen anständig aussehenden Reflektionsvektor habe ich hinbekommen, aber ich glaube da stimmt immer noch irgendwas nicht mit Bounciness und Friction. Wobei ich finde, dass Friction eigentlich nur für den Fall berücksichtigt werden sollte, wenn sich das Objekt auf dem Gleitpfad befindet. Und dann sollte Bounciness nicht nur die y Koordinate, sondern die Länge des Vektors 'restVelocity' beeinflussen?


Ich hatte bei meiner Kollisionserkennung häufig das Problem, dass Objekte, die in einem zu flachen Winkel auftrafen, evtl. nicht weit genug aus der Ebene herausgeschoben wurden und anschliessend an ihr 'klebten'. Gelöst habe ich das durch eine zusätzliche Verschiebung aus der Ebene heraus mit einem ganz kleinen Epsilon.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 29, 2013 06:35 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Ja, es ist tatsächlich so, irgendetwas stimmt nicht.
Kann es sein, das nicht der Response falsch ist, sondern die Kollisionserkennung ansich?

Ich habe mal einen anderen Response eingebaut, der bei Partikelsimulationen häufig verwendet wird.
Vor allem in den Paper die ich so gelesen habe, ist genau dieser Response überall drinne.
Macht bei mir aber sehr merkwürdige Ergebnisse, es passiert das Partikel an der Ecke irgendwie durchkommen, aber trotzdem wieder zurückgebracht werden.

Du kannst dir das live an meiner SPH-Partikel-Simulation die ich in Javascript implementiert habe anschauen:
http://root.xenorate.com/final/physics/sph.html

(sph.js - resolveCollision)

Code:
  1.  
  2. // Velocity projection is greater than closest distance
  3.         if (projVel > closestDistance) {
  4.             var time = closestDistance / projVel;
  5.  
  6.             // Correct velocity by time factor
  7.             var correctedVelocity = velocity.sub(velocity.mulScalar(1.0 - time));
  8.  
  9.             // Get corrected position
  10.             var correctionPosition = prevPos.add(correctedVelocity);
  11.  
  12.             // Set new position to corrected one
  13.             particle.position.setup(correctionPosition);
  14.  
  15.             // Calculate new velocity
  16.             var restitution = 0;
  17.             var Vn = normal.mulScalar(normal.dot(velocity));
  18.             var Vt = velocity.sub(Vn);
  19.             var Vi = Vt.sub(Vn.mulScalar(restitution));
  20.             particle.velocity.setup(Vi);
  21.  
  22.             /*
  23.             // Set new position to corrected one
  24.             VecMath.Vec2Add(correctionPosition, normal.mulScalar(Constants.Epsilon), particle.position);
  25.  
  26.             // add a velocity impulse against the collision normal
  27.             VecMath.Vec2Add(particle.velocity, normal.mulScalar(projVel), particle.velocity);
  28.             */
  29.  
  30.             // Reset force
  31.             this.forces[index].zero();
  32.             particle.force.zero();
  33.         }
  34.  


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.113s | 17 Queries | GZIP : On ]