Einfachste Kräftephysik

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

pixelshooter

Betreff: Einfachste Kräftephysik

BeitragSa, Dez 02, 2006 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 02, 2006 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast die Formel doch schon richtig erkannt. Wo genau ist denn Dein Problem ?
Rolling Eyes <- Ich liebe dieses Smilie ! Very Happy
 

Dreamora

BeitragSa, Dez 02, 2006 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 02, 2006 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Dez 02, 2006 20:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 02, 2006 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSa, Dez 02, 2006 20:48
Antworten mit Zitat
Benutzer-Profile anzeigen
jup, nur erkenn ich keine großen unterschied zwischen Dreamoras und meinem...Oder machts sogar das gleiche? Shocked
>> Musikerstellung, Grafik und Design: http://www.pixelshooter.net.tc

pixelshooter

BeitragSa, Dez 02, 2006 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Dez 03, 2006 19:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 03, 2006 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
? 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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Dez 03, 2006 20:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 03, 2006 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 04, 2006 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 04, 2006 18:26
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 04, 2006 18:31
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Dez 04, 2006 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Embarassed . Wie bau ich das da ein:
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Dez 05, 2006 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Dez 05, 2006 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Vieelen dank Very Happy . Ich hab davon leider noch net so viel ahnung weil in Klasse 9 lernt man davon noch nix.
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Dez 06, 2006 18:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Dez 06, 2006 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group