Ich bin jetzt kein Experte was 3D angeht, da ich aber ähnliches in 2D gemacht habe, und es mehr oder weniger die gleichen Probleme sind, gebe ich hier mal mein Senf dazu.
Auf einer schiefen Ebene zu Stehen bedeutet, dass der Spieler bei jeder noch so kleinen Steigung nach unten gleitet. Wenn ich vertikal jedoch kein Gleiten erlaube, dann bleibt der Spieler auch bei sehr starken Steigungen "am Hang" (z.B. 89,999°) stehen -> Möchte ich auch nicht, könnte ich jedoch vielleicht durch einen Abgleich mit einer Grenze der Steigung für Gleiten fixen.
Ich verstehe nicht so ganz, ob das heruntergleiten, obwohl man still steht, jetzt beabsichtigt ist oder nicht.
Falls nicht, solltest du herausfinden, warum man überhaupt anfängt herunterzugleiten, obwohl überhaupt keine Beschleunigung angewendet werden sollte.
Wenn der Spieler auf dem Boden steht, sollte keine Gravitation angewendet werden, und wenn keine Buttons gedrückt werden, sollte auch keine horizontale Geschwindigkeit da sein. Dementsprechend sollte einfach gar nichts passieren. Der an-Wänden-vorbei-gleit code sollte auch nur ausgeführt werden, wenn tatsächlich Geschwindigkeit da ist.
Eine Grenze zu ziehen, wie steil die Steigung sein darf, bevor man nicht mehr hochlaufen/stehen bleiben kann bzw. runterrutscht, ist auf jedenfall eine gute Idee. Das kann man ja einfach über die Normale herausfinden.
Größeres Problem: Beim Herunterlaufen einer Ebene macht der Spieler kleine "Hoppelsprünge", ist also dazwischen immer in der Luft. Das möchte ich auch nicht, da ich z.B. die Möglichkeit zu Springen nur dann erlauben will, wenn der Spieler gerade am Boden ist.
Die gängigste Art das zu lösen ist, denke ich, den Spieler einfach "runterzudrücken". Du schaust, ob er sich auf einer Schräge befindet, und dementsprechend drückst du ihn, beim herunterlaufen einfach ein paar Pixel nach unten.
Wenn du dich bei anderen Engines inspirieren möchtest, kann ich dem movement code von Quake empfehlen. Den findest du
hier. Es braucht zwar eine Weile, bis man da durchsteigt, aber die Techniken, die da verwendet werden sind recht simpel und funktionieren gut.
Eine der wichtigsten Funktionen ist z.B.
PM_FlyMove, die sich darum kümmert, Bewegungen auszuführen inklusive Kollisionsbehandlung.
In der Quake engine wird ein 3D Vektor für die Geschwindigkeit verwendet. Wenn eine Kollision auf dem Weg festgestellt wird, wird die Geschwindigkeit umgebogen, sodass die Geschwindigkeit entsprechend der Kollisionsfläche reduziert wird und danach daran entlang gleitet.
Dadurch bekommt ohne viel Arbeit ziemlich cooles movement und pseudo-physics.
Den Code dafür findest du übrigens in
PM_ClipVelocity.
Das rauf/runter laufen von Treppen/Schrägen wird übrigens
hier behandelt.