2011-06-18 15 views
5

पर क्लिक करें मैं क्यूटी-ओपनजीएल में एक आवेदन करने की कोशिश कर रहा हूं। यहां, मुझे माउस क्लिक के आधार पर क्लिक किए गए ऑब्जेक्ट को जानना होगा। मेरा विचार अंक (QWidget में ऑब्जेक्ट का क्षेत्र) संग्रहीत कर रहा है, और इन बिंदुओं के खिलाफ माउस क्लिक से मेल खाता है। क्या कोई यह कह सकता है कि यह कैसे करें ?, या कोई शरीर किसी अन्य तरीके से दिखा सकता है?क्यूटी ओपनजीएल- माउस के आधार पर ऑब्जेक्ट कैसे प्राप्त करें

उत्तर

14

यह समस्या आमतौर पर "पिकिंग" के रूप में जानी जाती है। ओपनजीएल स्वयं चीजों को खींचता है, इसके बारे में बात करने के लिए कोई ज्यामिति ऑब्जेक्ट प्रबंधन नहीं है (ओपनजीएल में ऑब्जेक्ट्स हैं, लेकिन वे हैं, जो आप सामान्य रूप से संसाधनों को कॉल करते हैं)।

ओपनजीएल को इन दिनों चुनने का सामान्य तरीका क्लिक स्थिति (glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth)) पर गहराई मूल्य पुनर्प्राप्त कर रहा है और इसे विश्व स्थान (gluUnProject(...)) में अप्रचलित कर रहा है। यह आपको क्लिक किए गए बिंदु के (x,y,z) देता है।

चूंकि आप आमतौर पर क्लिक निर्देशांक में उपविभाजन संरचना को घुमाने के द्वारा कुछ स्थानिक उपविभाजन संरचना (बीएसपी, केडी, इत्यादि) में अपनी ज्यामिति का प्रबंधन करेंगे, इसलिए आप उस वस्तु को पुनर्प्राप्त कर सकते हैं।

एक और तरीका एक किरण पेश कर रहा है जो दृश्य में क्लिक का पालन करता है और रे/बाउंडिंग वॉल्यूम चौराहे परीक्षण करता है।

मैं पुराने ओपनजीएल चयन तंत्र के उपयोग को दृढ़ता से हतोत्साहित करता हूं: यह धीमा और उपयोग करने में बोझिल है।

+0

अब शेडर्स प्रचलित हैं, क्या प्रत्येक ऑब्जेक्ट के लिए ऑब्जेक्ट आईडी सेट करना आसान नहीं है और एक अनब्लेंड किए गए छिपे हुए विमान को लिखने के लिए खंड शेडर का उपयोग करना आसान नहीं है? तब उठाकर उस विमान से माउस निर्देशांक पर पढ़ना हो जाता है। अप्रत्यक्ष या ज्यामिति खोज की कोई ज़रूरत नहीं है। –

+1

@ बेन वोगेट: जब तक आप केवल माउस पॉइंटर के नीचे एक ऑब्जेक्ट में रूचि रखते हैं - बेशक यह असुरक्षित विधि से मेल खाता है - फिर हां। यदि आप सूचक के नीचे सभी वस्तुओं में रुचि रखते हैं, तो आपको रे पिकिंग विधि का उपयोग करना होगा, या कुछ गहराई छीलने का उपयोग करना होगा। हालांकि सबसे गंभीर 3 डी अनुप्रयोगों में वस्तुओं को कुछ स्थानिक संरचना का उपयोग करके प्रबंधित किया जाता है, और इसके खिलाफ एक परीक्षण आमतौर पर आसान होता है। – datenwolf

+0

मैं gluUnProject और glReadPixels का उपयोग करके उठा रहा हूं, लेकिन नतीजा हमेशा निकटतम के बजाय सबसे पसंदीदा वस्तु है, किसी भी कारण से? – jondinham

संबंधित मुद्दे