Kräftesimulation - Dämpfung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Benibaerenstark

Betreff: Kräftesimulation - Dämpfung

BeitragMo, Aug 27, 2007 23:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen

Ich versuche die Grundprinzipien einer Physiksimulation zu verstehen, und habe mir daher eine ganz kleine Kräftesimulation gebastelt: Mit einem roten Gummiseil wird eine Kraft auf die gelbe Massenkugel ausgeübt.
So weit so gut.
Was ich jedoch als nächsten Schritt benötige, ist eine Dämpfung: jedes reale Gummiband, jede Feder usw. hat eine dämpfende Wirkung, in meiner Simulation federt die Masse jedoch ewig! Wie soll ich dies umsetzen??

Code: [AUSKLAPPEN]
;Grafikkramm
gfx=1024
gfy=768

ghx=gfx/2
ghy=gfy/2
Graphics gfx,gfy,0,1
SetBuffer BackBuffer()




;Masse
MposX#=ghx   ;Positionsvektor, bestehend aus X,Y
MposY#=ghy
MvelX#=0     ;Geschwindigkeitsvektor, bestehend aus X-Geschwindigkeit und Y-Geschwindigkeit
MvelY#=0




;Hauptschleife

While Not KeyHit(1)
Cls
;Mausposition
 mx=MouseX()
 my=MouseY()


;Kraft anwenden
     If MouseHit(1)   ; beginnen mit Mausklicken

         If RectsOverlap (mx-10,my-10,20,20, MposX,MposY,1,1)  kraftmodus = 1     
                                 
     End If


     If kraftmodus=1
       If MouseDown(1)=0 Then kraftmodus=0
       
     
      Color 255,0,0
      Line MposX,MposY,mx,my                      ;Kraft einzeichnen


      DeltaXF#=MposX-mx                           ;"Kraftvektor", bestehend aus der X und Y Differenz
      DeltaYF#=MposY-my


      wkf#=(ATan2(DeltaXF,DeltaYF)+360) Mod 360   ;Winkel, Richtung in welcher die Kraft wirkt

      lnf#=Sqr((DeltaXF#)^2+(DeltaYF)^2)          ;Länge der Auslenkung

      federkonstante=100                          ;Elstizität des "Gummibandes"

   
     
      MvelX=MvelX-(Sin(wkf)*lnf)/federkonstante   ;"Geschwindigkeitsvektor", wird entsprechend des Winkels,
      MvelY=MvelY-(Cos(wkf)*lnf)/federkonstante   ;Proportional zur Auslenkung, und der Federkonstante angepasst.

     
      ;DÄMPFUNG????? -> Wie wird die Dämpfende Kraft des Gummibandes umgesetzt?
     
       
     EndIf








;Masse bewegen und Zeichnen

MposX=MposX+MvelX
MposY=MposY+MvelY

Color 255,255,0
Oval MposX-10,MposY-10,20,20



;Gravitation
;MvelY=MvelY+0.1



;Randbegrenzung
If  MposX < 0   MvelX= 0 : MvelY=0 : MposX=0
If  MposX > gfx MvelX= 0 : MvelY=0 :MposX=gfx
If  MposY < 0   MvelY= 0 : MvelX=0 :MposY=0
If  MposY > gfy MvelY= 0 : MvelX=0 : MposY=gfY

;cursor
Color 255,255,255
Rect mx-10,my-10,20,20,0

Text 0,0,"Benutze die Maus, um eine Kraft auf die Kugel auszuüben"

Flip
Wend
End





vielen Dank im Voraus

Beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Aug 27, 2007 23:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Der einfachste Weg ist, es über einen Fakeluftwiederstand zu machen.

Code: [AUSKLAPPEN]
MvelX=MvelX*.95
MvelY=MvelY*.95
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Abrexxes

BeitragMo, Aug 27, 2007 23:54
Antworten mit Zitat
Benutzer-Profile anzeigen
.95 ist aber ein hartes Gummi ^^, aber verdammt cool.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Aug 28, 2007 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Jo stimmt, ~.98 ist wohl besser.

@Benibaerenstark, jetzt noch aus dem Gummiband eine Stange machen, und du hast die grundlegende Technik um Physikspiele programmieren zu können.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Markus2

BeitragDi, Aug 28, 2007 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht auch ohne Atan2 Sin Cos weil das wird dich irgendwann verwirren .

DeltaX,Y,Z / Länge dieser Strecke (lnf)
dann hast du nen Richtungsvector der Länge 1

DeltaX#=MposX-mx
DeltaY#=MposY-mY
DeltaZ#=0

lnf#=Sqr(DeltaX*DeltaX + DeltaY*DeltaY + DeltaZ*DeltaZ)

if lnf then
DeltaX=DeltaX/lnf
DeltaY=DeltaY/lnf
DeltaZ=DeltaZ/lnf
else
DeltaX=0
DeltaY=0
DeltaZ=0
endif

MvelX=MvelX-(DeltaX*(lnf/20))
MvelY=MvelY-(DeltaY*(lnf/20))
MvelZ=MvelZ-(DeltaZ*(lnf/20))

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Aug 28, 2007 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Stimmt, hab ich garnicht gesehen. So gesehen geht es auch ganz ohne Wurzelberechnung, da sich der Richtungvektor linear verhält, kann man auch einfach nur eine reine Division nehmen:

Code: [AUSKLAPPEN]
Graphics 512,512,0,2
SetBuffer BackBuffer()

xp#=100
yp#=100
xg#=0
yg#=0


While Not KeyHit(1)

   mx=MouseX()
   my=MouseY()

   ;Richtungsvektor an Geschwindigkeit anlegen
   xg=xg+(mx-xp)/100.0
   yg=yg+(my-yp)/100.0

   ;Ein einfacher Luftwiederstandersatz
   xg=xg*.98
   yg=yg*.98

   ;Geschwindigkeit an Position anwenden
   xp=xp+xg
   yp=yp+yg

   Color 255,0,0:Line mx,my,xp,yp
   Color 255,255,0:Oval xp-4,yp-4,9,9,1
   Color 255,255,255:Rect mx-4,my-4,9,9,0

   Flip
   Cls
Wend
End


Was mir aber auffiel ist, das das umrum eines von meinem Code abgeleitetes sein müsste. Demnach frage ich mal lieber nach, was Benibaerenstark machen wollte bzw. letztendlich das Ziel ist. So kann man dann vielleicht auch besser helfen. Wenn es nur ein Gummiband ist, so sollte dies der einfachste Weg sein.^^
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Benibaerenstark

BeitragMi, Aug 29, 2007 1:09
Antworten mit Zitat
Benutzer-Profile anzeigen
hectic hat Folgendes geschrieben:
Was mir aber auffiel ist, das das umrum eines von meinem Code abgeleitetes sein müsste.


Du hast genau ins schwarze getroffen. Ich schaute mir deine (echt genialen) Codebeispiele an, um das Phänomen der Dämpfung nachzubauen, leider ohne Erfolg! Auch dieser allgemeine Luftwiderstand genügt meinen Bedürfnissen nicht. Ich brauche eine gedämpfte Kraft, dieser Luftwiderstand Dämpft aber auch "Quer" zur Kraft!

hectic hat Folgendes geschrieben:
Demnach frage ich mal lieber nach, was Benibaerenstark machen wollte bzw. letztendlich das Ziel ist. So kann man dann vielleicht auch besser helfen.


Na gut, ich habe mich darum gedrückt, weil ich echt nicht weiss, wie ich mein Problem verständlich beschreiben kann...ich versuche es nun trotzdem:


THEORIE:
Ich versuche eine einigermassen realistische Flugsimulation zu Programmieren. Daher verwende ich für die Simulation des Flugzeuges eine Physik Engine (Newton Game Dynamics Wrapper for Blitz3D von itmbin). Diese Physikengine simuliert mein Flugzeug perfekt: Kollisionen, Drehmoment, Schwimmen (es ist ein Wasserflugzeug)- ABER NUR BEIM ABSTURZ - dann nämlich, wenn sich das Flugzeug wie jedes beliebige andere Objekt durch den Raum bewegt, trudelt, kollidiert usw.

Was die Physikengine nicht berechnet sind dynamischer Auftrieb und die Strömungsstabilität durch die Tragflächen - sprich, den Flug. Ein Flugzeug bewegt sich nämlich durch seine spezielle Form nicht irgendwie durch die Luft (wie z.B. ein Tisch, der bei einer Explosion durch die Luft wirbelt) sondern Folgt ganz speziellen Regeln:

-Bei enstsprechender Geschwindigkeit (im Flug) entsteht durch die Antrömung von Tragflächen und Leitwerken eine enorme Rotationsstabilität- jegliche Rotation wird durch die Strömung umgehend gebremst. ->Dies setzte ich um, indem ich die "Rotationsdämpfung" im Flug sehr hoch einstelle.

*THEORIE WICHTIGSTER TEIL*
Nun zum Auftrieb, dem eigendlichen Problem:
Der dynamische Auftrieb ist eine Kraft, die bei genügend grosser Geschwindigkeit, durch die Strömung um die Tragflächen entsteht, und die Schwerkraft überwindet...aber nicht nur:

-im Rückenflug zieht er relativ betrachtet nach unten!
-der Auftrieb hält das Flugzeug in der Kurve in der Bahn ->zieht nach innen

Man sieht leicht: Der Auftrieb zieht nicht einfach nach oben! Wohin "zieht" er dann?

Ich glaube, dass (vereinfacht Betrachtet) der Auftrieb als die Kraft bezeichet werden kann, welche das Flugzeug in seiner Bahn hält. Fliegt das Flugzeug, verhält es sich wie auf einer Schiene, die durch die Längsachse geht. Der Auftrieb verhindert also grösstenteils das "Driften" durch die Luft. Oder anders ausgedrückt: Der Auftrieb versucht stehts die Winkeldifferenz zwischen Bewegungs- und Orientierungsvektor auszugleichen.

Da nicht alle oben genannten Phänomene alleine dem Auftrieb zuzuschreiben sind, verwende ich lieber den Ausdruck "Schienenkraft", welche alle diese Kräfte, inkl. Auftrieb zusammenfasst, und dafür sorgt, dass sich das Flugzeug nur auf seiner Längsachse bewegt.

Veranschaulichung: user posted image



PRAXIS:

Von der Physikengine kriege ich folgende Information:

-Masse des Flugzeuges
-Orientierung des Flugzeuges (Richtungsvektor)
-Geschwindigkeit des Flugzeuges (Bewegungsvektor)

Ich kann die Physiksimulation beeinflussen:
-Hinzufügen von Kräften zum Objekt
(-Hinzufügen von Drehmoment zum Objekt)

Ich glaube es müsste möglich sein, aus diesen Infos eine - sehrwahrscheinlich gedämpfte - Kraft zu errechnen, welche das Flugzeug auf seiner Längsachse stabilisiert. D.h: Sobald eine Winkeldifferenz zwischen Bewegungs- und Orientierungsvektor ist, wird die Bewegung so angepasst, dass die Beiden wieder übereinstimmen.

Mein Lösungsplan:
1. Gedämpfte Kraft 2D(nicht allgemeine Dämpfung) ->In ersten Versuchen wirkte die Schienenkraft wie ein Gummiseil, ja noch extremer, die Korrektur schoss über das Ziel hinaus, wurde stärker in die Gegenrichtung korrigiert, wieder mehr->die Masse zuckte immer unkontrollierter hin und her...

2a. Schienenkraft 2D: Hält die Masse bei seitlichem ziehen auf einer virtuellen, drehbaren, Schiene.

2b. Schienenkraft 2D: Steuerbares Flugzeug 2D

3. Umsetzung in 3D


So, ihr seht, es gibt noch einiges zu tun, ich hoffe ich kann auf eure Unterstützung zählen!! Bitte unterscheidet bei eurern Fragen / Krititk / Anregungen der verständlichkeit wegen
zwischen Theorie und Praxisteil...


herzlichen Dank im Voraus

Beni
3D Scanner selber bauen? -> www.bewe-3dscanner.ch.vu

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group