Kräftesimulation - Dämpfung
Übersicht

![]() |
BenibaerenstarkBetreff: Kräftesimulation - Dämpfung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
.95 ist aber ein hartes Gummi ^^, aber verdammt cool. | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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)) |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: ![]() 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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group