GLBasic forum

Codesnippets => Code Snippets => Topic started by: Kitty Hello on 2006-Apr-10

Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-10
Hallo,

ich hatte mal vor einen einfachen Physik-kern zu schreiben. Also: Kugeln mit Masse, cw-Widerstand, Kollision und verbindende, elastische Stäbe/Gummibänder.

Ich würde alle Daten mit TYPES erstellen und dann einen TYPE z.B. "PhyWorld" erstellen, der alles beinhält.

Code: GLBasic [Select]
TYPE VEC3D
   x
   y
   z
ENDTYPE
TYPE BODY
   pos AS VEC3D
   velocity AS VEC3D
   acceleration AS VEC3D
ENDTYPE
TYPE BEAM
   i_begin
   i_end
   E_Modul
   Area
ENDTYPE

FUNCTION BodyAdd: pos AS VEC3D, cw_A AS VEC3D, mass // Körper dazufügen
FUNCTION BodyImpact: Fx, Fy, Fz // Kraft aufbringen
FUNCTION BodyGetPos AS VEC3D: index // Position auslesen
FUNCTION BodyUpdate: get_timer // alles um get_timer [ms] bewegen
Man könnte dann z.B. ein Autorennspiel oder einen Hubschrauber oder eine Rag-Doll Simlation ganz einfach machen. Flipper, Kicker

- Wer hätte dafür Verwendung?
- Wer hat Kommentare was rein / rausgehört?
- Wer hat Lust mitzumachen?
Title: Physik Funktionalität - wer hilft?
Post by: Sebe on 2006-Apr-10
Verwendung? Sicher.
Lust mitzumachen? Lust schon, aber im Moment recht wenig Zeit.
Kommentare? Man könnte sich mal einige der populärsten Engines anschauen (ODE, Tokamak, Newton) und sich einige der Features abschauen. Ich muss jetzt erstmal einkaufen gehen, aber evtl. finde ich dannach ja Zeit mal ein Paar Punkte zusammen zu stellen.

Kommentar2: Kann es sein, dass dieser Thread aus dem anderen OT Thread heraus entstanden ist? Immer wieder schön zu sehen, dass der Support für GLBasic so fix und toll ist :-)
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-10
Dringende Not: Ich will eine Hubschrauber-Simulation schreiben. ;)
Title: Physik Funktionalität - wer hilft?
Post by: Sebe on 2006-Apr-10
Also folgende Faktoren sollten ausreichen um eine tolle kleine Physikengine in GLBasic zu implementieren:

- Joints: Wohl der schwierigste Faktor. Dafür müsstest du evtl. das Modellformat überarbeiten. Mein Vorschlag Joints zu implementieren: Die Modelle liegen entweder als ein Objekt vor, oder als mehrere Objekte. Wenn das Modell mehrere Objekte "enthält" werden diese Objekte als Joints behandelt. Die Joints werden dann getrennt von einander von den verschiedenen Physikfaktoren beeinflusst (Stichwort: Ragdolls). Wenn man noch einen Schritt weiter geht könnte man "breakable joints" daraus machen, die bei einer bestimmten Krafteinwirkung von "Host"-Joint "weggerissen" werden. Beispiel: Eine Glasscheibe, die aus verschieden grossen Dreiecken besteht. Wenn man jetzt auf die Glasscheibe schiesst wird die Glasscheibe in ihre Bestandteile zerlegt. That would be cooooool ;)

- Friction (Reibung): Für Autosimulationen, Kegelspiele, Billard...

- Acceleration (Beschleunigung): Ein Apfel, der von einem Baum fällt (Schwerkraft). Ein Fussball, der geschossen wird (Beschleunigung nach vorne und nach oben + Schwerkraft).

Vielleicht knapse ich doch ein wenig von meiner Freizeit ab, könnte interessant werden :)
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-10
Einen nichtlinearen Gleichungslöser wollte ich vermeiden, wenn's geht.
Title: Physik Funktionalität - wer hilft?
Post by: Baggi on 2006-Apr-11
Hi,

hört sich interessant an. Viel Zeit habe ich leider nicht, aber wenn es konkrete physikalische Probleme gibt würde ich mir die mal anschauen.

Baggi
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-11
Super! Da fängt's schon gleich an:
Ich hab 2 Kugeln. Die eine hängt über einen Stab verbunden an der anderen. Jede der Beiden hat eine aktuelle Geschwindigkeit v und eine Masse m. Das reicht, oder?
Jetzt bewegen sich Beide um s=v*delta_t. Dabei wird der Stab gedehnt. Dadurch ergeben sich wiederum Kräfte, die ich auf die Beiden Kugeln aufbringen muss, oder?
Die Kraft wäre dann: epsilon * EA mit epsilon = Dehnung des Stabes, EA=Steifigkeitsmodul*Querschnittsfläche vom Stab.
Irgendwie kommt da aber doch noch die Rotationsträgkeit rein, oder? :/
Ich bin mir da etwas unsicher.
Title: Physik Funktionalität - wer hilft?
Post by: Baggi on 2006-Apr-11
Hmmm, mit Dehnungen und starren Körpern kenne ich mich nicht so gut aus. Aber gehen wir mal davon aus, dass deine Gleichungen bezüglich der Dehnung richtig sind.

Beschreibe mir die Szene bitte noch etwas genauer.

1. Ich gehe mal davon aus, das die Geschwindigkeiten und Richtungen der beiden Kugeln gleich sind, da sie ja sonst nicht mit einer Stange verbunden sein könnten.

2. Wenn sich beide Kugeln um s=v*delta_t verschieben, dann kommt es nicht zu Spannungen (wenn v1=v2). Meinst du sie bewegen sich um den Betrag s aber in verschiedene Richtungen?

3. Angenommen v1=v2=(0,1) soll ein Vektor sein mit x=0 und y=1. Das Teil bewegt sich also nach positiv y und die x-Komponente ist 0.

4. Wenn jetzt für einen kurzen Moment  v1=v1+delta_v und v2=v2-delta_v mit delta_v=(0,0.1) wirken, dann kommt es zu Spannungen im Stab und auch zu einer Rotation. Kugel 1 zieht nach positiv y und Kugel 2 nach negativ y. Dadurch wirkt ein Drehimpuls, ein Trägheitsmoment und damit auch eine Rotationsenergie.

5. Ich glaube Trägheitsmomente für Hanteln auszurechnen ist nicht ganz einfach, aber vielleicht kann man das zu Punktmassen mit Abstand r zur Drehachse vereinfachen.

6. Bevor ich jetzt noch weiter schwafel, sag mir bitte ob ich das richtig verstanden habe oder ob es doch anders ist.
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-11
1. Doch: 2 Kugeln, eine zieht nach rechts, eine nach oben -> was passiert?
2 ja
3 OK
4 ja!?
5 das meine ich müsste reichen. Die Stangen lassen wir einfach weg ;)

also, machen wir 2D:
p1(0,0) = position, kugel 1
p2(1,0)
v1(0,1)
v2(1,0)
Was passiert? Mit den Dehnung das stimmt: sigma(spannung) = eps * E; sigma = F/A -> F = eps * EA
Title: Physik Funktionalität - wer hilft?
Post by: Baggi on 2006-Apr-11
OK, verstehe. Jetzt müssen wir uns genau überlegen was für Kräfte wirken.
Ich werde mal versuchen mit dem Trägheitsmoment und der Rotationsenergie was zu machen ;) .
Heute schaffe ich es aber nicht mehr. Melde mich morgen wieder.

Baggi
Title: Physik Funktionalität - wer hilft?
Post by: Baggi on 2006-Apr-11
Ha, oder ist es vielleicht doch ganz anders als ich dachte?

In 2D:       O------------O

Wenn die linke Kugel zB. mit v=1 nach oben zieht und die rechte mit v=2 auch nach oben zieht, dann überholt die schnellere sozusagen die langsamerewas zu einer Drehbewegung des Systems führt, indem die linke Kugel leicht zur rechten wandert und die rechte leicht in Richtung der linken. Solange bis beide Kugel senkrecht stehen. Dann muss man noch überlegen, wie sich die Gesamtgeschwindigkeit des Systems verhält. Also additiv, oder die Minimum-Geschwindigkeit wirkt beschränkend oder die Maximum-Geschwindigkeit dominiert.

Ist es so?
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-11
Weiß nicht!? Ich meine: Das gesamtsystem hat (in seinem Schwerpunkt) die Krafte v1+v2 wirken. Zusätzlich wirkt ein Moment um den Schwerpunkt aus den beiden Hebelarmen und größen der ähhh.. Kräfte.
Also müsste man die Kräfte am System wissen, daraus dann Beschleunigung und Rotationsbeschl. errechnen und wieder auf die Kugeln aufbringen. Ja? Nein?
Title: Physik Funktionalität - wer hilft?
Post by: Baggi on 2006-Apr-11
Hmmm, was willst du genau mit dieser Hantel simulieren?
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-12
Also, die Engine sollte irgendwelche Kugeln im "All" und deren Kollision simulieren. So weit kein (großes) Problem. Aber, dann will ich noch sagen können: Kugel 1 und 5 sind mit EA=... und l=... verbunden. Damit könnte man schon so Lebkuchenmänchen simulieren.
Title: Physik Funktionalität - wer hilft?
Post by: WPShadow on 2006-Apr-12
Hi!

Ich finde die Idee mit der Physikengine genial. Ist es vielleicht möglich das Ganze in GLBasic selbst unterzubringen? Als eigene Befehlsreihe? So etwas wie --> PHY_BESCHLEUNIGUNG(x, y, z, faktor, verzögerung, ...)

Anbei frage ich heute mal einen Freund ob er sich im Forum anmelden möchte. Er ist Dipl. Ing. der Technischen Physik. Er kann sicher helfen...

GLG

W.
Title: Physik Funktionalität - wer hilft?
Post by: Baggi on 2006-Apr-12
Aha, verstehe.
Ich schau mir das mal über Ostern an.

Baggi
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-12
Hmmm.. .Einbauen oder in GLBasic schreiben?
Title: Physik Funktionalität - wer hilft?
Post by: WPShadow on 2006-Apr-13
Ich denke, daß ein eingebauter Befehl das Ganze einfacher machen würde, als eine Sub und/oder Function, die man immer wieder als Code einfügen muß.

Zwar hat man dadurch weniger Möglichkeiten in die Physik direkt einzugreifen, aber das sollte auch nicht so schlimm sein.

Wir sollten uns zumindest einmal alle ausreden, welche Befehle überhaupt grundlegend notwendig sind, um eine halbwegs "reale" Physik zu erstellen und was für Parameter dafür am geeignetsten wären.

Ich denke, daß folgende Dinge grundlegend wichtig wären:

Beschleunigung / Verzögerung
Masse
Trägheit (die sich aus den beiden anderen ergibt)
Materialeigenschaften (Elastizität, Härte, ...)

Was sagt ihr dazu???

GLG

W.
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Apr-13
Man kann GLBasic code auch ohne Copy+Paste einfügen. Ich hab einen Ornder: GLBasic/Projects/Common, da sind .gbas Dateien 'Drin, die ich immer wieder brauche. Die klick ich mir in mein Projekt und kann sofort die Funktionen darin verwenden. Probier's mal aus!
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Aug-03
Soooooo.... Ich hatte gestern Abend viel Zeit und wenig Schlaf ;). Nach einigem Kopfkratzen hab' ich das hier gemacht:
http://www.glbasic.com/showroom.php?game=Physics

Das sind derzeit 3D Kugeln (auch wenn ich nur 2D nutze). Hat jemand Lust weitere Spielereien einzubauen?
-Reibung (Luftwiderstand)
-Gummibänder
-Magnete
-Tetraeder?
Title: Physik Funktionalität - wer hilft?
Post by: WPShadow on 2006-Aug-03
Hi!

Also zur Reibung bzw. zum Luftwiederstand habe ich da eine kleine Formel, die ich auch in mein Programm eingebaut habe:


Kraft = Masse * Gravitation - Reibung * (Geschwindigkeit * Wurzel ( Geschwindigkeit ² )

Die haben wir mit meinem "Physiker" ausgearbeitet. Also im Prinzip sollte man es so normal einsetzen können. Zumindest haben wir es so errechnet.

Normalerweise sollte sich das auch in 3D umsetzen lassen, wenn man einfach davon ausgeht, daß statt Gravitation eine gewisse Kraft aus bzw. in eine gewisse Richtung wirkt, quasi als Richtungsvektor (x, y, z).

Natürlich sind wir in meinem Beispiel davon ausgegangen, daß die absolute Höhe 480 (640 x 480) ist und die Gravitation logischerweise nach unten geht...

GLG

W.
Title: Physik Funktionalität - wer hilft?
Post by: WPShadow on 2006-Aug-04
PS.:

Beim Physikbeispiel habe ich etwas entdeckt!

Es sind 4 Kugeln:

Wenn man die oberste nach unten schießt, bewegt sie sich einfach über die Unterste drüber, ohne eine Reaktion hervor zu rufen...

Das war nicht geplant, oder?

GLG

W.

PS.: Hatte etwas Zeit zum Spielen... :-)
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Aug-04
Bingo! Das
IF e1.vel[0] OR e1.vel[1] OR e1.vel[2]
und das ENDIF muss weg.
Update demnächst
Title: Physik Funktionalität - wer hilft?
Post by: Kitty Hello on 2006-Aug-28
So. Hab' im Urlaub mal die Gummibänder eingetippt.
http://www.glbasic.com/showroom.php?game=Physics
Die haben eine bestimmte Länge und drücken/ziehen die verbundenen Kugeln. Ich werd's noch erweitern, dass z.B. nur eine Verlängerung zu Krafteileitung führt. Dann hätte man ein Gummiseil, das erst ab einer bestimmten Länge gedehnt wird.
Verdrehungen sind noch nicht drin.
Ich muss mal sehen, wie man die X_ROTATION einbaut, so dass man einfach 3D Objekte platzieren kann...