Physik Funktionalität - wer hilft?

Previous topic - Next topic

Kitty Hello

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?

Sebe

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 :-)

Kitty Hello

Dringende Not: Ich will eine Hubschrauber-Simulation schreiben. ;)

Sebe

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 :)

Kitty Hello

Einen nichtlinearen Gleichungslöser wollte ich vermeiden, wenn's geht.

Baggi

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

Kitty Hello

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.

Baggi

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.

Kitty Hello

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

Baggi

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

Baggi

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?

Kitty Hello

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?

Baggi

Hmmm, was willst du genau mit dieser Hantel simulieren?

Kitty Hello

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.

WPShadow

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.
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est