मैं OpenGL में किसी वस्तु को कैसे मोड़ सकता हूं?


11

क्या कोई ऐसा तरीका है जो किसी वस्तु को झुका सकता है, जैसे कि सिलेंडर या ओपन प्लेन का इस्तेमाल करने वाला प्लेन?

मैं एक OpenGL शुरुआत कर रहा हूं (यदि मैं OpenGL ES 2.0 का उपयोग कर रहा हूं, अगर वह मायने रखता है, हालांकि मुझे संदेह है, तो गणित इस मामले में सबसे अधिक मायने रखता है, इसलिए यह किसी भी तरह से स्वतंत्र है), मैं मूल बातें समझता हूं: अनुवाद, घुमाएं, मैट्रिक्स परिवर्तन, आदि। .मैं सोच रहा था कि क्या कोई तकनीक है जो आपको वास्तव में अपनी वस्तुओं की ज्यामिति (इस मामले में उन्हें झुकाकर) बदल सकती है?

किसी भी लिंक, ट्यूटोरियल या अन्य संदर्भों का स्वागत किया जाता है!

जवाबों:


11

एक वस्तु को "मोड़" करने के लिए आपको क्या करना होगा, अनुवाद / रोटेशन / स्केलिंग के कुछ उपयुक्त संयोजन को लागू करने के लिए प्रश्न में वस्तु के कोने के केवल कुछ सबसेट को लागू करना है - संभवतः उस परिवर्तन को उसी के अनुसार भारित करना।

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

यदि आप में रुचि रखते हैं तो बहुत विशिष्ट है, बहुत ही सरल आकृतियों (जैसे आपके उपरोक्त विमान) की एक-एक विकृति आप शायद केवल मैन्युअल रूप से ऐसा कर सकते हैं। उदाहरण के लिए, अपने विमान के लिए "मोड़ अक्ष" पर निर्णय लें और विमान की पंक्ति की प्रत्येक पंक्ति के लिए उपयुक्त परिवर्तनों की गणना करें ताकि इसके बारे में उनकी दूरी के आधार पर उस मोड़ अक्ष के बारे में उपयुक्त घुमाव प्राप्त किया जा सके, और फिर ज्यामिति पर लागू करें (संभवतः) सीपीयू क्योंकि यह सबसे सीधा होगा, कम से कम शुरुआत में)। लेकिन इस तरह की तकनीक अच्छी तरह से पैमाने पर नहीं होगी और बहुत थकाऊ होगी।

चूँकि यह वांछित विकृति (विशेष रूप से अधिक व्यावहारिक और जटिल वस्तुओं के लिए) प्राप्त करने के लिए एक सेट में प्रत्येक व्यक्ति के शीर्ष पर एक परिवर्तन को सही तरीके से वजन करने के लिए इतना बोझिल हो सकता है, कई गेम कंकाल एनीमेशन नामक एक तकनीक का उपयोग करते हैं । उच्च स्तर पर इसमें आपके जाल के साथ ज्यामिति ("कंकाल") का एक अलग सेट शामिल होता है। वह ज्यामिति आपकी वस्तु की हड्डियों का प्रतिनिधित्व करती है, और आप (अक्सर मॉडलिंग टूल में) वास्तविक मॉडल के कंधों और कंकाल की हड्डियों के बीच एक मैपिंग को परिभाषित करते हैं - कौन सी हड्डियां प्रत्येक शीर्ष के साथ जुड़ी होती हैं, और हड्डी कितनी विरूपण को प्रभावित करती है उस शिखर के। फिर कंकाल सीधे एनिमेटेड है, और हड्डियों और उनके कोने के बीच के रिश्ते के माध्यम से एनीमेशन को वास्तविक मॉडल में स्थानांतरित किया जाता है।

आमतौर पर इस तकनीक में, कंकाल और वास्तविक जाल के बीच मानचित्रण को परिसंपत्ति उत्पादन के समय पर परिभाषित किया जाता है। एनिमेशन तब भी बनाए जा सकते हैं, या उन्हें रनटाइम के दौरान प्रक्रियात्मक रूप से बनाया जा सकता है। वास्तविक जाल में एनीमेशन परिवर्तनों का अनुप्रयोग रनटाइम पर होता है। आम तौर पर रनटाइम पर कोई नया वर्टिकल नहीं बनाया जाता है, जिसका अर्थ है कि अच्छी दिखने वाली विकृति की सीमा को मूल रूप से बनाए जाने पर जाली में निश्चित रूप से तय किया जाता है।

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

यह सभी देखें:


9

ताना मारने के वास्तविक गणित के लिए, यह बहुत जटिल हो सकता है, आप यहां क्यों नहीं शुरू करते हैं?

अब मैं इस बारे में बात करूँगा कि आप इसे कैसे लागू कर सकते हैं, यह मानते हुए कि आपको पहले से ही गणित मिल गया है कि आप अपने विकृति को कैसे कम करेंगे।

2 तरीके:

1) हर फ्रेम, सिलेंडर मॉडल में प्रत्येक शीर्ष पर जाएँ और इसे किसी तरह से ऑफसेट करें।

2) जब आप प्रतिपादन कर रहे हों , तो वर्टिश शैडर में कोने को बंद करें । ओपनजीएल ईएस 2.0 वर्टेक्स शेड्स का समर्थन करता है। तो तुम भाग्य में हो, एक तरह से।

क्या आप स्क्रीन पर दिखाई देने वाली वस्तु को केवल ताना देना चाहते हैं , या क्या आप वस्तु को ताना देना चाहते हैं ताकि खेल की प्रत्येक वस्तु को पता चले कि यह विकृत हो गया है?

यदि आप वस्तु को वर्टिकल शेडर में ताना देते हैं, तो यह केवल प्रदर्शन / रेखापुंज के तुरंत पहले होता है , तो इसका मतलब है कि गेम की कोई भी वस्तु विरूपण के बारे में नहीं जानती है । यह ठीक है अगर आप बस स्क्रीन सेवर बना रहे हैं, या यदि विकृति इतनी छोटी है कि उनका वस्तु के टकराने योग्य आकार पर कोई प्रभाव नहीं पड़ता है।

जब आप शीर्ष में ज्यामिति को गर्म करते हैं तो वास्तव में मॉडल के मूल कोने हिलते नहीं हैं , (वे केवल स्थानांतरित करने के लिए दिखाई देते हैं )।

वर्टेक्स शेडर में विकृति

undeformed:

गैर विकृत

विकृत

विकृत

यह cg ट्यूटोरियल के चैप्टर 6 से है , (प्रोग्राम # 14)।

इस विरूपण का उत्पादन करने के लिए shader कोड कुछ इस तरह है

// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;

// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;

// move the vertex
float4 newPosition = position + displacement * displacementDirection ;

// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;

तो आप देख सकते हैं, यह RIGHT BEFORE डिस्प्ले (GPU पर वर्टेक्स शेडर होता है) होता है, इसलिए CPU कोड में व्यावहारिक रूप से परिवर्तित शीर्ष स्थान तक पहुंचने का कोई तरीका नहीं होता है (CPU से डेटा भेजने के तरीके मुख्य रूप से बनावट के माध्यम से होते हैं लेकिन हम वहां नहीं जाएंगे)।


8

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

ऐसा करने के लिए आपको दो चीजों की आवश्यकता होगी:

  1. आपके जाल को बदलने के लिए आपके पास पर्याप्त कोने होने चाहिए। उदाहरण के लिए यदि यह एक विमान है, तो आपको यह सुनिश्चित करने की आवश्यकता होगी कि यह वास्तव में ग्रिड के एक प्रकार के रूप में बनाया गया है, जिसमें आपके विकृत होने के कई कोने हैं। एक सिलेंडर के साथ एक ही बात। यह संभव हो सकता है कि यह रनटाइम के साथ रनटाइम पर प्राप्त हो लेकिन मुझे इस विषय के बारे में ज्यादा जानकारी नहीं है।
  2. आपको वर्टिस को ख़राब करने के लिए एक वर्टेक्स शेडर का उपयोग करना होगा। मूल रूप से वर्टेक्स शेडर प्रत्येक वर्टेक्स की अंतिम रूपांतरित स्थिति की गणना करने का ध्यान रखता है, इसलिए आप किसी भी विकृति को लागू करने का मौका ले सकते हैं।

मुझे यकीन नहीं है कि यह कितना मददगार होगा, लेकिन इस OpenGL संसाधन पर एक नज़र डालें, क्योंकि ऐसा लगता है कि आप जिस चीज़ को पसंद कर रहे हैं, वह सही है:

http://www.ozone3d.net/tutorials/mesh_deformer_p3.php#part_3

उस लिंक से स्क्रीनशॉट:

यहाँ छवि विवरण दर्ज करें

संपादित करें

बस जोश का जवाब देखा और मैं सहमत हूं, कंकाल का एनीमेशन भी इस समस्या को घेरने का एक बहुत ही सुंदर तरीका है, खासकर जब आपके विकृति गणितीय रूप से प्रतिनिधित्व करने के लिए अधिक जटिल और कठिन होने लगती है।

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

और वैसे, आप इन्हें सीपीयू पर भी कर सकते हैं, लेकिन आजकल यह आम तौर पर उन्हें GPU पर करने के लिए एक बेहतर विकल्प है, यही कारण है कि मैंने वर्टेकर shader पर जोर दिया, और आपको इसे देखना चाहिए। यह वास्तव में इतना कठिन नहीं है कि यह सीपीयू पर किसी भी तरह से प्रोग्रामवाइज़ है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.