Registriert: Di Feb 25, 2003 15:10 Beiträge: 147 Wohnort: Koblenz a. Rhein
Hi! Hab folgende Frage:
Wie soll ichs angehen den Spieler auf meiner Heightmap rutschen zu lassen wenn er einen zu steilen Hang besteigt (so wie z.B. Battlefield das macht)
Hab bissel gegoogelt aber kam nix brauchbares bei raus.
Also ich hab mir folgendes überlegt: enteder die Spielerposition auf dem Aktuellen Triangle ermitteln dann aus der Differenz der Punkte die steile errechnen.. so dann wüsst ich schonma ob der Spieler da hoch gehen können soll oder nich.
Aber was wenn nicht ? Dann müsste er doch vom höchsten Punkt des Tris nach unten wegrutschen..
Aber wie mach ich das ?
Danke ! Bye
EDIT: Hab im game für die Collision 3 Linien für die Represäntation des Players.. falls man damit was anstellen kann.. wollt ich nur ma gsagt ham ^^
_________________ mir fällt kein Spruch mehr ein für meine Signatur naja...
Hmmmm.............. ....... ....... ... ... ........ ........ ............... .. Wenn du so was willst solltest du eine gute Physik Engine haben (Newton kann ich nicht so empfehlen), du solltest dann mit einer "Steil-berechnung" und einem Bodenchek bzw. Gravitychek das irgendwie hinbekommen können. Mehr kann ich dir nicht sagen, habe mir dieses Feature nie angeguckt bzw. gedacht für meine Projekte.
Registriert: Sa Jan 04, 2003 21:23 Beiträge: 674 Wohnort: Köln
das sollte relativ einfach anhand der Normalen der Heightmap an der entsprechenden Stelle herauszufinden sein...
die gibt ja auch die Steilheit an...
(werde vor dem gleichen Problem auch bald mal stehn, also nicht zurückhalten irgendwelche Ergebnisse zu veröffentlichen )
Registriert: Di Feb 25, 2003 15:10 Beiträge: 147 Wohnort: Koblenz a. Rhein
jo werd ich hier posten falls ich weiter komm nur heute nich mehr weil muss morgen früh raus ^^
hab mit den normalen auch schonma nachgedacht aber war nich sicher und wollt nich einfach drauflos rumfummeln mit den dingern.. aber dann werd ich mich da ma ran setzen! bis dann
_________________ mir fällt kein Spruch mehr ein für meine Signatur naja...
Der Spieler wird ja ständig nach unten beschleunigt. Er hat also immer wenn er auf dem Boden ist, eine Geschwindigkeit die nach unten gerichtet ist und auch eventuell nach vorne falls er gerade läuft.
Wenn man einen Geschwindigkeitsvektor v und die Normale n der Fläche hat, auf die der Spieler stößt, dann kann man die neu Geschwindigkeit so berechnen.
v2:=v-(v . n);
Wenn der Spieler sich parallel zur Fläche bewegt, dann ist v.n=0 und die ursprüngliche Geschwindigkeit bleibt erhalten. Wenn der Spieler senkrecht mit der Fläche kollidiert, dann ist v.n=v und damit v2=v-v=0.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmm...also mal so ne Idee:
Du nimmst den Anstieg (So heißt die Steilheit ) der Normale auf dem Feld wo dein Spieler steht.
Dann nimmst du nen Referenzwert, von dem Ziehst du den Anstieg ab. Is der Wert größer gleich 0 bleibt alles wies is.
Is der Wert kleiner Null benutzt du den als Beschleunigung entlang der Oberfläche der Highmap.
Das Problem sollte jetzt daran liegen nen Richtungsvektor zu berechnen, an dem lang gerutscht werden soll. Zwei Koordinaten hast du schon, indem du ne Senkrechte von deiner Normalen nimmst. Allerdings welche? Nun die, die nach unten zeigt ) wie du das machst, kann ich dir allerdings net sagen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Wenn du ohnehin nur mit einer Heightmap kollidieren willst, lohnt es sich eventuell zusätzlich zu den Höheninformation noch ein weiteres Array mit den Normalvektoren der Tangentialebenen der einzelnen Punkte (lassen sich leicht über benachbarte Elemente einer Position auf der Heightmap berechnen) erstellen - damit kommst du dann völlig ohne Trianglekollision aus, und kannst jedes Objekt auf dem Boden herumrutschen lassen, wie du Lust hast.
Registriert: Di Feb 25, 2003 15:10 Beiträge: 147 Wohnort: Koblenz a. Rhein
Hi und danke soweit für die Antworten!
@Flash: So hab ichs auch probiert aber das is irgendwie komisch wenn der Player dann hängen bleibt...
Sieht dann so aus als würde das Game ruckeln.. Also is echt keine brauchbare Lösung aber die Idee hatte ich auch ^^
Hab halt die SpielerPosition und ne NewSpielerP gehabt und die Differenz aus der Höhe genommen dann ab nem gewissen Wert die NewSP ignoriert.. aber dann is das Game nimmer spielbar..bei Senkrechten is das sicher realistisch aber am Hang irgendwie nicht.
@Mars: Also ich hab die Normalen der verwendeten Tris bei der Heightmap in nem Array gespeichert falls du die meintest.
Ja die TriangleKollision bringt mir ja nix da ich ja weiss, auf welchem Feld sich der Spieler befindet.
@Lars: Der GeschwindigkeitsVektor ist dann die Distanz die pro Frame in die Richtung überwunden wird, in die der Vektor von der Position de Spielers entfernt ist (also die Position, an der sich der Spieler im nächsten Frame befinden wird), oder verstehe ich da was falsch ?
Bye!
_________________ mir fällt kein Spruch mehr ein für meine Signatur naja...
Mit Geschwindigkeit ist eigentlich nicht die Entfernung pro Frame sondern pro Sekunde gemeint. Beim Bewegen von Objeken multipliziert man den Vektor dann ja noch mit der Dauer des Frames.
newpos:=pos+speed*frametime;
...
...
if collided then
speed:=SlideVector(speed,Normal);
Registriert: Di Feb 25, 2003 15:10 Beiträge: 147 Wohnort: Koblenz a. Rhein
aso!
jo is ja logisch weil sonst würd einer der in dem game 200 frames hat da durchrushen können und einer mit 50 schleichen.
aber nochmal zu dem vektor.. das ist also die position an der der spieler bei der nächsten berechnung sein wird? also ist die geschwindigkeit gleich dem abstand von der spieler position zu dem geschwindigkeitsvektor ?
bye
_________________ mir fällt kein Spruch mehr ein für meine Signatur naja...
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.