2012-12-21 34 views
18

मेरा दृष्टिकोण क्रमशः धुरी एक्स और वाई के समानांतर दो स्पर्शकीय वैक्टरों की गणना करना है। फिर सामान्य वेक्टर खोजने के लिए क्रॉस उत्पाद की गणना करें।ओपनजीएल - एक इलाके ऊंचाई ग्रिड में मानक की गणना कैसे करें?

टेंगेंट वेक्टर उस रेखा से दिया जाता है जो निम्न तस्वीर में दिखाए गए दो निकटतम खंडों पर मध्य बिंदु को पार करता है।

enter image description here

मैं सोच रहा था एक और अधिक प्रत्यक्ष गणना, या CPU चक्र के मामले में कम खर्चीला है कि क्या वहाँ।

+5

क्या मैं पूछ सकता हूं कि आप इस छवि को आकर्षित करने के लिए क्या उपयोग करते थे? यह वास्तव में अच्छा है। – Aesthete

+0

एडोब इलस्ट्रेटर – rraallvv

उत्तर

42

आप वास्तव में "परिमित अंतर विधि" (या कम से कम मुझे लगता है कि इसे इस तरह से बुलाया जाता है) का उपयोग कर क्रॉस उत्पाद के बिना इसकी गणना कर सकते हैं।

असल में यह पर्याप्त तेज़ है कि मैं इसे एक कशेरुक शेडर में फ्लाई पर मानकों की गणना करने के लिए उपयोग करता हूं।

// # 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

बहुत बुरा मैं आपको +1 से अधिक नहीं दे सकता: मैंने आपके सरल एल्गोरिदम का उपयोग कर अपने एफपीएस को दोगुना कर दिया! – Zac

+0

बहुत अच्छा, सीपीयू –

+0

पर मेरी पूर्व गणना के लिए पूरी तरह से काम करता है बहुत अच्छा! क्या आप अपना समाधान 3 डी बनावट में बढ़ा सकते हैं? – qantik