2012-12-21 17 views
18

Meine Methode besteht darin, zwei Tangentenvektoren parallel zur X- bzw. Y-Achse zu berechnen. Berechnen Sie dann das Kreuzprodukt, um den Normalvektor zu finden.OpenGL - Wie Normalen in einem Geländehöhenraster berechnen?

Der Tangentenvektor wird durch die Linie angegeben, die den Mittelpunkt der beiden nächsten Segmente kreuzt, wie in der folgenden Abbildung dargestellt.

enter image description here

Ich habe mich gefragt, ob es eine direkte Berechnung ist, oder weniger teuer in Bezug auf CPU-Zyklen.

+5

Kann ich fragen, was Sie verwendet haben, um dieses Bild zu zeichnen? Es ist sehr schön. – Aesthete

+0

Adobe Illustrator – rraallvv

Antwort

42

Sie können es tatsächlich ohne ein Kreuzprodukt berechnen, indem Sie die "Finite-Differenzen-Methode" verwenden (oder zumindest denke ich, dass es auf diese Weise heißt).

Eigentlich ist es schnell genug, dass ich es benutze, um die Normalen im Vertex-Shader dynamisch zu berechnen.

// # P.xy store the position for which we want to calculate the normals 
    // # height() here is a function that return the height at a point in the terrain 

    // read neightbor heights using an arbitrary small offset 
    vec3 off = vec3(1.0, 1.0, 0.0); 
    float hL = height(P.xy - off.xz); 
    float hR = height(P.xy + off.xz); 
    float hD = height(P.xy - off.zy); 
    float hU = height(P.xy + off.zy); 

    // deduce terrain normal 
    N.x = hL - hR; 
    N.y = hD - hU; 
    N.z = 2.0; 
    N = normalize(N); 
+1

Zu schade, dass ich dir nicht mehr als +1 geben kann: Ich habe meine FPS verdoppelt, indem ich deinen einfachen Algorithmus benutzt habe! – Zac

+0

Sehr schön, funktioniert perfekt für meine Vorberechnungen auf der CPU –

+0

Sehr schön! Können Sie Ihre Lösung auf 3D-Texturen erweitern? – qantik