Autor |
Beitrag |
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 20.08.08 10:08
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
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: 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
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: 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.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
nagel
      
Beiträge: 708
Win7, Ubuntu 10.10
|
Verfasst: Mi 20.08.08 10:27
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 
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: Mi 20.08.08 11:48
Dann nimm doch einfach einen Faktor, der indirekt proportional zur Geschwindigkeit ist.
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
F34r0fTh3D4rk 
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 21.08.08 09:58
Das hilft mir nicht sonderlich weiter 
|
|
ene
      
Beiträge: 779
Erhaltene Danke: 1
Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
|
Verfasst: 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 
_________________ Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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 
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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  .
_________________ >λ=
|
|