Kanonenkugel mit Physik

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

Vertex

Betreff: Kanonenkugel mit Physik

BeitragSo, Jan 16, 2011 1:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

aus Interesse würde ich gerne eine Kanonenkugel simulieren und zwar nicht, dass ich an a, b und c von ax² + bx + c so herumschraube, dass es gut aussieht, sondern mit Hilfe der Newtonsche Gesetze. Leider ist mein Wissen über Mechanik? da sehr begrenzt.

Ich habe irgendeine Kanonenkugel mit der Masse m und der Startposition p gegeben, und nun sollen die Folgepositionen berechnet werden. Die zwei einwirkenden Kräfte sollen die Gravitationskraft und ein Stoß, den man hoffentlich Impuls nennt, sein.

Erstmal der Blick auf das Trägheitsgesetz: Solange keine Kraft auf einen Körper wirkt, ändert sich auch nichts an seiner Geschwindigkeit. In Blitz irgendwie ausgedrückt als:
BlitzBasic: [AUSKLAPPEN]
; Position = Position + Velocity
VectorAdd(Position, Velocity, Position)


Dann hieß es im Physikunterricht, dass sich Kräfte (-vektoren) addieren, ähm Superpositionsprinzip, 4tes Gesetz. In dem Fall also die Schwerkraft und die Impulskraft:
BlitzBasic: [AUSKLAPPEN]
SetXY(Gravity, 0.0, -9.81) ; -9,81 m/s²
; Abschießen im 45° Winkel
SetXY(Impulse, 40, 40) ; ||Impulse|| = Sqrt(40² + 40²) N = 56 N
; Force = Gravity + Impulse
VectorAdd(Gravity, Impulse, Force)


Wobei der Impuls mal einen kurzen Augenblick auf die Kugel wirkt, nämlich dann, wenn das Schwarzpulver explodiert, sonst ist er (0,0).

Es folgt der Blick aufs zweite Gesetz: Die Änderung der Geschwindigkeit ist proportional zur einwirkenden Kraft. Ich kenne das als F = ma, Kraft = Masse * Beschleunigung (Acceleration, a). Stellt man das nach a um, kann man das ja hoffentlich so ausrechnen:
BlitzBasic: [AUSKLAPPEN]
; Acceleration = (Mass/||Force||)*Force
VectorScale(Force, Mass/VectorLength(Force), Acceleration)


Und schließlich ist die Beschleunigung eine Änderung der Geschwindigkeit:
BlitzBasic: [AUSKLAPPEN]
; Velocity = Velocity + Acceleration
VectorAdd(Velocity, Acceleration, Velocity)


Jetzt sehe ich aber schon das Problem, dass das mit Gravitation nicht so recht mit der Wirklichkeit übereinstimmt. Setze ich eine große Masse ein, dann verkleinert sich Beschleunigung (Acceleration = (Mass/||Force||)*Force). Aber schwerere Körper sollten doch schneller fallen. Im Wiederspruch zur Wahrnehmung steht dann noch, dass irgendwie alle Körper im Vakuum gleich schnell fallen (habe so ein Experiment leider noch nie gesehen). Da hier Luftwiderstand nicht berücksichtigt wird, sollte also die Fallgeschwindigkeit vollkommen unabhängig von der Masse sein. Hat da jemand eine Erklärung dazu?

Und dann noch das Szenario, wenn die Kugel gegen eine Wand abprallt. Das müsste ja das dritte Gesetz sein: Jede Kraft erzeugt eine entgegengerichtete Kraft, F' = -F. Wie hoch müsste die Kraft denn sein, wenn sich die Kugel mit v Geschindigkeit bewegt? Ist die einwirkende Kraft auf die Wand gleich v? Demzufolge würde auf die Kugel dann -v als Kraft einwirken, was zumindest das Abprallen in entgegengesetzter Richtung erklären würde.

Ciao Olli
vertex.dreamfall.at | GitHub

ToeB

BeitragSo, Jan 16, 2011 1:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würd es ganz einfach machen. Du nimmst die Masse als Beschleunigungs-Faktor. Das heißt, die Masse wird als Faktor für die Ab-/ oder Zunahme der Geschwindigkeit genommen. Da man in der Physik die Geschwindigkeit in richtig X und ich richtig Y Achse getrennt betrachten kann, sollte es nicht so schwer sein.
Code: [AUSKLAPPEN]
;Kugel Abfeuern, Beschleunig angeben :
Kugel\x = PX
Kugel\y = PY
Kugel\vx = Cos( Winkel ) * Impulse
Kugel\vy = Sin( Winkel ) * Impulse
Kugel\mass = 0.9

;Kugel bewegen
Kugel\x = Kugel\x + Kugel\vy
Kugel\y = Kugel\y + Kugel\vy
Kugel\vx = ( Kugel\vx - 0.01  )* Kugel\mass ;Seeeehr vereinfacht, Wahlweise kannst du noch Luftwiederstand einbauen
Kugel\vy = ( Kugel\vy + 0.981 - 0.01 ) * Kugel\mass


So sollte sie schön realistisch fliegen.

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Vertex

BeitragSo, Jan 16, 2011 1:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke! Das Ziel ist aber, die richtig Gesetze anzuwenden, und nicht die Formeln so hinzubiegen, dass es gut aussieht. Es sei denn, was ich aber nicht glaube, dass die Beschleunigung tatsählich mit der Masse multipliziert werden muss.
Hier mal so auf die Schnelle (Leertaste um Impuls auf die Kugel zu geben):

BlitzBasic: [AUSKLAPPEN]
Type TVector
Field X#
Field Y#
End Type

Function CreateVector.TVector(X#, Y#)
Local V.TVector = New TVector
SetXY(V, X, Y)
Return V
End Function

Function SetXY(V.TVector, X#, Y#)
V\X = X
V\Y = Y
End Function

Function AddVector(A.TVector, B.TVector, R.TVector)
R\X = A\X + B\X
R\Y = A\Y + B\Y
End Function

Function SubstractVector(A.TVector, B.TVector, R.TVector)
R\X = A\X - B\X
R\Y = A\Y - B\Y
End Function

Function ScaleVector(A.TVector, S#, R.TVector)
R\X = S*A\X
R\Y = S*A\Y
End Function

Function VectorLength#(V.TVector)
Return Sqr(V\X*V\X + V\Y*V\Y)
End Function

Function DrawVector(V.TVector)
Oval(V\X - 2, GraphicsHeight() - V\Y - 2, 5, 5)
End Function

Const TIME_SCALE# = 0.01

Global Mass# = 2.0 ; kg
Global Position.TVector = CreateVector(100, 400) ; m
Global Velocity.TVector = CreateVector(0.0, 0.0); m\s
Global ScaledVelocity.TVector = CreateVector(0.0, 0.0)
Global Force.TVector = CreateVector(0.0, 0.0)
Global Acceleration.TVector = CreateVector(0.0, 0.0)
Global Gravity.TVector = CreateVector(0.0, -9.81)
Global Impulse.TVector = CreateVector(0.0, 0.0)

Graphics(800, 600, 0, 2)
SetBuffer(BackBuffer())

While Not KeyDown(1)
If KeyHit(57) Then
SetXY(Impulse, 40.0, 40.0)
Else
SetXY(Impulse, 0.0, 0.0)
EndIf

; Gesamtkraft
AddVector(Gravity, Impulse, Force)

; Beschleunigung
ScaleVector(Force, VectorLength(Force)/Mass, Acceleration)
AddVector(Velocity, Acceleration, Velocity)
ScaleVector(Velocity, TIME_SCALE, ScaledVelocity)

; Neuer Ort
AddVector(Position, ScaledVelocity, Position)

Cls()
DrawVector(Position)
Flip()
Wend

End()


Wird eine größere Masse eingesetzt, fliegt die Kugel viel langsamer in den Abgrund.
vertex.dreamfall.at | GitHub

Xeres

Moderator

BeitragSo, Jan 16, 2011 1:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Aber schwerere Körper sollten doch schneller fallen.
Sollten sie nicht, und tun sie auch nicht. Ohne Luftwiderstand fallen zwei Objekte exakt gleich schnell.
Große Masse -> viel Gravitationskraft um viel Masse zu bewegen.
Kleine Masse -> wenig Gravitationskraft um wenig Masse zu bewegen.

Nachtrag: Gravity - Sixty Symbols (youtube, englisch)

Zitat:
Wie hoch müsste die Kraft denn sein, wenn sich die Kugel mit v Geschindigkeit bewegt?
...und gegen eine Wand prallt, wobei sie 100% Bewegungsenergie ab gibt, und nicht abprallt.
F = (m * v)/t - Impuls pro Zeit
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Vertex

BeitragSo, Jan 16, 2011 2:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh, ich glaube, ich hab's verstanden. Also die Gravitationskraft ist laut Wiki G = m*g, wobei g die "Schwerebeschleunigung" ist, hier auf der Erde irgendwie 9,81 m/s². Würde jetzt nur die Gravitationskraft auf die Kugel einwirken, ergibt sich die Beschleunigung aus a = F/m = (m*g)/m = g. Die Masse kürzt sich also weg, und alle Körper fallen gleich schnell herunter (hatte toeb irgendwie doch recht). Wie gesagt, ich habe nie das Experiment gesehen, aber es liegt am Luftwiderstand, dass eine Feder langsamer fällt, als eine Bowlingkugel? Wobei ich mir nicht richtig vorstellen kann, dass eine Storyporkugel mit dem selben Radius wie eine Bowlingkugel mit gleicher Geschwindigkeit wie die Bowlingkugel fällt (in dem Fall haben sie doch mit dem gleichen Luftwiderstand zu kämpfen, oder?)

Korrigiert heißt es:
BlitzBasic: [AUSKLAPPEN]
While Not KeyDown(1)
If KeyHit(57) Then
SetXY(Impulse, 12000.0, 12000.0)
Else
SetXY(Impulse, 0.0, 0.0)
EndIf

; Gravitationskraft
SetXY(Gravity, 0.0, -9.81)
ScaleVector(Gravity, Mass, Gravity)

; Gesamtkraft
AddVector(Gravity, Impulse, Force)

; Beschleunigung
ScaleVector(Force, 1.0/Mass, Acceleration)
AddVector(Velocity, Acceleration, Velocity)
ScaleVector(Velocity, TIME_SCALE, ScaledVelocity)

; Neuer Ort
AddVector(Position, ScaledVelocity, Position)

Cls()
DrawVector(Position)
Flip()
Wend


(hatte noch ein Fehler, statts ScaleVector(Force, VectorLength(Force)/Mass), Acceleration) muss es natürlich ScaleVector(Force, 1.0/Mass), Acceleration) heißen.
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am So, Jan 16, 2011 2:16, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSo, Jan 16, 2011 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
"Gesunder Menschenverstand" ist für Wissenschaft nun mal total irrelevant - Es zählt was experimentell ermittelt wird: Hammer vs Feather - Physics on the Moon (youtube, englisch)

Ich bin mir nicht 100%ig sicher, aber ich glaube nicht, das du die Vektoren da einfach addieren kannst. Du vermischst damit Total verschiedene Einheiten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ToeB

BeitragSo, Jan 16, 2011 2:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Prinzip beschreibst du mit meinem Code die Flugbahn, in der Physik wird nichts anderes getan, außer das die Zeit noch mit reingenommen wird, anstatt die Positionen per Vektor zu verschieben (pro Frame).

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Vertex

BeitragSo, Jan 16, 2011 2:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Cooles Video Smile
Meine Auffassung ist, dass man beim Geschwindigkeitsvektor (x,y) dann eine geschwindigkeit von ||(x,y)|| m/s hat und (x,y)/||(x,y)|| (normierter Vektor der Länge 1) die Richtung, die ja dann Einheitslos wird. Gleiches für die Kraft in ||(x,y)|| N (Newton).

Ähm ja, Einheitsmäßig auf den Code angewandt:
BlitzBasic: [AUSKLAPPEN]
SetXY(Gravity, 0.0, -9.81) ; [m/s²]
ScaleVector(Gravity, Mass, Gravity) ; [kg * m/s² = kg*m/s² = N]
AddVector(Gravity, Impulse, Force); [N = N + N]
ScaleVector(Force, 1.0/Mass, Acceleration) ; [N * (1/kg) = kg*m/s² / kg = m/s²]
AddVector(Velocity, Acceleration, Velocity) ; [m/s + m/s² = m/s ?]
AddVector(Position, ScaledVelocity, Position) ; [m + m/s = m?]

Also bei den letzten beiden habe ich auch keine Erklärung (vllt. irgendwie noch die Zeit reinpfuschen?)
vertex.dreamfall.at | GitHub

Xeres

Moderator

BeitragSo, Jan 16, 2011 2:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Acceleration und ScaledVelocity müssen mit einer Zeit in s Multipliziert werden, da das Programm per Frame arbeitet - bau am besten noch einen Timer ein - wären das denn eben z.B. 1/60 = 0,01667 Sekunden per Funktionsaufruf.

Edit: Nicht teilen...

Edit2:
Das hier kann nicht sein:
Code: [AUSKLAPPEN]
ScaleVector(Gravity, Mass, Gravity) ; [kg * m/s² = kg*m/s² = N]
Gravity kann nicht Beschleunigung und Kraft gleichzeitig sein.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ComNik

BeitragSo, Jan 16, 2011 3:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Sry es wird an der Uhrzeit liegen aber ich blick deinen Code grad nich zu 100% deswegen verzeih wenn ich was poste was schon längst klar ist:

Also das Problem scheint doch zu sein, dass die Kugel nicht richtig von Gravitation und Anfangs Impul beeinflusst werden, oder? (Hab ich das wenigstens verstanden :/...?)

Gut du brauchst um einen Körper physikalisch zu simulieren als minimum:
-> Positionsvektor
-> Geschwindigkeitsvektor
-> Beschleunigungsvektor (nicht 100% notwendig aber sehr erleichternd für die Übersicht)
-> Gesamtwirkende Kraft, ebenfalls ein Vektor
-> Masse

So.

Wenn du die Kugel feuerst würde ich ihr einfach eine Geschwindigkeit verpassen (anstatt mit einem Impuls eine unnötige Division mit reinzubringen). Jetzt ist übrigens ein kleines Problem nicht unbeachtet zu lassen: Im PC sieht immer alles anders aus wenn du "Real-World" Werte nimmst. Also sagen wir du simulierst eine echte Kanone die vllt eine Kugel auf 10 m/s (?) beschleunigt und gibst der Kugel eine Masse von sagen wir 50 kg (weil son Ding wiegt ja in Echt).

Die Simulation wird trotz der realistischen Werte eventuell falsch aussehen. Da gibt es einige Umrechnungsformeln um das Gewicht der Geschwindigkeit anzupassen, etc.. die könnte ich bei Bedarf hervorkramen...


Ok. Jetzt wie ich glaube meine Vorredner schon gesagt haben:

1. Beschleunigungsvektor auf (0,0.981) setzen.
Auch mit der Gravitation wirst du unendliche tweaking probleme kriegen, die verhält sich nämlich alles andere als so wie ihr echtes Vorbild -.-
Spiele nutzen soweit ich informiert bin eine Gravitation von etwa 15 - 20 Einheiten / Frame. Allerdings kann ich aus eigener Erfahrung sagen das du das selber herausfinden musst Razz

2. Wenn du wirklich mit einem Impuls (= Kraft über unendlich kleines Zeitintervall) anfangen willst, so errechnest du die Kraft, teilst sie durch die Masse (oder natürlich * invMass) und addierst das ganze zum Beschleunigungsvektor.

3. Geschwindigkeitsvektor:+ Beschleunigungsvektor * 1/60.0 (mit fixem timestep eben)

4. Positionsvektor:+ Geschwindigkeitsvektor * 1/60.0

Wie gesagt der Trick liegt im richtigen anpassen der Variablen. Eine Simulation mit Werten aus der Realität wirst du mit einfacher Euler Integration nicht hinbekommen.

Ich bin nicht allwissend, aber das ist mein Kentnissstand.

So, sollte ich alles was die Leute vor mir gesagt haben nochmal aufgelistet haben dann geh ich mich jetzt verbuddeln -.-

Eine schöne Nacht noch...
WIP: Vorx.Engine

Vertex

BeitragSo, Jan 16, 2011 13:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Euch beiden!

@Xeres: OK, ich habe das anscheinend Gewichtskraft und Fallbeschleunigung durcheinander gebracht. Also Geschwichtskraft = Schwerebeschleunigung * Masse, G = m*g mit g = 9,81 m/s².
BlitzBasic: [AUSKLAPPEN]
SetXY(0.0, -9.81, GravitationalAcceleration) ; Fallbeschleunigung [m/s²]
...
VectorScale(GravitationalAcceleration, Mass, Weight) ; Gewichtskraft = Fallbeschleunigung*Masse [m\s² * kg = N]

Jetzt stimmen die Einheiten.

@ComNik: Mit Deiner Zutatenliste aus Positionsvektor, Geschwindigkeitsvektor etc. komme ich klar aber den Text danach nicht.
1. "Beschleunigungsvektor auf (0,0.981)" setzen. Ist das nur ein Vertipper? Also ich würde gerne in m/s² rechnen. Mit "15 - 20 Einheiten/Frame" kann ich ebenfalls nichts anfangen.
2. Genau, das mache ich auch, bloß dass ich alle Kräfte, hier Gewichtskraft und Impulskraft, zusammenaddiere und mit 1/m multipliziere. Statts also a' = a + Impuls/m mache ich a' = (Gewichtskraft + Impuls)/m
3. Was sollen die "1/60" bedeuten? Einheitsmäßig stimmt das ja auch nicht: v = v + a * 1/60 [m/s = m/s + m/s²]
4. das gleiche, oder soll "1/60" eigentlich "1/60s" heißen?

Vielleicht sollten wir es noch etwas einfacher machen. Wir lassen mal die Kräfte und Beschleunigung weg, und betrachten nur die Trägheit, also Position und Geschwindigkeit:
BlitzBasic: [AUSKLAPPEN]
; Die Vektorfunktionen AddVector etc. sind oben schon beschrieben
Global Position.TVector = CreateVector(30, 30)
Global Velocity.TVector = CreateVector(10, 0)

Graphics(800, 600, 0, 2)
SetBuffer(BackBuffer())

While Not KeyDown(1)
; Position := Position + Velocity [m <> m + m/s]
AddVector(Position, Velocity, Position)

Cls()
DrawVector(Position)
Flip()
Wend

End

Also hier steht ein Pixel für einen Meter und vermutlich vertreicht eine Sekunde pro Frame. Aber Einheitsmäßig stimmt ja AddVector(Position, Velocity, Position) also [m = m + m/s] nicht. Wo liegt der Denkfehler?

Ciao Olli
vertex.dreamfall.at | GitHub

Xeres

Moderator

BeitragSo, Jan 16, 2011 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Siehe ComNiks und meinen letzten Post: Du musst Zeit verstreichen lassen. Geschwindigkeit*Zeit = Strecke.
Wenn du festlegst, dass 1 Frame = 1 s ist, müsstest du Velocity * 1s "Rechnen" - für jede andere Skalierung des Zeitlichen Verlaufs, z.B. die real vergehende Zeit von 1/60s per Frame, musst du eben diese Zeit einrechnen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Vertex

BeitragSo, Jan 16, 2011 14:15
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, ich glaube, ich habs für die Geschwindigkeit:
Offenbar wird die Position immer mit r bezeichnet. Als Funktion der Zeit t: r(t) = Integrate v(t) dt und wenn, wie hier, die Anfangsposition r0 gegeben ist, und zu jedem Zeitpunkt die Geschwindigkeit v(t) = 10 m/s dann ergibt das r(t) = Integrate 10 m/s dt = 10 m/s * t + r0.

r0 ist hier immer die Position im letzten Frame, und t = 1s und dann stimmen die Einheiten auch.
vertex.dreamfall.at | GitHub

Vertex

BeitragMo, Jan 17, 2011 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Also die simulierte Flugbahn ist auf alle Fälle eine Parabel, ich habe bloß noch Zweifel, ob sie richtig ist. Ich denke nämlich, dass er beim Übergang von Zeitpunkt ti zu ti+1 folgendes rechnet: r(ti + 1) = r(ti) + v(ti)*(ti+1 - ti). Es wird also zum Zeitpunkt ti eine Tangende angelegt und nicht der eigentlichen Kurve, sondern der Tangente gefolgt. Das sieht zwar aus wie eine Parabel, beschreibt aber nicht die korrekte Flugbahn.

Deswegen möchte ich die Funktion mal mathematisch bestimmen, wobei ich dazu sagen muss, dass ich kein Mathefreak bin:
user posted image
Um an r(t) heranzukommen, muss man ja a(t) und dann v(t) integrieren. Doch wegen des Impulses zum Zeitpunkt t = 0 habe ich null Ahnung das Ding zu integrieren. Mir schweben da Sprungfunktion und uneigentliches Integral im Kopf, wobei ja keine Fläche sondern eine Funktion herauskommen soll. Habt Ihr einen Ansatz das Integral zu lösen?

Ciao Olli
vertex.dreamfall.at | GitHub
  • Zuletzt bearbeitet von Vertex am Mo, Jan 17, 2011 22:23, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Jan 17, 2011 22:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Schaff dir eine Formelsammlung an!
Würfe -> schräger Wurf
Code: [AUSKLAPPEN]
x = v_0 * t
y = v_0 * t * sin(alpha) - g/2 * t²

Wurfparabel:
Code: [AUSKLAPPEN]
y = tan(alpha) * x - g/(2 * v²_0 * cos²(alpha)) * x²

mit alpha = Abwurfwinkel
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Vertex

BeitragMo, Jan 17, 2011 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Formel! Da meine Kanonenkugel zu Anfang eine Geschwindigkeit von 0 m/s haben soll, kann ich wohl in der Formel v_0 = a_0 setzen (die Einheiten stimmen dann aber nicht m/s vs. m/s²)? Den Winkel bekomme ich schon ausgerechnet.

Jedoch geht's mir nicht direkt darum, eine Wurfbahn zu berechnen (die man mit Deiner Formel auch sehr einfach hinbekommt), sondern um die Hintergründe zu verstehen. Was ist bspw., wenn zwei Kugel mitten in der Luft zusammenprallen etc. dann muss man schon wieder auf die Newtonschen Gesetze zurückgreifen.

Ciao Olli
vertex.dreamfall.at | GitHub

Xeres

Moderator

BeitragMo, Jan 17, 2011 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Impuls ist nicht viel anders als eine Anfangsgeschwindigkeit (der Kugel einen Stoß geben ist ja ein Impuls), da p = m*v, also v_0 = p/m.

Zitat:
Was ist bspw., wenn zwei Kugel mitten in der Luft zusammenprallen
... Dann blättert man auf "unelastische und elastische Stöße" um Wink

Deine Formeln lassen sich übrigens recht leicht integrieren...

Edit:
Code: [AUSKLAPPEN]
a(t=0) = F/m

Erstmal: Zum Zeitpunkt t=0 wirkt keine Gravitationskraft, nur der Impuls.
Impulskraft = m * v * t
Impuls = m * v
Die Masse ist Konstant (sollte auch klar sein), und wird vor das Integral gezogen.
Code: [AUSKLAPPEN]
1/m * S F dt = 1/m * m * v + c = v + v_0

Gleiches kann man für die Gravitationskraft machen.
v - Geschwindigkeit durch den Impuls
v_0 - Geschwindigkeit die das Objekt ggf. vorher hatte.

Edit2: Natürlich wirkt die Gravitationskraft immer... Embarassed

Edit3: Der Grund meiner Verwirrung ist einfach:
Impulskraft = m * v / t = m * a
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
  • Zuletzt bearbeitet von Xeres am Mo, Jan 17, 2011 23:46, insgesamt 2-mal bearbeitet
 

BIG BUG

BeitragMo, Jan 17, 2011 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Wobei ich mir nicht richtig vorstellen kann, dass eine Storyporkugel mit dem selben Radius wie eine Bowlingkugel mit gleicher Geschwindigkeit wie die Bowlingkugel fällt (in dem Fall haben sie doch mit dem gleichen Luftwiderstand zu kämpfen, oder?)

Ja, nur die Bowlingkugel hat mehr Masse und kann die Luft daher leichter verdrängen, so dass diese schneller am Boden ankommen würde.
Das ist im Prinzip wie wenn Du die Kugeln ins Wasser fallen lassen würdest. Die Styroporkugel wäre hier im Verhältnis gar so leicht, dass sie nicht mal untergehen würde.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Vertex

BeitragSa, Jan 22, 2011 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Euch beiden!

@BIG BUG: Das erste, was ich zum Luftwiderstand gefunden habe ist das Gesetz von Stokes. Da ist die Reibungskraft abhängig vom Radius, der Viskosität des Fluids (hier Luft) und der Geschwindigkeit des Partikels (was hoffentlich auch auf größere Gegenstände, wie eine Bowlingkugel, sich beziehen lässt). Da aber jede Kraft F eine entgegengesetzte Kraft -F hervorbringt, und diese mit -F/m dann auf den Körper einwirkt, könnte man sich vorstellen, dass die Masse eine Rolle spielt.

@Xeres: Das, was ich mit "Impuls" bezeichnet habe, meinte ich die Kraft, die vdurch das Schwarzpulver wirkt. Nun ging ich davon aus, das der Impuls eine Kraft ist, die in unendlich kleiner Zeit auf den Körper wirkt. Ich glaube, die Physiker würden die Schwarzpulverexplosion aber als "kraftstoß" bezeichnen. Ein Kraftstoß ist eine Kraft, die innerhalb einer bestimmten Zeit auf einen Körper wirkt.

Die Formel mit Berücksichtigung des Kraftstoßes:
- F(t) ist die Gesamtkraft, die auf den Körper wirkt
- G ist die Schwerkraft (konstant)
- Fe ist die Kraft der Explosion (konstant)
- te ist die Zeitspanne, in der die Explosionskraft auf den Körper wirkt

wir haben also F(t <= te) = G + Fe und F(t > te) = G oder als Graph:
Code: [AUSKLAPPEN]
F(t) ^
     |....              (G + Fe)
     |
     |
     |    ............. (G)
     |
     |
     +----+------------>
     0    te           t


Wie gehabt ist die Beschleunigung a(t) = F(t)/m
und die Geschwindigkeit ist v(t) = Integrate a(t) dt = Integrate F(t)/m dt = 1/m Integrate F(t) dt
Hier ist jetzt das Problem F(t) zu integrieren, denn im Graph sieht man ja, dass F(t) eine Art Rechteckkurve ist. Vermutlich müsste man eine Art Fourier-Reihe entwickeln, um die Kurve mit unendlich vielen Sinus-Termen zu beschreiben und man dann diese Sinus-Terme integriert.

Ciao Olli
vertex.dreamfall.at | GitHub

Xeres

Moderator

BeitragSo, Jan 23, 2011 0:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht ganz interessant für dich:
Java-Applett + Formeln in PDF darunter
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group