Rutschen auf Eis

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

PacMani

Betreff: Rutschen auf Eis

BeitragDo, März 04, 2010 13:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich sitze derzeit vor einer Sache bei der ich im Moment nicht weiterweiß, wie ich sie umsetzen soll.
Wie berechne ich die Koordinaten meiner Spielfigur, wenn sie auf Eis rutscht? Ich dachte an Vektoren etc., aber ich scheine damals nicht gut genug in der Schule aufgepasst zu haben, sonst wüsste ich jetzt, wie das geht Smile

Das "Auf-dem-Eis-Rutschen" sei hier noch einmal genauer erläutert, wie ich es mir vorstelle:
Die Spielfigur fängt an sich nach vorne zu bewegen, solange der Spieler beschleunigt.
Wenn der Spieler nicht weiter beschleunigt, rutscht die Spielfigur noch ein wenig weiter (wird dabei aber immer langsamer).
Die Spielfigur lässt sich einfach nach links und rechts drehen, wenn sie aber beschleunigt wird solange sie noch von der vorherigen Beschleunigung rutscht, bewegt sie sich trotzdem noch ein wenig in die vorherige Richtung und schlägt die neue Richtung erst langsam nach und nach ein.

Kann mir jemand Denkansätze liefern? Finde nicht einmal mit Google etwas passendes.

Mr.Keks

BeitragDo, März 04, 2010 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
sollte so oder so ähnlich aussehen (evtl stimmen die vorzeichen nicht)
BlitzBasic: [AUSKLAPPEN]
speed_x = speed_x*0.95 + Cos(EntityYaw(player)) * walking_speed
speed_z = speed_z*0.95 - Sin(EntityYaw(player)) * walking_speed
TranslateEntity player, speed_x, 0, speed_z
was der code bedeutet: speed_x und speed_z bilden den aktuellen bewegungsvektor deiner spielfigur entlang der zx-ebene. durch die reibung mit dem eis nehmen sie beständig ab (*0.95). sie werden ansonsten noch verändert (+) durch das laufen der spielfigur (*walking_speed) aber eben nur anteilig, je nach dem wie der spieler sich dreht (z.b. wird speed_z nicht verändert, wenn der spieler in richtung der x-achse steht, klar..) durch das cos/sin(entityyaw(player)).
zu guter letzt wird der spieler natürlich unabhängig von seiner drehung entsprechend seines bewegungsvectors verschoben durch translateentity.
 

PacMani

BeitragDo, März 04, 2010 14:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke, habe die entsprechenden Vorzeichen korrigiert, aber es funktioniert dennoch nicht wie gewünscht Sad da du dir solch' Mühe gemacht hast, hab ich das gleiche getan und von meiner Vorstellung mal eine Zeichnung gemacht:
So funktioniert es derzeit (das nachträgliche Langsamerwerden durch die Reibung auf dem Eis greift leider garnicht):
user posted image
Eher stelle ich es mir aber so vor:
user posted image
 

Hunter99

BeitragDo, März 04, 2010 15:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Eigentlich müsste das von Mr. Keks gehen.

Probiere aber noch das Bremsen von der Richtungskorrektur zu trennen:

BlitzBasic: [AUSKLAPPEN]

If KeyHit(TASTE)
speed_x = speed_x + Cos(EntityYaw(player)) * walking_speed
speed_z = speed_z - Sin(EntityYaw(player)) * walking_speed
EndIf

speed_x = speed_x*0.95
speed_z = speed_z*0.95

TranslateEntity player, speed_x, 0, speed_z


So wie ich den Code verstehe, müsste deine Korrektur, die du beschrieben hast in der If-Abfrage schon vorhanden sein.

Gruss Hunter99

Mr.Keks

BeitragDo, März 04, 2010 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
sind speed_x und _z floats? unter umständen ist das von bedeutung...
MrKeks.net
 

PacMani

BeitragDo, März 04, 2010 21:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop...
hab's jetzt übrigens so gelöst... ist irgendwie recht dämlich da schwer zu ändern wie stark man jetzt rutscht und die Beschleunigung ist... aber wenn man es so lässt ist es ganz ordentlich Very Happy
Code: [AUSKLAPPEN]
PlayerAccel=0
If KeyDown(KUp)   Then PlayerAccel =  0.002
If KeyDown(KDown) Then PlayerAccel = -0.002
PlayerXSpeed = (PlayerXSpeed - Sin(EntityYaw(PlayerPod))*PlayerAccel)*0.99
PlayerZSpeed = (PlayerZSpeed + Cos(EntityYaw(PlayerPod))*PlayerAccel)*0.99

TranslateEntity PlayerPod, PlayerXSpeed, 0, PlayerZSpeed

Goodjee

BeitragDo, März 04, 2010 21:20
Antworten mit Zitat
Benutzer-Profile anzeigen
ich würde die bremskraft nicht durch *0.99 machen sondern immer den gleichen wert abziehen/addieren und ab einem bestimmten wert die geschwindigkeit auf 0 setzen.

die reibung ist nämlich eg nicht abhängig von der geschwindigkeit
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/
 

PacMani

BeitragDo, März 04, 2010 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann wäre die Bewegung aber so:
Code: [AUSKLAPPEN]
v
^
|\
| \
|  \
|   \
|    |
0-------->t


Das will ich aber nicht Wink aber danke für den Tipp, falls ich doch zu lange am Rutschen bin, greif' ich drauf zurück.

Goodjee

BeitragDo, März 04, 2010 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
dann zieh halt cos(winkel)*0.01 und sin(winkel)*0.01 ab Very Happy
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Mr.Keks

BeitragDo, März 04, 2010 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin nicht so der physik-experte und mir ist klar, dass das ganze abstrahiert ist. aber wie stark diese gleitreibung da wirkt, hängt doch davon ab, "wie sehr" ich das eis berühre. soll heißen: wenn ich fliege, berühre ich das eis nicht, wenn ich schwer drauf sitze, berühre ich es stark. nun hängt aber offensichtlich dieses "wie sehr" auch davon ab, wie weit ich mich im betrachteten zeitinterval (aka frame) bewegt habe. wenn ich stehe habe ich keine fläche durchquert, wenn ich schnell bin, habe ich viel durchquert. also berühre ich das eis, wenn ich schneller bin "mehr", werde also mit mehr kraft gebremst.

btw hat das ganze auch nen leichten spieltechnischen hintergrund: mit deiner methode könnte man unendlich schnell werden ^^.
MrKeks.net
 

PacMani

BeitragDo, März 04, 2010 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Das funktioniert aber nicht, die Geschwindigkeit nimmt nur immer mehr immer weniger zu (lol) bis man es dann garnicht merkt (und das geht recht schnell)... frag mich nicht wieso! Ich find's aber derzeit so klasse Very Happy

mpmxyz

BeitragDo, März 04, 2010 22:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Physikalisch korrekt ist aber die lineare Abnahme der Geschwindigkeit.
Es wird aber schneller Bewegungsenergie in Wärme umgewandelt. Daher kommt wahrscheinlich die andere Wahrnehmung.
Die Änderung über einen Faktor simuliert eher die Luftreibung.

Zum Einführen der Reibung nutzt man am Besten dieses System:
BlitzBasic: [AUSKLAPPEN]
Local CurSpeed=Sqr(Xs*Xs+Ys*Ys)
If CurSpeed<>0
Local XRicht#=Xs/CurSpeed
Local YRicht#=Ys/CurSpeed
CurSpeed=CurSpeed-Reibungsstaerke
If CurSpeed<0 Then CurSpeed=0
;Maximalgeschwindigkeit:
If CurSpeed>MaxSpeed Then CurSpeed=MaxSpeed

Xs=XRicht*CurSpeed
Ys=YRicht*CurSpeed
EndIf


mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Silver_Knee

BeitragDo, März 04, 2010 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
reibung muss nicht unbedingt linear sein. Der luftwiderstand beispielsweise fällt quadratisch ab. und ih persönlich mache den spiel luftwiederstand schon immer mit *0.99

Mr.Keks

BeitragDo, März 04, 2010 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ich verstehe, dass die reibung, wenn z.b. beim auto die räder stillstehen, die geschwindigkeit linear abnehmen lässt. nun ist aber der witz bei eis, soweit ich das verstehe, dass man in einer dünnen wasserschicht und nicht auf einer festen asphaltstraße gleitet. aber wie gesagt, habe wenig ahnung davon. werde jedenfalls gleit-geschichten weiterhin wie luftwiderstand basteln Smile
MrKeks.net

mpmxyz

BeitragDo, März 04, 2010 22:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei Eis ändert sich nur die "Reibungszahl" bzw. das Verhältnis zwischen der Reibungskraft und der Normalkraft.
Dadurch ist es von der Berechnung gesehen nicht anders als bei Asphalt.
[/klugscheiß]
Aber ich sehe es nicht so genau.
Es sind ja 'nur' Spiele.
Da gibt es wichtigere Sachen zu besprechen.
Sounds im Weltall, Energie aus dem Nichts, Pju-Pju-Laser & Co.
Da werden viel grundlegendere Naturgesetze gebrochen. Wink
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group