2016-05-12 16 views
1

Ich mag würde wissen, wie ich die Kamera in diesem drei js Beispiel machen könnte: http://threejs.org/examples/#webgl_terrain_dynamic, wie eine Kamera der Geländehöhe in dieser Probe folgt zu machen: http://threejs.org/examples/#webgl_terrain_dynamic

folgt der Höhe des Geländes. Während sich das Gelände bewegt, wird die Kamera entsprechend den Hügeln (Höhe) des Geländes auf und ab gehen.

Mit anderen Worten, wie könnte ich die Höhe des Geländes bekommen, wissend, dass die Höhe des Geländes durch eine Höhenkarte gebildet wird?

Ich habe schon versucht mit einem Raycaster wie folgt:

var raycaster = new THREE.Raycaster(camera.position, new THREE.Vector3(0, -1, 0)); 
var intersects = raycaster.intersectObject(terrain, false); 
var intersect_point = intersetcs[0].point; 

Aber intersect_point immer hat seine y-Wert gleich 0 unabhängig davon, wo sich die Kamera befindet. Tatsächlich wird die Höhe des Geländes in diesem Beispiel durch eine Heightmap erstellt. Somit wird die Geometrie des Terrains, das ein Plan ist, nicht durch die Heightmap geändert und bleibt flach, daher das Ergebnis des Rycasters.

Können Sie mir helfen, einen Weg zu finden, um die Höhe des Geländes für eine bestimmte Position zu erhalten.

vielen dank für ihre hilfe.

+0

ist das jemand kann helfen? – user6327458

+0

Hallo, möchten Sie vielleicht dieses Beispiel ausprobieren: http://threejs.org/examples/#webgl_geometry_extrude_splines Ich möchte etwas ähnliches, aber mit einem Torus Knoten Geometrie. Anscheinend kannst du den Kameraweg mit etwas Vektormagie berechnen. –

Antwort

1

Im Beispiel selbst berechnen Sie die Kameraposition relativ zur "Heightmap" -Textur und lesen Sie die Höheninformationen aus (Sie können in die Shader-Heightmap schauen, um zu bestimmen, wie man sie "liest", wie ich) erinnere mich nicht an das Detail davon).

Hier ist die allgemeine Lösung, die ich verwenden würde.

Schritt 1: Replizieren Sie den Terrain-Shader (den, der die Farbe hinzufügt, nicht den, der das physische Terrain erstellt) und ändern Sie ihn so, dass die Farbe nicht auf der Basis der Kamera ausgegeben wird (siehe MeshDepthMaterial) oder MeshDistanceMaterial). Sie müssen einige float < -> Farbe packing durchführen, um sicherzustellen, dass Sie den vollen Float wieder auslesen können. Wir werden dies den "Entfernungs-Shader" nennen, da es das Ziel ist, zu zeigen, wie weit die Dinge von Ihrer Kamera entfernt sind.

Schritt 2: Fügen Sie eine Kamera hinzu, die gerade nach unten zeigt (in Bezug auf das Terrain). Sie müssen die Position dieser Kamera mit Ihrer tatsächlichen Kamera synchronisiert halten. Dies sollte während der Rendering-Schleife ziemlich einfach sein (kopiere einfach den Positionsvektor). Das Sichtfeld der Kamera kann sehr klein sein (zB 1 Grad). Wir nennen dies Ihre "Höhenkamera", da ihr Ziel darin besteht, die Höhe zu bestimmen.

Schritt 3: In Ihrer Rendering-Schleife. Rendern Sie zuerst das Terrain mit Ihrem "Distance Shader" und "Height Camera" in ein Texturziel (kann klein sein, vielleicht nur 1 Pixel mal 1 Pixel).

Schritt 4: Lesen Sie die Farbinformationen aus dem Texturziel in Schritt 3, konvertieren Sie sie von RGBA zurück in den Float, indem Sie die Farbe packing invertieren. Jetzt hast du die Höhe.

+0

Mein Fehler, es sieht so aus, als könnten Sie die Heightmap-Textur nicht direkt lesen. Eine Lösung könnte darin bestehen, es zuerst in Schritt 2 ~ 4 zu rendern, indem man es vor dem Lesen in RGBA packt. – ShuberFu