2014-06-23 6 views
5

क्या गहराई मूल्य के बिना 2 डी बिंदु 3 डी में कनवर्ट करने के लिए SceneKit's unprojectPoint का उपयोग करना संभव है? मुझे केवल एक्सजेड विमान में 3 डी स्थान ढूंढना होगा। वाई हमेशा 0 या कोई मान हो सकता है क्योंकि मैं इसका उपयोग नहीं कर रहा हूं।गहराई मूल्य के बिना SceneKit के unprojectPoint का उपयोग करके 2 डी बिंदु से 3 डी को कैसे परिवर्तित करें?

मैं आईओएस 8 बीटा के लिए ऐसा करने की कोशिश कर रहा हूं।

मैं इस तरह जावास्क्रिप्ट और Three.js (WebGL) के साथ कुछ ऐसा ही था:

function getMouse3D(x, y) { 
    var pos = new THREE.Vector3(0, 0, 0); 
    var pMouse = new THREE.Vector3(
     (x/renderer.domElement.width) * 2 - 1, 
     -(y/renderer.domElement.height) * 2 + 1, 
     1 
    ); 
    // 
    projector.unprojectVector(pMouse, camera); 

    var cam = camera.position; 
    var m = pMouse.y/(pMouse.y - cam.y); 

    pos.x = pMouse.x + (cam.x - pMouse.x) * m; 
    pos.z = pMouse.z + (cam.z - pMouse.z) * m; 

    return pos; 
}; 

लेकिन मैं कैसे SceneKit को unprojectVector साथ भाग अनुवाद करने के लिए पता नहीं है।


मैं जो करना चाहता हूं वह केवल एक्सजेड विमान में ऑब्जेक्ट खींचने में सक्षम होना है। ऊर्ध्वाधर धुरी वाई को अनदेखा कर दिया जाएगा।

चूंकि ऑब्जेक्ट को विमान के साथ स्थानांतरित करने की आवश्यकता होगी, इसलिए एक समाधान हिटटेस्ट विधि का उपयोग करना होगा, लेकिन मुझे नहीं लगता कि प्रत्येक स्पर्श/ड्रैग ईवेंट के लिए प्रदर्शन करने के लिए प्रदर्शन के मामले में बहुत अच्छा है। इसके अलावा, यह वस्तु को विमान के बाहर या तो स्थानांतरित करने की अनुमति नहीं देगा।

मैंने स्वीकृत उत्तर here पर आधारित समाधान का प्रयास किया है, लेकिन यह काम नहीं किया। UnprojectPoint के लिए एक गहराई मान का उपयोग करना, यदि ऑब्जेक्ट को +/- Z दिशा में खींचें तो ऑब्जेक्ट बहुत लंबे समय तक उंगली के नीचे नहीं रहता है, लेकिन इसके बजाय यह इससे दूर चला जाता है। मुझे ड्रैग किए गए ऑब्जेक्ट को उंगली के नीचे रहने की आवश्यकता है इससे कोई फर्क नहीं पड़ता कि यह एक्सजेड प्लेन में कहां स्थानांतरित हो गया है।

उत्तर

2

सबसे पहले, क्या आप वास्तव में xz-plane या xy-plane में किसी स्थिति की तलाश में हैं? डिफ़ॉल्ट रूप से, कैमरा -z दिशा में दिखता है, इसलिए 3 डी दृश्य किट समन्वय प्रणाली के x- और y-axes उसी दिशा में जाते हैं जैसे वे 2 डी व्यू समन्वय प्रणाली में करते हैं। (ठीक है, वाई को UIKit में डिफ़ॉल्ट रूप से फ़्लिप किया गया है, लेकिन यह अभी भी ऊर्ध्वाधर धुरी है।) Xz-plane तब स्क्रीन के प्लेन पर ऑर्थोगोनल है।

दूसरा, गहराई मूल्य 2 डी से 3 डी में परिवर्तित करने का एक आवश्यक हिस्सा है। मैं तीन.जेएस पर एक विशेषज्ञ नहीं हूं, लेकिन उनके library documentation (जो स्पष्ट रूप से लिंक नहीं किया जा सकता है) को देखकर, उनके unprojectVector अभी भी Vector3 लेते हैं। और वह है कि आप ऊपर अपने कोड में pMouse के लिए निर्माण कर रहे हैं - एक वेक्टर जिसका z- और y- निर्देशांकों 2 डी माउस स्थिति, और जिसका से आते हैं z निर्देशांक 1.

SceneKit के unprojectPoint उसी तरह काम करता है - यह एक बिंदु लेता है जिसका z-coordinate clip space में गहराई को संदर्भित करता है, और आपके दृश्य के विश्व स्थान में किसी बिंदु पर नक्शा करता है।

यदि आपकी दुनिया की जगह उन्मुख है तो एक्स-और वाई-अक्ष में केवल एक ही भिन्नता है, तो आप किसी भी जेड-वैल्यू को unprojectPoint पर पास कर सकते हैं, और वेक्टर में जेड-वैल्यू को अनदेखा कर सकते हैं पीछे हटो। अन्यथा, दूर क्लिपिंग विमान के लिए 1, या 0 के बीच आधा रास्ते के लिए -1 को पास करने के लिए पास करें - विमान जिसका ज़ेड-समन्वय (कैमरा स्थान में) 0 है। यदि आप दृश्य में नोड को स्थानांतरित करने के लिए अप्रत्याशित बिंदु का उपयोग कर रहे हैं, तो सबसे अच्छा सलाह है कि आप अलग-अलग z-values ​​(-1 और 1 के बीच) को तब तक प्रयास करें जब तक कि आप इच्छित व्यवहार प्राप्त न करें।

हालांकि, यह सोचने का एक अच्छा विचार है कि आप एक अप्रत्याशित वेक्टर का उपयोग कर रहे हैं - यदि अगली चीज़ आप इसके साथ कर रहे हैं तो दृश्य ज्यामिति के साथ छेड़छाड़ के लिए परीक्षण कर रहा है, इसके बजाय hitTest: देखें।

+0

कृपया यह देखने के लिए मेरा उत्तर देखें कि मैं क्या करने की कोशिश कर रहा हूं। – CAM

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