Einfachste Kräftephysik
Übersicht

![]() |
pixelshooterBetreff: Einfachste Kräftephysik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also: Es gilt ja v=F/m*t (v=Geschwindigkeit, F = kraft, m = masse, t = Zeitals Proportionale Zuordnung, od? Jetzt würde ich gerne einen Körper anhand einer Kraft beschleunigen: In jedem durchlauf der schleife steht die durchlaufzeit zur Verfügung (ich möchte Frameunabhängig). Wie muss ich die Komponenten jetz verrechnen? Da hakts bei mir.... Am Ende soll der Wert v bzw der Wert, um den Ich v erhöhen muss herauskommen. Kann man mich vertehen? | ||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
Bura.Tino |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast die Formel doch schon richtig erkannt. Wo genau ist denn Dein Problem ? | ||
![]() ![]() |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
t ist in diesem Falle keine Zeit sondern der Framefaktor ( Tickfaktor) also 1.0 / FramesProSekunde.
Ansonsten hast du dort alles was du brauchst, einfach die Variablen als Floats deklarieren. ~VERSCHOBEN~ falsches Board Dreamora |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
weil ich ja nich die ganze zeit gleich beschleunige, hab ich das so gelöst:
Code: [AUSKLAPPEN] speed = speed + time / 1000 / masse * drehzahl
stimmt das denn so? time is die Zeit, die für diesen durchlauf der schleife vergangen ist (in ms) |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alle Animationen werden mit time multipliziert. Das heisst: Die Millisekunden die ein Schleifendurchlauf benötigt, wird mit der Animationsgeschwindigkeit verechnet. Also Geschwindigkeit*time. Dadurch bewegt sich schon ein Objekt auf allen Rechnern gleich schnell, wenn es eine vorgegeben Geschwindigkeit hat. Zudem sollte die Beschleunigung auch mit time multipliziert werden, da weniger Schleifendurchläufe pro Zeit zur Verfügung stehen. Also If KeyDown (xyz) Then Speed=Speed+1*time...
time muss jeden Schleifendurchlauf neu 'berechnet' werden. |
||
![]() |
Smily |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man kann aber auch einfach nur Createtimer und Waittimer verwenden ^^ | ||
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets "Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!" stummi.org |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
jup, nur erkenn ich keine großen unterschied zwischen Dreamoras und meinem...Oder machts sogar das gleiche? ![]() |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, ich erf das alles noch mal über den Haufen: Das alles gilt ja nur für den Fall, dass der Vektor, der die richtung der Kraft bestimmt, ausgehend vom Agriffspunkt durch den schwerpunkt des anzugreifenden Objektes geht (Bzw. eine Halbgerade mit dem Ursprung des Angriffspunktes und der Richtung des Vektors). Aber was mach ich wenn die Kraft in eine andere Richtung angreift? | ||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo pixelshooter, ich verstehe all deine Anfragen nur halb. Aber vielleicht hillft das ja:
xp#=100 ;X-Position yp#=100 ;Y-Position rp#=0 ;Rotationsposition xg#=0 ;X-Geschwindigkeit yg#=0 ;Y-Geschwindigkeit rg#=0 ;Rotationsgeschwindigkeit AnfangSchleife If KeyDown(203) rg=rg-.1 ;Allmälich nach links drehen If KeyDown(205) rg=rg+.1 ;Allmälich nach rechts drehen If KeyDown(200) xg=xg+cos(rp)*.1:yg=yg+sin(rp)*.1 ;Beschleunigen xg=xg*.999 ;Sowas wie ein Luftwiederstand yg=yg*.999 ;Sowas wie ein Luftwiederstand rg=rg*.999 ;Sowas wie ein Luftwiederstand xp=xp+xg ;Geschwindigkeitszuweisung an Position yp=yp+yg ;Geschwindigkeitszuweisung an Position rp=rp+rg ;Rotationsgesch.zuweisung an Rotationsposition Line xp,yp,xp+cos(rp)*10,yp+sin(rp)*10 ;Zeichen Flip Cls EndeSchleife Die Beschleunigungskräfte können in alle Richtungen ausgehen. |
||
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
? ich versuchs mal zu erklären:
So is ja einfach (Der Pfeil is ne Kraft, S is der Massenschwerpunkt):Code: [AUSKLAPPEN] ------- | | | S---|----> | | ------- weil die Kraft geht durch den schwerpunkt. das schaff ich auch. aber was wenn Code: [AUSKLAPPEN] ------- | | | S | | | -------------> ? Wie verhält sich der Würfel (klar, er dreht sich XD, aber wie?)[/code] |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dafür fallen mir zwei Möglichkeiten ein:
1.) Erstelle zu jedem Objekt drei oder vier Bezugspunkte (also drei oder vier Positionen und Geschwindigkeiten) die durch eine Funktion ständig zusammen gehalten werden. Siehe dazu 2D https://www.blitzforum.de/foru...hp?t=19846 oder in 3D https://www.blitzforum.de/foru...hp?t=20596 . diese Methode zieht allerdings ein wenig mehr Programmieraufwand mit sich. Ist aber sehr realistisch und flexibel, wenn man mal mehr als nur bewegen möchte. 2.) Siehe dazu https://www.blitzforum.de/foru...hp?t=20822 Der Anhänger verhält sich ähnlich wie dein beschriebener Würfel. Dazu musst du den Angriffspunkt von der Mitte berücksichtigen und den Maximalradius des Körpers mit einbeziehen. Jeder Körper enthält dann eine Position, Geschwindigkeit, Rotationsposition und Rotationsgeschwindigkeit. Kommt es zu einer Kollision, muss wieder alles neu berechnet werden. Also Drallaufkommen und Umwandlung dieser wieder in Bewegungsenergie und umgekehrt... Dieses Beispiel angewand in frei schwebende Körper kann zu einer Variablenjongliererei enden aber machbar. Habe mein ersten Thrust-clon auch auf diese Weise gelöst. Beide Möglichkeiten lassen sich im 3D-Modus besser lösen, als es rein unter 2D, da hier auf gerade zurecht kommende CollisionNX/NY für 2D und CollisionNX/NY/NZ-Koordinaten sehr Nutzbar sind. Wird auf Kollision verzichtet, so bleibt es dann gleich. |
||
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke dass du dich um mich bemühst. Geplant hatte ich folgendes:
Code: [AUSKLAPPEN] -------
| | <--| S | | | ------ die Kraftquelle soll eine Art Düse o.ä. sein, die sich zur steuerung drehen lässt. mal gucken wie ich deine Sachen umsetze. Gr Thx. |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Da ich gestern noch nicht wusste, was genau du machen willst stelle ich jetzt mal folgenden Code zur Verfügung:
Code: [AUSKLAPPEN] Graphics 400,400,0,2
SetBuffer BackBuffer() ClsColor 255,255,255 Color 0,0,0 mxp#=0 ;Masse-X-Position myp#=0 ;Masse-Y-Position fxp#=0 ;Führer-X-Position (Maus) fyp#=0 ;Führer-Y-Position (Maus) wk#=0 ;Winkel ;HAUPTSCHLEIFE While Not KeyHit(1) fxp=MouseX() fyp=MouseY() wk=(ATan2(myp-fyp,mxp-fxp)+360)Mod 360 mxp=fxp+Cos(wk)*40 myp=fyp+Sin(wk)*40 ;Stange zeichnen Line fxp,fyp,mxp,myp ;Masse zeichnen Oval mxp-3,myp-3,7,7,0 ;Würfel zusammenstellen Line mxp-myp+fyp,myp+mxp-fxp,fxp,fyp Line mxp+myp-fyp,myp-mxp+fxp,fxp,fyp Line mxp-myp+fyp,myp+mxp-fxp,mxp+mxp-fxp,myp+myp-fyp Line mxp+myp-fyp,myp-mxp+fxp,mxp+mxp-fxp,myp+myp-fyp ;Führer zeichnen Oval fxp-3,fyp-3,7,7,1 Flip Cls Wend End Für dein Zweck muß die Kraft in Beschleunigung umgewandelt werden und zusätzlich noch eine Rotationsposition und Rotationsgeschwindigkeit. Aber ich denke das es kein Problem sein sollte. |
||
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
lol^^ sieht schön aus wie du den würfel drehst^^. 3d hätts auch getan^^. Die Beschleunigung kann ich ja ausrechnen. Die Rotation ginge auch, wenn ich an das Trägheitsmoment käme. Naja, werd mich mal dran machen deinen Code umzusetzen...vielen dank!! | ||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Trägheit ist programmiertechnisch nichts anderes als eine Variable zum Vektor hinzu zu addieren. Also: Geschwindigkeit = Geschwindigkeit + Beschleunigung : Position = Position + Geschwindigkeit. Das gild auch beim Drehmoment: Rotationsgeschwindigkeit = Rotationsgeschwindigkeit + Rotationsbeschleunigung : Rotationsposition = Rotationsposition + Rotationsgeschwindigkeit. | ||
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja, dein code sieht ja einigermaßen echt aus (auch wenn ich mich mit reallife net so auskenne^^). Mal gucken. Siehst ja wenn ich wieder net checke.
Edit: Ok, tut mir ja leid, aber ich steh völlig auf den schlauch ![]() Code: [AUSKLAPPEN] alttime = MilliSecs()
Repeat update_fps() ms = MilliSecs() time# = MS - alttime alttime = MS If KeyDown (200) Then drehzahl = drehzahl + 100 ElseIf KeyDown(208) Then drehzahl = drehzahl - 200 Else drehzahl = drehzahl / 1.1 If KeyDown (203) Then TurnEntity antrieb,0,-1,0 ElseIf KeyDown(205) Then TurnEntity antrieb,0,1,0 speed = speed + ((1 / fps) / masse) * drehzahl MoveEntity player,0,0,speed * time / 1000 UpdateWorld RenderWorld Text 0,0,"1" Text 50*StringWidth("|"),0,50 Locate 0,10 For i = 1 To fps Write "|" Next Text 0,40,"Drehzahl: " + Drehzahl Text 0,30,"Geschwindigkeit: " + speed Flip Forever |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Muß ich jetzt alles 'vorkauen'? Du lernst am besten, wenn du dir das selbst erarbeitest. Nur sollten einige Dinge beachtet werden:
Einfachste Möglichkeit: Antrieb steht parallel zum Raumschiff, dann geht 100% der Kraft in Bewegung über und zwar in Gegenrichtung des Schubs. Antrieb steht im 90° Winkel zum Raumschiff, dann geht 100% der Kraft in Rotation über... Dieses ist nicht ganz realistisch, aber am besten spielbar, da vom Spieler am besten kalkulierbar. Die Fehlberechnung zur Realität ist nur minimal... Nicht ganz so einfache Möglichkeit: Antrieb steht parallel zum Raumschiff, dann geht 100% der Kraft in Bewegung über. Wie oben auch. Antrieb steht im 90° Winkel zum Raumschiff, dann muß folgendes beachtet werden: Wie weit ist die Düse von der Raumschiffmitte (Massemittelpunkt) entfernt und wie groß ist der Raumschiffradius, wenn das Raumschiff eine runde Scheibe währe wo jegliche Masse gleichmässig verteilt ist. Dazu könnte man ql:Tan benutzen um das auszurechnen. Der Mehraufwand bliebe mir unbegründet, auch dann, wenn ich ein Freund der 'Physik im Spiel' bin. Zur einfachen Möglichkeit: Das Verhältnis Schub/Drehen lässt sich ausrechnen. Dazu steht dann: Schubvektor=cos(winkelraumschiff-winkeldüse)*schubkraft drehmoment=Sin(winkelraumschiff-winkeldüse)*schubkraft XSpeed=XSpeed+cos(winkelraumschiff)*schubvektor YSpeed=YSpeed+sin(winkelraumschiff)*schubvektor Rotation=Rotation+drehmoment Bin wieder im Internetcafê, kann also nichts ausprobieren. Also keine Gewähr... edit1: Locate 0,10 For i = 1 To fps Write "|" Next geht auch Rect 0,10,fps*10,10,1 |
||
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vieelen dank ![]() Aber muss es nicht heißen Drehmoment=Sin(Winkel)*Schubraft*Distanz(Schwerpunkt,Angriffspunkt)? Naja, das Hauptproblem an dem ich hänge is ja leider, wie ich das Trägheitsmoment ausrechne. Das einzige was ich immer höre, is:"Das kann man nicht so leicht ausrechnen". Kannst du mir dabei vllt noch helfen? |
||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe ja auch die einfache Möglichkeit beschrieben. Diese sollte für jedes Spiel reichen. Es gibt kein Spiel das absolut realistisch ist. Mal als Beispiel:
- CS, Lauftempo = 30km/h ?!?, Beschleunigung auf 30km/h in einer halben Sekunde und man kann 10min in diesem Tempo laufen, ohne aus der Puste zu kommen. Eine Verwundung bis auch 1%-Lebenspunkte machen den Spieler nicht träger, obwohl er schon lange in Ohnmacht fallen müsste etc. etc... - Rennspiele jeglicher Art. Man fährt mit über 200km/h gegen die Leitplanke und nichts weiter passiert. Probier das mal in der Realität. Schleudern unvorhersehbares Verhalten des Fahrzeugs ist das Ergebnis. Du kannst übrigens (falls es ein Raumschiffspiel sein soll) die Distanz des Triebwerks als Konstante speichern und jegliches Verhältnis zwischen Schubkraft und Drehmoment so festlegen. Wie genau die nicht so einfache Möglichkeit ausgerechnet wird, kann ich jetzt so auf anhieb nicht sagen. Dazu müsste ich mich am Rechner setzten und selber ein bischen rumtüfteln. Wenn du aber generell die Physikalischen Grundvorraussetzungen erstellst (Beispiel: Physik 4WD Buggy in 2D) so kannst du dir das alles sparen, da dann alles realistischer funktioniert, als man es per Variablen überhaupt ausrechnen könnte. Das Buggy-Beispiel bringt allerdings auch einige Schwirigkeiten mit sich, wenn man Images unterbringen möchte. Um jetzt mal auf den Punkt zu kommen. Ich denke mal, das ausrechnen der Distanz und deren Verhältnisse müsste mit Tan gehen. Aber wie gesagt. Ich würde dir zur einfachen Möglichkeit raten. Das Minimum an Unterschied wird man beim Spielen nicht bemerken. Oder anders, probier mal erst die einfache Möglichkeit und programmiere das Spiel zu Ende. Wenn es dann soweit ist und du immernoch es lieber realistischer haben willst, so kann der winzig kleine Codeabschnitt ja noch ergänzt werden. Ich kann ja mal die Tage ein kleines Beispiel erstellen und es hier rein stellen. Nur solltest du es dann auch verstehen und nicht einfach übernehmen. PS: In der Schule wirst du es so nie lernen. Zwar kommt Drehmoment irgendwann mal oder du hattest es schon. Keine Ahnung. Aber es wird nicht so sein, das man es auf der ~Programmierebene~ auch so übernehmen kann. |
||
![]() |
pixelshooter |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke, hectic. Bis jetz hab ich ja noch alles einigermaßen verstanden...(sry dass ich das alles hier fragen musste aber schule is in dem punkt echt zu vergessen wie du sagtest). Wenn ich dann fertig bin und nochmal probs hab wirst du vllt von mir hören. Vielen Dank | ||
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group