3D ऑब्जेक्ट के परिवर्तनों में हेरफेर के लिए ट्रांसलेशन, स्केल, रोटेशन गिज़्मोस को कैसे लागू किया जाए?


11

मैं एक बुनियादी 3 डी संपादक विकसित करने की प्रक्रिया में हूं। यह 3D दुनिया के प्रतिपादन के लिए OpenGL का उपयोग करता है। अभी मेरा दृश्य विभिन्न आकारों के केवल कुछ बक्से हैं और मैं उस स्तर पर हूं जहां मैं प्रत्येक बॉक्स का चयन करने में सक्षम होना चाहता हूं और फिर किसी भी परिवर्तन को प्राप्त करने के लिए इसे स्थानांतरित / स्केल / घुमाता हूं।

मैं इन टूल के gizmos (या हैंडल, या लोग आमतौर पर कैसे कॉल करते हैं) के प्रतिपादन दोनों को लागू करने की समस्या को हल कर सकते हैं, और अपने माउस के साथ परिवर्तन में प्रदर्शन करने के लिए प्रत्येक अक्ष पर उन्हें उठा सकते हैं? विस्तृत जानकारी के लिए: यहाँ छवि विवरण दर्ज करें

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


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

जवाबों:


9

ई-ऑन पर मेरे समय में कुछ बिंदु पर मैंने Vue उत्पाद लाइन के gizmos को बनाए रखा है ।
मैं आपको बता सकता हूं, आपको कई दिन लगेंगे, पूरा समय।
जब तक आपको कुछ लाइब्रेरी या सुपर चालाक रास्ता नहीं मिल जाता है, क्लासिक तरीका यह है कि जब आप क्लिक करते हैं, तो विंडो में माउस का समन्वय प्राप्त हो, अगर इसके रिश्तेदार व्यूपोर्ट में समन्वय करते हैं, तो आप बस x और y को चौड़ाई और ऊंचाई से विभाजित कर सकते हैं, आप [0,1] रेंज में एक वेक्टर (फ्लोट 2 डी) प्राप्त करें। x (y) के लिए [-0.5, 0.5] श्रेणी में लाने के लिए इसे (0.5,0.5) घटाएं।
फिर, आप एक्स और वाई का उपयोग करके इस किरण से एक किरण बनाते हैं जैसे कि किरण एक्स और वाई, और आप फोकल दूरी पर z सेट करते हैं। कभी-कभी पहलू अनुपात इस ऑपरेशन में गधे में दर्द होता है। थोड़ी सी फिडिंग और ट्रायल एरर आपको ठीक कर देगा।
फिर, आपको अपने गिज़्मोस तत्वों के साथ चौराहे की जांच करने की आवश्यकता है, या तो आपके पास एक जाल है जो आपने उत्पन्न किया है, या ब्लेंडर या अन्य डीसीसी, या जाली भागों में मॉडलिंग की है जो एक दूसरे के बीच स्पष्ट कर सकते हैं ... बस उन मेष भाग को किरण के रूप में उपयोग करें / त्रिकोण चौराहा क्वेरी।
या यदि आपके पास यह है, तो रे / सिलिंडर, रे / गोले के अनुसार आपके सुविधाजनक रूप और भाग।
आपको चौराहे की दिनचर्या की आवश्यकता होती है जो कि वे टकराते हुए आदिम पर एक परिवर्तन मैट्रिक्स को लागू करने में सक्षम होते हैं । अत्यंत महत्वपूर्ण है क्योंकि आपका एप्रोच उस वस्तु के साथ अनुवाद करेगा जिसे वह स्थानांतरित करने के लिए कार्य करता है, यह घुमाएगा, और यह कैमरे के लिए दूरी के व्युत्क्रम के साथ स्केल करेगा, ताकि यह स्क्रीन पर एक निश्चित अनुमानित आकार रखता है।
तब आपके पास इंटरैक्शन का हिस्सा होता है, सबसे आसान बिंदु का डेल्टा होता है जब माउस पहले "माउस डाउन" ईवेंट था, और शुद्ध 2 डी में वर्तमान "माउस चाल" स्थिति, और वर्तमान अक्ष आंदोलन के रूप में इस डेल्टा का उपयोग करें। दुनिया अंतरिक्ष में, कुछ है kकि आप अनुभवजन्य निर्णय से गुणा । आपकी आंतरिक इकाइयों बनाम पिक्सेल बनाम ज़ूम के मौजूदा पैमाने आदि के अनुसार ..
अंतिम चरण बस हेरफेर की मैट्रिक्स को हेरफेर किए गए ऑब्जेक्ट पर लागू करना है, ताकि वह इसका अनुसरण करे।

मैं आपको बताता हूं कि इसे लागू करने के लिए नरक में काफी यात्रा है, और यदि आप इसे अपने खाली समय में एक सप्ताह से अधिक समय तक करते हैं। यदि आप पूरी तरह से क्षेत्र की खोज कर रहे हैं तो कई सप्ताह। यदि आपके सप्ताह के अंत अन्य गतिविधियों के साथ व्यस्त हैं तो एक महीने से अधिक :)

मेरा सुझाव है कि आप एम्ब्री 2.0 को इंटेल से डाउनलोड करें, ताकि आप के लिए किरण / त्रिभुज प्रतिच्छेदन क्वेरी कर सकें, इसलिए आपको कोडिंग के बारे में चिंता करने की आवश्यकता नहीं है। या आप बेरहम कॉपी / पेस्ट और ब्लेंडर से कोड को अनुकूलित कर सकते हैं ... मुझे लगता है कि वे अपाचे लाइसेंस में चले गए? कानूनी रूप से संभव होना चाहिए।


1
आप जवाब के लिए बहुत बहुत धन्यवाद। यह वास्तव में मददगार है। मुझे पता था कि मैं पागल नहीं था जब मैं एक स्पष्ट रूप से आसान काम से अभिभूत महसूस कर रहा था। मैं इसकी कठिनाई को कम आंकता हूं और दिनों तक उसी समस्या पर अटका रहा। अगली बार जब मैं जाऊंगा और इसे संभालूंगा, तो मुझे यकीन है कि मैंने एक अच्छी योजना बनाई होगी। धन्यवाद
Grimshaw

0

मैनिप्युलेटर-अनुवादक के लिए मैं फॉलो एल्गोरिथ्म का उपयोग करता हूं:

1) जब माउस नीचे आता है, तो हमें यह जांचना होगा कि किरण ने तीर को काट दिया है या नहीं। उदाहरण के लिए हम एक्स एरो पर विचार करते हैं। हम रे का निर्माण विश्व अंतरिक्ष में (कैमरा फ्रूटम और माउस स्थिति के आधार पर) करते हैं। हम एक विमान का निर्माण करते हैं जिसमें x अक्ष निहित होता है: इसका सामान्य बराबर V क्रॉस X क्रॉस V होता है, जहां V - सदिश केंद्र से कैमरा तक, X - x अक्ष का प्रतिनिधित्व करता है। फिर हम विमान के साथ किरण को काटते हैं और इसलिए हम दुनिया के निर्देशांक में प्रतिच्छेदन बिंदु पाते हैं। फिर हम एक्स अक्ष खंड और परिणामी बिंदु को स्क्रीन पर प्रोजेक्ट करते हैं, अनुमानित खंड और स्क्रीन पर अनुमानित बिंदु के बीच की दूरी का पता लगाते हैं। यदि यह कुछ पिक्सल्स से कम है, तो माउस अक्ष को नियंत्रित करता है। इसके अलावा, हम चयन के केंद्र और हमारे चौराहे के बीच विश्व अंतरिक्ष डेल्टा वेक्टर की गणना करते हैं।

यह प्रक्रिया हम 3 अक्ष के लिए करते हैं, इसलिए हम सभी अक्ष पर दूरी पाते हैं। न्यूनतम दूरी ज्ञात कीजिए। इसलिए हमने पाया कि माउस किस अक्ष पर स्थित है।

2) जब माउस चलते हैं। हम जानते हैं कि ऑब्जेक्ट किस अक्ष से चलता है (1 से)। हम विमान के साथ किरण का विश्व अंतरिक्ष चौराहा पाते हैं (1 के रूप में)। इसके अलावा, हम उस बिंदु पर चौराहे के बिंदु को प्रोजेक्ट करते हैं जिस पर ऑब्जेक्ट चलता है। अंतिम जोड़तोड़ की स्थिति = चौराहा + डेल्टा।

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