NooNoo Physics

Kommentare anzeigen Worklog abonnieren
Gehe zu Seite Zurück  1, 2

Worklogs NooNoo Physics

Reibung

Sonntag, 5. April 2009 von Noobody
Ich lebe noch!
Nach einiger Zeit in der Versenkung gibt es wieder Neuigkeiten aus der Welt der Physik.

Da ich in zwei Wochen meine Maturarbeit abgeben muss, habe ich mich nochmal daran gemacht und erste Ergebnisse erhalten Razz
Und zwar habe ich ein seit langem fehlendes Feature eingebaut - Reibung. Das ganze hat sich komplizierter herausgestellt als zuerst gedacht, aber es funktioniert nach zwei Wochen endlich relativ fehlerfrei.
Bisher habe ich es erst in Blitzbasic umgesetzt, die Portierung nach C erledige ich noch in den nächsten Tagen.
Die Reibung ist wirklich essentiell, da sich beispielsweise Räder gar nicht drehen würden, wenn keine Reibung berechnet wird - ebenso bewegt sich ein Rad nicht, wenn es sich dreht; es dreht auf der Stelle.

In den nächsten zwei Wochen muss ich neben der Maturarbeit selbst noch ein Programm schreiben, welches es dem User erlaubt, ein wenig mit der Physik herumzuspielen. Ein wenig in der Art wie die bisherigen Physikdemos, aber natürlich dann schön verpackt in eine GUI etc.
Den Programmcode der Physiklib und der Physikdemo stelle ich frei - vielleicht hilft es dem einen oder anderen, das Ganze besser zu verstehen.

In zwei Wochen gibt es dann ein erstes Release, zusammen mit meiner Maturarbeit darüber - kringelt euch also schon mal den Tag im Kalender ein Wink

Ragdolls im freien Fall

Samstag, 17. Januar 2009 von Noobody
In der letzten Woche habe ich mich mal mit Ragdolls beschäftigt und einen behelfsmässigen Editor für Ragdoll - Skelette geschrieben.
Damit habe ich bereits erste Erfolge erzielen können und will euch das natürlich nicht vorenthalten:

user posted image

Das ist die Ragdoll, nachdem ich ihr einen ordentlichen Stoss in die Brust verpasst habe

user posted image

Das hier zeigt das Grundskelett, das sich für dieses Modell bewährt hat.

Wie auch auf den Screenshots zu sehen ist, sind Ragdolls noch nicht ganz fertig.
Im Moment kann man beispielsweise den Fuss ohne Probleme in den Kopf stecken, obwohl eigentlich das Knie und das Hüftgelenk das im Normalfall nicht erlauben - da muss ich noch ein wenig Arbeit reinstecken.
Im ersten Screenshot ist beispielsweise das linke Bein in einer ziemlich unnatürlichen Position (ich möchte nicht wissen, wie sein Knie jetzt aussieht *schauder*).

Hat man sein Skelett fertig gebastelt, so kann man es abspeichern und während des Spiels laden.
Man übergibt der Lade - Funktion einfach das Handle für das Mesh, dann wird das Skelett geladen und in das bestehende Mesh eingefügt.
Normalerweise sind Personen in einem Spiel ja fest animiert, und erst bei Tod oder ähnlichen Ereignissen soll die Ragdoll ins Spiel kommen - dann benutzt man sein Personenmodell ganz normal, und irgendwann lädt man dann sein Ragdollskelett hinein und sofort wird die Physik für die Person berechnet.

Die Ragdolls werden demnächst in Tehadon zu sehen sein, daher überliess mir Peacemaker freundlicherweise eines ihrer Modelle (ein Intenar), um das zu testen.
Hier nochmals einen schönen Dank dafür Razz

3D ist für Grössenwahnsinnige

Sonntag, 11. Januar 2009 von Noobody
Nach langem Schweigen ein erster Eintrag aus der Versenkung!
Ich habe dabei die ganze Zeit an der 3D - Kollision gebrütet und gefrustet, aber immerhin zeigt die Arbeit jetzt erste Früchte:

user posted image

Ein Tetraeder (das simpelste 3D - Objekt, das es gibt) kollidiert mit einem anderen Tetraeder! (falls man aus der Perspektive nicht schlau wird: Der eine Tetraeder fiel von oben auf den anderen und schliddert jetzt an der Aussenseite nach unten)

Leider ist meine jetzige Kollisionsmethode nicht besonders genau. Je weniger Punkte und je grössere Flächen ein Objekt hat, desto wahrscheinlicher ist es, dass der Algorithmus nicht anspringt.
Das ist leider ein Nebeneffekt, da ich nicht wie gedacht das Separating Planes Theorem verwenden kann, weil es zu rechenaufwändig wäre.
Am Ende bin ich mit einer Mischung aus Hessescher Normalform und Dreiecksbeziehungen durchgekommen, aber dafür funktioniert es halt nicht so sauber. Je nach dem komme ich irgendwann auf eine bessere Methode, die nicht unglaublich viel Prozessorleistung frisst, oder es bleibt halt so, wie es im Moment ist. (wer mir einen Denkanstoss geben kann: Her damit! Razz )
Demo folgt so bald wie möglich.

Erste Alpha

Samstag, 13. Dezember 2008 von Noobody
Grosse Neuigkeiten!

Ich habe mich heute nochmal hingesetzt und die Physikengine in einen akzeptablen Zustand versetzt, dass ich mal eine erste Alpha rausgeben kann.
Im Downloadpaket findet ihr folgende Dateien:
- NooNooPhysics.decls und
- NooNooPhysics.dll müssen beide in euren Blitz3D\Userlibs - Ordner, sonst erkennt der Compiler die Funktionen der DLL nicht
- NooNooPhysics.bb ist eine Include, in der alle Physikfunktionen enthalten sind, die ihr braucht, inklusive einiger Hilfsfunktionen für Primitive und Zeichenvorgänge
- PhysikDemo.bb ist noch ein kleines Beispiel, dass die wichtigsten Funktionen der Engine demonstriert und einen kleinen Rahmen bietet, wie man so ein Physikprogramm am besten aufbaut (natürlich unverbindlich)

Für eine umfangreiche Dokumentation hatte ich leider keine Zeit, aber eine kurze Übersicht der wichtigsten Befehle liegt in Form der Doku.txt bei.

Ich wünsche euch nun viel Spass mit der Engine und bei Bugs/Verbesserungsvorschlägen stehe ich natürlich gerne zur Verfügung Wink

Download!

Erster Eintrag

Mittwoch, 10. Dezember 2008 von Noobody
In diesem Worklog geht es, wie der Titel schon andeutet, um die Physikengine, die ich gerade entwickle.
Der Name dafür ist noch nicht sicher (der momentane entstand wohl in einem Anflug von Selbstgefälligkeit Razz ), wenn jemand bessere Vorschläge hat, nur her damit!

Der Sinn dieser Engine ist es, eine schnelle und einfache Möglichkeit zu bieten, Physik in B3D zu simulieren.
Das Produkt soll am Ende in Form einer DLL und einer Include für BlitzBasic bestehen, inklusive einer knappen Dokumentation zu den einzelnen Befehlen. Die DLL wird stark auf BlitzBasic zugeschnitten sein, anders wie aktuelle Engines wie Tokamak etc.
Eventuell biete ich später noch Unterstützung für BlitzMax, allerdings gibt es dafür bessere Alternativen (wie z.B. Farseer Physix für 2D).
Besonderes Augenmerk wird nun auf den 2D - Bereich gelegt, da ich dafür noch keine benutzbaren Engines ausser hectic's Physix gefunden habe.
3D soll auch noch implementiert werden, allerdings zeigen sich dabei ein wenig die Mängel der Verlet - Integration, auf deren Theorie mein Kern basiert - mehr dazu später.

Das ganze erstelle ich im Rahmen meiner Maturarbeit (für alle Nichtschweizer: Eine Abschlussarbeit, die ich schreiben muss, um zum Abitur zugelassen zu werden), daher besteht eine Garantie auf Vollendung von dem, was ich geplant habe Wink

Im 2D - Bereich ist die Programmierung bereits relativ weit fortgeschritten. Die Simulation beliebiger Polygone ist implementiert und Kollision wird für alle konvexe Objekte korrekt berechnet.
Was noch fehlt, sind Reibung und das Berechnen von Objekten mit verschiedenen Massen (bisher wird davon ausgegangen, das alles die gleiche Masse besitzt) - jedoch habe ich diese Themen ein wenig weiter nach hinten geschoben und mich vorerst dem 3D - Bereich zugewandt.
Dort funktionieren bereits die grundlegenden Dinge, an der Kollision zerbreche ich mir aber gerade den Kopf (ich kann zwar erkennen, wann eine Kollision stattfindet, aber noch nicht darauf reagieren).

In den späteren Einträgen werde ich über den Fortschritt berichten, von Zeit zu Zeit ein wenig die Theorie hinter dem Ganzen erklären, hin und wieder einen Download anbieten und gegen Ende auch erste Testversionen der DLL herausgeben.

Für den Schluss noch ein älterer Screenshot und der Download dazu:

user posted image

Download
Mit linker und rechter Maustaste kann man verschiedene Objekte erstellen, mit Leertaste das ganze pausieren und mit Enter kann man sich Objekte schnappen, herumschleudern und auch wieder loslassen.

Kommentare sind gerne erwünscht.

Edit: Hoppala, da war wohl ein Schreibfehler im Link. Funktioniert jetzt.

Gehe zu Seite Zurück  1, 2