Rutschen auf Eis
Übersicht

PacManiBetreff: Rutschen auf Eis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sollte so oder so ähnlich aussehen (evtl stimmen die vorzeichen nicht)
BlitzBasic: [AUSKLAPPEN] speed_x = speed_x*0.95 + Cos(EntityYaw(player)) * walking_speedwas 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke, habe die entsprechenden Vorzeichen korrigiert, aber es funktioniert dennoch nicht wie gewünscht ![]() So funktioniert es derzeit (das nachträgliche Langsamerwerden durch die Reibung auf dem Eis greift leider garnicht): ![]() Eher stelle ich es mir aber so vor: ![]() |
||
Hunter99 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eigentlich müsste das von Mr. Keks gehen.
Probiere aber noch das Bremsen von der Richtungskorrektur zu trennen: BlitzBasic: [AUSKLAPPEN]
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
sind speed_x und _z floats? unter umständen ist das von bedeutung... | ||
MrKeks.net |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Dann wäre die Bewegung aber so:
Code: [AUSKLAPPEN] v
^ |\ | \ | \ | \ | | 0-------->t Das will ich aber nicht ![]() |
||
![]() |
Goodjee |
![]() Antworten mit Zitat ![]() |
---|---|---|
dann zieh halt cos(winkel)*0.01 und sin(winkel)*0.01 ab ![]() |
||
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/ |
![]() |
Mr.Keks |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
MrKeks.net |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group