Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

30.04.2015, 09:37

[LibGDX] Navigation innerhalb einer 3D-Welt (Point&Click)

Hey hey.
Nachdem ich das Problem für Sprites in einer 3D-Welt mit eurer Hilfe gelöst habe, stehe ich vor einem neuen theoretischen Problem.

Und zwar möchte ich in dem Projekt keine direkte Steuerung über die Tastatur ermöglichen, sondern über die Maus (was auch der Portierung auf Touch-Screen-Devices Zugute kommen würde).

Das Terrain besteht in diesem Fall aus einem einzigen 3D Modell in dem neben dem begehbaren Boden auch andere Objekte vorhanden sind (Häuser, Bäume, etc.)

Generell über RayPicking kann ich ja bestimmen, wo der Nutzer hinklickt und kann die Figur ja auch dahin bewegen.
Zusätzlich wird die Stelle des Klicks hervorgehoben.

Nun zu den Problemen:

1. Manche Teile der Map sind nicht begehbar (z.B. in einen Baum zu laufen). Wie verhindere ich, dass sie überhaupt geprüft werden (bzw hervorgehoben werden)?
2. Wie bringe ich die Figur dazu sich der Höhe der Map entsprechend zu bewegen (d.h. wenn die Figur einen Berg hoch läuft, auch tatsächlich nicht durch den Berg läuft)?

Vielen Dank im Voraus.
Gruß,
JustJim

2

30.04.2015, 10:49

Trenne Terrain und Objekte. Benutze für Kollisionen mit Objekten z.B. Hüllvolumen wie Boundingboxen oder Boundingspheres und teste so die Kollisionen mit Bewegbaren Objekten wie dem Spielermodell. Dazu gibt es haufenweise Ressourcen im Internet.
Für das Positionieren von Objekten auf dem Terrain könntest du einen Strahl von Objekt zu Terrain berechnen. Die Länge des Strahls vom Objekt zum Terrain ziehst du dann von der Objekthöhe ab.

Ich hoffe diese Ideen helfen dir weiter.

3

30.04.2015, 11:50

Naja gut Objekte und Terrain trennen ist ja schön und gut. Was ist aber mit z.B. Bergsteigungen oder Flüsse die als unüberquerbar gelten sollen?

Oder als extremes Beispiel:
Eine Brücke im Terrain. Teile davon sind Überquer- und Begehbar. die Geländer aber nicht und das Dach ebenfalls nicht.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JustJim« (30.04.2015, 12:00)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

02.05.2015, 18:18

Du kannst deine Welt als Graphen darstellen. Darauf kannst du nun zum Beispiel per A* einen Weg suchen. Start wäre die Spielfigur und Ziel die Position wo der Spieler sich hinbewegen soll. Wurde ein Weg gefunden kannst du die Spielfigur über diesen Pfad von Punkt zu Punkt bewegen. Dadurch sollte sich dein Problem mit der Höhe automatisch erledigt haben. Ansonsten kann man aber auch von der Position des Spielers einen Ray nach unten schießen und so den Kontaktpunkt zum Boden herausfinden. Danach kannst du den Spieler auf das Terrain "pappen".
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

5

06.05.2015, 11:50

Okay. Das ist eine gute Idee. Habe ich gestern auch ausprobiert.
Folgendes wurde benutzt:

Blender Modell (reines Plane zu Testzwecken)

Dann habe ich das Modell geladen:

model = loader.loadModel(Gdx.files.internal("TestTerrain.obj"));


und die Vertices extrahiert:


terrainMesh = model.meshes.get(0);
vertice = new float[terrainMesh.getNumVertices()*6];
terrainMesh.getVertices(vertice);

Soweit so gut.
Dann habe ich ein Ray posRay welches von der Position des Spielers nach unten feuert:

posRay.set(AssetLoader.decal.getPosition(), new Vector3(0,-1,0));


und hole mir den Punkt der Collision (Vektor3 gravity):

Intersector.intersectRayTriangles(posRay, AssetLoader.vertice, gravity);



Problem ist nun:
x und z Werte sind völlig korrekt.
y ist ziemlicher mist.
Und zwar: In der Mitte des Planes hat es einen Wert von 1 (was viel zu hoch ist)
an den Seiten sinkt der y-Wert ab bis es den korrekten Wert hat.

Ich bin da ziemlich am verzweifeln

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

06.05.2015, 13:51

Ich habe die Funktionen in Blender grad nicht im Kopf. Was mir da beim letzten mal geholfen hat war einfach viele Daten auszugeben. Wenn du erst mal mit einem Dreieck startest, sobald das klappt dann zu einem Rechteck erweiterst und erst danach für beliebige Formen guckst dann ist das vielleicht etwas einfacher. So hat es mir zumindest geholfen. Gib dir dann einfach mal die Vertizes der Fläche aus und vergleiche das mit dem was du denkst was raus kommen sollte.

Brauchst du nicht sowas wie ein NavMesh ?

Er versucht da ja nur die Spielfigur auf das Terrain zu pappen. Um die Wegfindung geht es hier noch gar nicht. Danach muss er natürlich irgendeine Darstellung des Terrains wählen. An sich ist er da recht frei. Ob er nun ein Navmesh als Graph benutzt oder wahlweise etwas anderes bleibt ihm ja überlassen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

06.05.2015, 15:50

Gut. Ich habe es gelöst, indem ich rausgefunden habe, dass Blender dooferweise auch die Normals in obj speichert.
Hab dann einfach n Darstellungsmodell und ein Collisionmodell ohne Normals erstellt.

Jetzt aber zur Navigation. Sowas brauch ich wirklich. Weiß leider nur nicht wie ich das hinkriegen soll.

A*-Algo ist ja schön und gut. Aber ich weiß nicht wie ich ein Mesh darauf abbilden kann

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

8

06.05.2015, 16:40

Bambi hat ja schon das Stichwort Navmesh in den Raum geworfen. Du kannst die Knoten aber auch durch Kreise, Rechtecke oder was auch immer darstellen. Es ist sicherlich hilfreich wenn du dich langsam an dein Problem herantastest. Versuch doch erst mal A* ohne dein Mesh zu entwickeln. Fang vielleicht einfach mal mit einem Schachbrettraster an über welches du navigieren möchtest. Die Felder die nicht begehbar sind gibst du erst mal selbst an und versuchst das ganze ans laufen zu kriegen. Dann kannst du dich langsam zu deinem eigentlichen Ziel hin arbeiten. Den Graphen für die Navigation musst du hinterher entweder selbst von Hand erstellen oder du versuchst ihn irgendwie zu generieren. Inspiriert durch ein Buch habe ich dazu mal Flood Fill verwendet. Dabei habe ich einfach feste Abstände gewählt um mich auszubreiten. In wie fern dass bei einem beliebigen Terrain sinnvoll ist kann ich dir so nicht sagen. Am einfachsten wäre es wohl hinterher ein Navmesh von Hand anzulegen und das zu verwenden wobei das auch schon fortgeschrittener ist. Mit den Stichworten solltest du nun aber erst mal weiter kommen denke ich.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige