2011-04-04 23 views
5

मेरे पास एक 3 डी मॉडल है जिसमें बिंदु चरम (XYZ) और अंततः त्रिकोणीय चेहरे शामिल हैं। ओपनजीएल या कैमरा-व्यू-मैट्रिक्स-प्रोजेक्शन का उपयोग करके मैं 3 डी मॉडल को 2 डी प्लेन पर प्रोजेक्ट कर सकता हूं, यानी एक दृश्य विंडो या एम * एन रिज़ॉल्यूशन वाला एक छवि।2 डी प्रोजेक्शन से 3 डी पॉइंट क्लाउड पर मैपिंग

प्रश्न यह है कि मैं 2 डी प्रक्षेपण योजना और उसके संबंधित वर्टेक्स (या चेहरे) से मूल 3 डी मॉडल से पिक्सेल के बीच पत्राचार के बीच पत्राचार कैसे निर्धारित कर सकता हूं।

अर्थात्,
2 डी प्रोजेक्शन से दिए गए पिक्सेल के लिए 3 डी मॉडल में सबसे नज़दीकी कोष्ठक क्या है?
यह ओपनजीएल या रेएट्रैसिंग समस्या में पिकिंग की तरह लगता है। क्या कोई आसान समाधान है?

रे ट्रेसिंग के विचार के साथ यह वास्तव में दृश्य बिंदु से किरण के साथ छेड़छाड़ किए गए पहले चरम/चेहरे को ढूंढने के बारे में है। क्या कोई मुझे कुछ ट्यूटोरियल या उदाहरण दिखा सकता है? मैं ओपनजीएल का उपयोग करने से स्वतंत्र एल्गोरिदम खोजना चाहता हूं।

उत्तर

2

ओपनजीएल में हिट परीक्षण आमतौर पर बिना किसी रेट्रैसिंग के किया जाता है। इसके बजाय, जैसा कि प्रत्येक आदिम प्रदान किया जाता है, आउटपुट में एक विमान आदिम की अद्वितीय आईडी को स्टोर करने के लिए उपयोग किया जाता है। हिट परीक्षण कर्सर स्थान पर आईडी प्लेन पढ़ने के समान सरल है।

+0

हाय। क्या आप इस पर विस्तृत जानकारी दे सकते हैं? मेरे पास 3 डी पॉइंट क्लाउड है और प्रत्येक बिंदु में XYZRGB है। छवि पर बिंदु बादल के प्रक्षेपण के बाद, क्या मैं पिक्सेल निर्देशांक से अपना मूल (एक्स, वाई, जेड) प्राप्त कर सकता हूं? मुझे सभी पिक्सेल के मूल स्थान की आवश्यकता है। – Ankitp94

1

मेरा (संभवतः बेवकूफ) विचार शिखर की एक सरणी बनाना होगा और फिर अपनी स्क्रीन बिंदु पर अनुमान लगाए जाने के बाद उन्हें अपनी दूरी (या दूरी के लिए दूरी, स्क्वायर के लिए) क्रमबद्ध करें। सूची में पहला आइटम निकटतम होगा। यह ओ (एन)एन शिखर के लिए होगा, लेकिन इससे भी बदतर नहीं होगा।

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

उदाहरण के लिए

, छद्म कोड में:

function findPointFromViewPortXY(pointOnViewport) 
    closestPoint = false 
    bestDistance = false 
    for (each point in points) 
    projectedXY  = projectOntoViewport(point) 
    distanceSquared = distanceBetween(projectedXY, pointOnViewport) 
    if bestDistance==false or distanceSquared<bestDistance 
     closestPoint = point 
     bestDistance = distanceSquared 
    return closestPoint 
+0

2 डी प्रक्षेपण में सबसे नज़दीकी बिंदु 3 डी स्पेस में बहुत दूर हो सकता है। –

+0

@ माइकडैनियल मुझे यकीन नहीं है कि आपका क्या मतलब है। हां, यह विमान पर प्रक्षेपण से 3 डी स्पेस में बहुत दूर हो सकता है, लेकिन मुझे यह बात नहीं है। जैसा कि मैं इसे समझता हूं, ओपी में स्क्रीन पर 3 डी पॉइंट क्लाउड दिया जाता है, उपयोगकर्ता एक बिंदु का चयन करने के लिए स्क्रीन पर क्लिक कर रहा है, और ओपी यह चुनने की कोशिश कर रहा है कि कौन सा बिंदु चुना गया बिंदु पर निकटतम (स्क्रीन पर) है। – Phrogz

+0

क्षमा करें मुझे आपका विचार नहीं मिल सकता है। मुझे किस प्रकार की दूरी की गणना और क्रमबद्ध करना चाहिए? – elgcom

1

बेन वोइट के जवाब के अलावा:

  1. आप pickable वस्तुओं पर एक अलग पास करते हैं, तो आप सेट कर सकते हैं केवल एक सिंगल पिक्सेल रखने के लिए व्यूपोर्ट जिसे आप पढ़ेंगे।

  2. आप ज्यामिति शेडर (gl_PrimitiveID) का उपयोग कर त्रिकोण आईडी को भी एन्कोड कर सकते हैं।

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