| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Meep! Registriert seit: Sep 2005
Beiträge: 146
| Polygon - physik ?
also ich will endlich mal ne kleine physik engine in flash schreiben bin mir aber nicht sicher, was die optimalste metode zur hittest berechnung ist. ich schreibe das ganze in AS3. also ich hab mir folgendes überlegt: ich überprüfe beim aktuellen polygon erstmal, ob einer der eckpunkte auf dem weg zu nächsten position eine fremde gerade schneidet. nun nehme ich alle fremden eckpunkte und überprüfe, ob einer von diesen mein polygon schneidet, indem ich die entgegengesetzt zum richtungsvektor des aktuellen polygons verschiebe. nun suche ich den dem aktuellen polyg. nächstgelegenen schnittpunkt(wie genau weis ich noch nicht) und lasse es von diesem abprallen. das ganze ist leider sicher sehr rechenintensiv...hat jemand ne bessere idee/n beispiel oder tutorial? wäre super achja: ich weis zwar, wie ich den schwerpunkt des polygons berechne, aber wie kann ich damit und mir dem abprallpunkt die rotation und den abprallwinkel genau berechnen? danke
__________________ http://www.pixartist.de Geändert von pixartist (08-12-2006 um 16:32 Uhr) |
| | |
| | #2 (permalink) |
| Neuer User Registriert seit: Jul 2006
Beiträge: 21
|
Deine Methode ist sehr rechenaufwändig, wenn du damit alle Objektkollisionen prüfst. Generell sollten nur Objekte "genau" geprüft werden, wenn eine kollision überhaupt in frage kommt. Ich weiß natürlich nicht, wie deine "Spielwelt" aussieht. Generell habe ich bei solchen Problemen aber gute Erfahrungen damit gemacht fixe Objekte bestimmten Areas zuzuweisen und nur innerhalb einer bestimmten Area zu prüfen. Bewegliche Objekte müssen sich dann natürlich in Areas "anmelden". Selbstverständlich können Objekte auch in mehreren Areas liegen. Der eigentlich Prüfvorgang, den du beschreibst, halte ich so für sinnvoll. Er sollte halt nur möglichst selten durchgeführt werden. |
| | |
| | #3 (permalink) |
| Meep! Registriert seit: Sep 2005
Beiträge: 146
|
hm ok...was hältst du von der idee, einen aussenkreis ums polygon zu legen und dann erstmal zu prüfen ob sich dieser kreis überhaupt mit dem anderen objekt schneidet?
__________________ http://www.pixartist.de |
| | |
| | #4 (permalink) | |
| DeRailed Registriert seit: Sep 2006
Beiträge: 321
|
Diese Idee ist sehr gut ![]() Nein, Scherz beiseite: Auch in der "non-flash" Spieleprogrammierung verwendet man meistens das gleiche Prinzip: Man legt um seine Objekte eine extrem vereinfachte Form – meist eine Kugel oder einen Quader. Dann werden zuerst diese auf Kollision überprüft, bevor die wesentlich rechenaufwändigeren Polygon-Kollisionsberechnungen zum Einsatz kommen. Du kannst jetzt genau das gleiche mit deinem Polygon machen. Da du ja anscheinend nur 2 Dimensionen hast, arbeite einfach mit Kreisen oder Rechtecken. Kreise hätten den Vorteil, dass die Kollision sehr einfach zu berechnen ist. Pseudocode: Code: bool hitTest( obj2 ) {
int distance = sqrt( abs( x - obj2.x )^2 + abs( y - obj2.y )^2 );
return distance < ( bSRad + obj2.bSRad)
} Bounding Rectangles sind sehr leicht zu berechnen und sind tendenziell (hängt natürlich von den Objekten ab, die du bevorzugt verwendest) genauer (einfach kleinste und größte x- und y-Koordinaten bestimmen), allerdings erfordern die Kollisionen zwischen ihnen etwas mehr Aufwand. Was in deinem Fall besser bzw. schneller funktioniert, kann ich dir nicht sagen. Wenn du einen größeren Bereich hast, in dem sich die Objekte befinden, dann zahlt es sich wahrscheinlich aus, diesen in mehrere Bereiche zu unterteilen und dein Polygon immer nur mit den anderen zu vergleichen, die sich im selben Bereich befinden. Zitat:
Ansonsten kannst du dir ja mal die Arbeiten von André Michelle anschauen, der auch hier im Forum sehr aktiv ist. (http://lab.andre-michelle.com/tag/physics/) Der Typ hat eindeutig zu viel Freizeit^^ Geändert von klickverbot (09-12-2006 um 21:32 Uhr) | |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |