प्रोग्रामेटिक रूप से वर्टेक्स नॉर्म्स उत्पन्न करना


11

मैं Kinect फेस एपी के साथ काम कर रहा हूं, यह त्रिकोण की एक वर्टिकल और इंडेक्स प्रदान करता है जिसे फेस इमेज बनाने के लिए रेंडर किया जाना है।

कोणों की संख्या और उनके क्रम में सरणी के साथ-साथ किनेक्ट द्वारा दिए गए सूचकांक हमेशा स्थिर होते हैं।

हालाँकि एपीआई यूवी डेटा और वर्टेक्स नॉर्म्स पर कोई जानकारी नहीं देता है।

आवेदन के लिए मुझे शीर्ष क्रम को रखने की आवश्यकता होती है, जैसा कि परिजनों द्वारा दिया गया है, क्योंकि चेहरे की गति के अनुसार 3 डी अंतरिक्ष परिवर्तन में उनकी स्थिति बदल जाती है, इसलिए एक 3D संपादन सॉफ्टवेयर में uv और मानदंड उत्पन्न करना सवाल से बाहर है।

मैं एक 2 डी प्लेन में वर्टेक्स पोज़िशन्स प्रोजेक्ट करके UV जेनरेट करने में कामयाब रहा क्योंकि एक ही प्लेन में बहुत कम वर्जन थे।

हालाँकि, मैं नहीं जानता कि कैसे जाल के लिए वर्टेक्स मानदंड उत्पन्न किया जाए, वर्टेक्स के बिना सामान्य रूप से चेहरे की जाली प्रीस्पेक्टिव से अपनी विशेषताओं की गहराई के साथ नहीं खींचती है, हालांकि सिल्हूट दिखाई देता है क्योंकि शीर्ष स्थान सही हैं।

मैं समझता हूं कि शीर्ष मानदंड की अनुपस्थिति के कारण प्रकाश व्यवस्था इस पर सही ढंग से काम नहीं करती है और इसलिए यह पीला फीचर रहित जाल है।

इसलिए जब मैं केवल शीर्ष स्थिति और उसके बाहर त्रिकोण बनाने के लिए वर्टीकल का सूचकांक हूं तो मैं वर्टेक्स मानदंड कैसे उत्पन्न करूं?


n = (v1 - v0) x (v2 - v0), जहां v0, v1 और v2 प्रश्न में (त्रिकोण) चेहरे के कोने हैं। आदेश आयात है। यदि आपको वास्तव में जरूरत है तो इसे सामान्य करें। (और xक्रॉस उत्पाद है)
3D17

जवाबों:


14

वेक्टर क्रॉस प्रोडक्ट का उपयोग करके सामान्य को वर्टेक्स पोजिशन से कम करना काफी सरल है।

दो वैक्टर का क्रॉस उत्पादu तथा v (नोट किया u×v, या कभी-कभी uv) एक वेक्टर लंबवत है u तथा vलंबाई का ||u×v||=||u||||v||sin(θ), साथ में θ के बीच का कोण u तथा v। वेक्टर की दिशा गुणन के क्रम पर निर्भर करेगी:u×v के विपरीत है v×u (विमान के लिए लंबवत दो दिशाएं)।

यदि आप क्रॉस उत्पाद से परिचित नहीं हैं, तो मैं आपको इसके बारे में पढ़ने और इसके साथ सहज होने के लिए आमंत्रित करता हूं। नॉर्मल तब सरल लगेंगे।

फ्लैट शेडिंग मानदंड

यदि आपके पास एक त्रिकोण है ABC, AB×ACत्रिभुज के लिए लंबवत एक वेक्टर है और अपने क्षेत्र के लिए आनुपातिक है। चूँकि सामान्य त्रिभुज के तल की लंबवत इकाई वेक्टर है, इसलिए आप सामान्य प्राप्त कर सकते हैं:

N=AB×AC||AB×AC||

कोड में, यह n = normalize(cross(b-a, c-a))उदाहरण के लिए दिखेगा । बस इसे अपने सभी चेहरों पर लागू करें और आपके चेहरे के प्रति आपके मानदंड होंगे।

For each triangle ABC
    n := normalize(cross(B-A, C-A))
    A.n := n
    B.n := n
    C.n := n

ध्यान दें कि यह मानता है कि त्रिकोण के बीच वर्टिकल साझा नहीं किए गए हैं। मैं Kinect API से परिचित नहीं हूं; यह काफी संभव है कि उन्हें साझा किया जाए, जिस स्थिति में आपको उन्हें डुप्लिकेट करना होगा, या अगले समाधान पर जाना होगा:

चिकना छायांकन मानदंड

ऊपर के रूप में गणना किए गए मानदंडों के साथ प्रकाश के बाद, आप देखेंगे कि त्रिकोण किनारों स्पष्ट हैं। यदि यह वांछनीय नहीं है, तो आप एक ही शीर्ष को साझा करने वाले सभी चेहरों को ध्यान में रखते हुए, इसके बजाय चिकनी मानदंडों की गणना कर सकते हैं।

विचार यह है कि यदि एक ही शीर्ष को तीन त्रिकोणों द्वारा साझा किया जाता है T1, T2 तथा T3 उदाहरण के लिए, सामान्य N का औसत होगा N1, N2 तथा N3। इसके अलावा, अगरT1 एक बड़ा त्रिकोण है और T2 एक छोटा सा है, आप शायद चाहते हैं N अधिक प्रभावित होना N1 की तुलना में N2

याद रखें कि क्रॉस उत्पाद क्षेत्र के लिए आनुपातिक कैसे है? यदि आप क्रॉस उत्पादों को जोड़ते हैं तो योग को सामान्य करें, यह ठीक उसी भारित योग को करेगा जो हम चाहते हैं। तो एल्गोरिथ्म बन जाता है:

For each vertex
    vertex.n := (0, 0, 0)

For each triangle ABC
    // compute the cross product and add it to each vertex
    p := cross(B-A, C-A)
    A.n += p
    B.n += p
    C.n += p

For each vertex
    vertex.n := normalize(vertex.n)

इस तकनीक को Iñigo Quilez द्वारा इस लेख में अधिक विस्तार से समझाया गया है: एक जाल का चालाक सामान्यीकरण


मानदंडों पर अधिक जानकारी के लिए, यह भी देखें:


मैं इसे एक
जाप

यह काम किया धन्यवाद एक टन आदमी, यह ठीक उसी तरह काम करता है जैसा मैं चाहता था
अल्जाने


@Allahjane: यह सुनकर खुशी हुई कि यह ठीक काम कर रहा है। :)
जुलिएन गुर्टॉल्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.