Entwickler-Ecke
Sonstiges (Delphi) - Reibung
F34r0fTh3D4rk - Mi 20.08.08 10:08
Titel: Reibung
Hallo,
Ich möchte für ein Spiel Reibung implementieren. Ich möchte eigentlich keinen Unterschied zwischen Luft und Bodenreibung machen, ich denke es reicht wenn ich am Boden die Reibung erhöhe.
Ich verwende folgende Methode:
Delphi-Quelltext
1: 2: 3:
| FPosition := v2f_add(FPosition, v2f_add(v2f_scale(FAcceleration, dt * dt * 0.5), v2f_scale(FVelocity, dt))); FVelocity := v2f_add(FVelocity, v2f_scale(FAcceleration, dt)); |
Jetzt möchte ich eine Reibung einbauen, allerdings kann ich diese nicht einfach mit der Geschwindigkeit multiplizeren, da sie auch von dt abhängig sein muss. Was wäre die beste Methode ?
mfg
Horst_H - Mi 20.08.08 10:23
Hallo,
Ich würde über die angreifenden Kräfte gehen.
Reibung ist eine Kraft die recht unabhämgig von der Geschwindigkeit ist.
alpha = Gefälle des Bodens
m = masse
g = ( lokale ;-) ) Erdbeschleunigung
A = Fläche des Schattenrisses in Fahrichtung.
cw = Luftwiderstandsbeiwert
v = Geschwindigkeit
Fr = mueR x m x g x cos(alpha);
Hangabtriebskraft
Fh = sin(alpha)x m x g
Luftwiderstand
Fl= 0.5x cw x A x v^2
Da Drehmoment = Fxh(ebelarm)
Kann man nun yum Beispiel das Drehmoment eines Motors übersetzt durch Getrribe und ReifenRadius als Kraft am Radumfang bestimmen.
Wenn die Summe der äußeren Kräfte < Antriebskraft dann wird beschleunigt mit
a = (F(Summe außen)- F(Summe innen)) / m
Gruß Horst
ene - Mi 20.08.08 10:24
Moin,
kannst du deine Variablen erklären? Denn für mich ist die Reibung von der Gewichtskraft und dem Reibungskoeffizienten µR abhängig und nicht von der Fläche und der Geschwindigkeit.
nagel - Mi 20.08.08 10:27
Titel: Re: Reibung
F34r0fTh3D4rk hat folgendes geschrieben: |
Ich möchte eigentlich keinen Unterschied zwischen Luft und Bodenreibung machen, ich denke es reicht wenn ich am Boden die Reibung erhöhe. |
Den Unterschied solltest du schon machen, da die Luftreibung von v^2 abhängt.
F34r0fTh3D4rk - Mi 20.08.08 10:28
So kompliziert brauche ichs eigentlich nicht. Ich habe keine Hänge, entweder wird sich Horizontal auf dem Boden bewegt oder in der Luft. (Dort soll die Reibung einfach nur geringer sein) Ich will einfach nur eine gewisse Bremsung.
€: Ok dann mache ich den Unterschied ;)
ene - Mi 20.08.08 11:48
Dann nimm doch einfach einen Faktor, der indirekt proportional zur Geschwindigkeit ist.
F34r0fTh3D4rk - Do 21.08.08 09:58
Das hilft mir nicht sonderlich weiter ;)
ene - Do 21.08.08 11:35
Du hast doch eine Geschwindigkeit und eine Beschleunigung? Nun kannst du die Geschwindigkeit mit x (x<1) multiplizieren und hast damit eine konstante negative Beschleunigung. Der Faktor ist immer gleich, aber der Betrag ändert sich. Für die Beschleunigung könnte man das gleiche machen. Nachteil davon. Deine Geschwindigkeit wäre nie 0, wobei man das vielleicht abfedern kann.
Oder verstehe ich dich grad völlig falsch? Dann würd ich mich über eine erneute Erklärung freuen ;)
delfiphan - Do 21.08.08 11:45
Für die Bodenreibung bzw. Luftreibung gibt es wie oben schon angegeben Kräfte. Die eine ist von der Masse m abhängig, die andere von der Geschwindigkeit v und Beschaffenheit des Objekts.
Bei der Luftreibung bspw. nimmst du die bekannte Geschwindigkeit zur Zeit t1. Daraus berechnest du die Kraft und berechnest daraus die Beschleunigung (zu FAcceleration dazuaddieren). Daraus wiederum berechnest du dann die Werte für FPosition und FVelocity. Die sind dann für t2 = t1 + dt.
F34r0fTh3D4rk - Do 21.08.08 13:06
ene hat folgendes geschrieben: |
Du hast doch eine Geschwindigkeit und eine Beschleunigung? Nun kannst du die Geschwindigkeit mit x (x<1) multiplizieren und hast damit eine konstante negative Beschleunigung. Der Faktor ist immer gleich, aber der Betrag ändert sich. Für die Beschleunigung könnte man das gleiche machen. Nachteil davon. Deine Geschwindigkeit wäre nie 0, wobei man das vielleicht abfedern kann.
Oder verstehe ich dich grad völlig falsch? Dann würd ich mich über eine erneute Erklärung freuen ;) |
Das funktioniert allerdings nicht, weil die Reibung von DeltaT abhängig sein muss, ansonsten verhält sich die Bewegung unterschiedlich bei anderem DeltaT.
delfiphan - Do 21.08.08 17:12
F34r0fTh3D4rk hat folgendes geschrieben: |
weil die Reibung von DeltaT abhängig sein muss, ansonsten verhält sich die Bewegung unterschiedlich bei anderem DeltaT. |
Die Reibung ist nicht abhängig von dt. Die Reibung ist etwas Physikalisches, dt nicht. Es definiert nur das Rechengitter für die Diskretisierung. Du musst eigentlich nur die Reibungskräfte haben (die ist sbhängig von m und/oder v), daraus berechnest du die Beschleunigung (F=m*a), mit der Beschleunigung die Geschwindigkeit (v=v+dt*a) und mit der Geschwindigkeit die Position (p=p+dt*v). Das ist zu mindest die einfachste Diskretisierung.
F34r0fTh3D4rk - Mo 25.08.08 11:06
so etwas wie massen wollte ich nicht extra einführen. bisher hat es mir halt gereicht, die Geschwindigkeit mit einem Faktor zwischen 0 und 1 zu multiplizieren. Das funktioniert allerdings nicht wenn DeltaT variiert, was sich ja nicht vermeiden lässt.
mfg
delfiphan - Mo 25.08.08 13:32
Naja wenn du das so willst, wieso machst du es nicht abhängig von dt?
z.B. c_dt := c^dt
dt = 1, c = 0.9, v = 1
-> c_dt = 0.9^1 = 1
-> Nach 1 Zeitschritt: v * c_dt = 0.9
dt = 0.25, c = 0.9, v = 1
-> c_dt = 0.9^0.25 = 0.974003746
-> Nach 4 (da dt=0.25) Zeitschritten: v * c_dt * c_dt * c_dt * c_dt = 0.9
Kha - Mo 25.08.08 13:46
F34r0fTh3D4rk hat folgendes geschrieben: |
bisher hat es mir halt gereicht, die Geschwindigkeit mit einem Faktor zwischen 0 und 1 zu multiplizieren. |
Was dann ja eben nicht der von v unabhängigen Gleitreibung entspräche. Deshalb würde ich es einfach so lösen:
Delphi-Quelltext
1:
| FVelocity := v2f_add(FVelocity, v2f_scale(FAcceleration - FrictionAcc, dt)); |
Jetzt musst du nur noch einen schönen Wert dafür suchen und das ganze Ding am besten noch anhalten, wenn es unter die Haftreibung fällt - sonst rutscht es am Ende noch rückwärts ;) .
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!