Ich arbeite schon seit einer Weile an einem Spieleprojekt, in dem man sich die normale Kameraansicht der Welt wie in GTA vorstellen kann: also aus der Vogelperspektive, wobei die Welt sich horizontal in der x-y-Koordinatenebene ausbreitet.
Mein Ziel ist es nun, dass sich Objekte, welche sich über die Oberfläche der Welt bewegen, bei sich verändernden z-Koordinaten des Untergrunds in der Höhe entsprechend anpassen (vergleichbar mit einem Fussgänger, welcher von einer Straße auf einen Bordstein steigt, und damit etwas höher steht als vorher).
Mein Frage ist nun, ob es einen eleganten Weg gibt bzw. jemand schon Erfahrung damit hat, diese Höhenkoordinaten pixelgenau zu berechnen/auszulesen.
Wie z.B., das man von einem bestimmten Koordinatenpunkt aus startet und sich solange in negativer Z-Richtung bewegt, bis man auf die Fläche eines Quads oder eines anderen 3D-Objektes stößt und somit weiß, welche Koordinaten sozusagen "den Boden" des Levels darstellen.
Ich hoffe, ich habe das Problem halbwegs verständlich beschrieben und bedanke mich im Vorraus für jegliche Antworten, die mich hoffentlich weiterbringen.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Wenn ich dich recht verstanden habe meinst du "Selektion".
Um an einer gegebenen Position die Tiefe bzw das getroffene Objekt zu ermitteln. Ist allerdings langsamer da man vor dem Rendern jedes Objekts einen Namen festlegen muss. Muss gestehen, dass ichs nochnie benutzt habe und verweise auf: click
Alternativ zur Selektion kann ich den Beitrag von Phobeus empfehlen: click Dadurch inspiriert hab ich meine Landschaft komplett einbefärbt, sprich auf der x-achse rot, y-achse grün und z-achse blau. damit bekommt "recht genaue" angaben über die Weltkoordinaten, auf die man gerade mit der maus zeigt. Das wäre also ähnlich wie beim Depthbuffer. Nur dass du evtl noch weitere nützliche Werte beim Rendern mit raushauen kannst. Aber da du ja Vogelperspektive hast interessiert dich eh nur die z-achse.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
@dj3hut1: Da die Karte nicht wie in einer Outdoor-engine aus Dreiecken aufgebaut ist, die auf Basis einer Heightmap generiert werden, kann ich diese Methode wohl leider nicht anwenden. Trotzdem danke für die Idee
@damadmax: An die Selektionsmethode hatte ich garnicht gedacht, und habe sie direkt mal versucht zu implementieren. Bin dabei wohl auf Performanceprobleme gestossen, da diese Selektion nicht nur für ein Objekt, sondern für eine ganzen Reihe durchgeführt werden muss.
Ansonsten hört sich der Artikel von Phobeus wirklich interessant an und ich werd die nächsten Tage mal versuchen, dass zu realisieren.
Vielen Dank für den Hinweis.
Registriert: Di Dez 27, 2005 12:44 Beiträge: 393 Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
Hallo Zerberus,
sorry, ich hätte deinen Beitrag am Anfang nochmal genauer durchlesen sollen.
Wenn du ausschliesslich senkrecht von oben auf deine Welt schaust, wäre es am einfachsten den Tiefenpuffer an der passenden Stelle auszulesen (mit glReadpixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, pixel) )
glReadpixels ist eigentlich eine ziemlich langsame Funktion, aber wenn man damit nur wenige Pixel ausliest (wie in diesem Fall), kann die Methode unbesorgt angewendet werden.
Wenn die Höhe nicht nur rein grafisch sein soll, sind alle Mittel die auf opengl zurückgreifen imo eklig, da grafik und physik getrennt sein sollten. Du musst einfach einen Ray-Mesh-Intersect Algo coden. Aus Performancegründen könnten BSP-Trees nötig sein. Für genauere Hilfe müssten wir erstmal wissen wie du dein Level im Speicher repräsentierst.
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.