2017-09-13 8 views
7

मैं 3 डी ऑब्जेक्ट्स प्रदर्शित करने के लिए ARKit का उपयोग कर रहा हूं। मैं उपयोगकर्ता के सामने वास्तविक दुनिया में नोड्स रखने में कामयाब रहा (कैमरा उर्फ)। लेकिन जब मैं उन्हें छोड़ देता हूं तो मैं कैमरे का सामना करने के लिए उन्हें प्रबंधित नहीं करता हूं।ARKit कैमरे का सामना करने वाला एक एससीएन नोड रखें

let tap_point=CGPoint(x: x, y: y) 
let results=arscn_view.hitTest(tap_point, types: .estimatedHorizontalPlane) 
guard results.count>0 else{ 
    return 
} 
guard let r=results.first else{ 
    return 
} 

let hit_tf=SCNMatrix4(r.worldTransform) 
let new_pos=SCNVector3Make(hit_tf.m41, hit_tf.m42+Float(0.2), hit_tf.m43) 

guard let scene=SCNScene(named: file_name) else{ 
    return 
} 
guard let node=scene.rootNode.childNode(withName: "Mesh", recursively: true) else{ 
    return 
} 
node.position=new_pos 
arscn_view.scene.rootNode.addChildNode(node) 

नोड्स कैमरे के सामने विमान पर अच्छी तरह से स्थित हैं। लेकिन वे सभी एक ही दिशा में देख रहे हैं। मुझे लगता है कि मुझे SCNNode घुमाएं, लेकिन मैंने ऐसा करने का प्रबंधन नहीं किया।

उत्तर

0

क्या आप चाहते हैं कि कैमरे हमेशा कैमरे का सामना करें, कैमरा भी चलता है? यही कारण है कि SceneKit constraints के लिए हैं। या तो SCNLookAtConstraint या SCNBillboardConstraint हमेशा नोड को कैमरे पर इंगित कर सकता है।

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

+0

में सहायता करता है दूसरा :) मैं चाहता हूं कि जब मैं इसे रखूं तो नोड को कैमरे का सामना करना पड़ेगा तो इसे यहां रखें (और चारों ओर स्थानांतरित करने में सक्षम हो)। –

+0

मुझे समझ में नहीं आता कि आप क्या कहेंगे> अपनी 3 डी संपत्तियों को डिज़ाइन करें ताकि "फ्रंट" हमेशा सकारात्मक जेड-अक्ष दिशा में हो। मेरे पास एक डीएई फ़ाइल है जिसे मैंने एक्सकोड में स्कैन में परिवर्तित किया है। नोड स्थिति (0, 0, 0) है। लेकिन मैंने ऑब्जेक्ट को मेरे सामने रखने के लिए कैमरे को (0, 0, 0.9) पर भी रखा। कैमरे को सटीक बनाने के लिए महत्वपूर्ण हो सकता है नोड पदानुक्रम (एक सबनोड मुझे लगता है) में है। –

+0

जब मैं उन्हें छोड़ देता हूं तो कैमरे के सामने नोड हमेशा सही होते हैं, वे दिखाई देते हैं (कैमरे के पीछे नहीं)। अगर मैं कमरे में जाता हूं और कई नोड्स छोड़ देता हूं तो वे सभी तरह के समानांतर होते हैं। जब मैं पहला नोड छोड़ देता हूं, तो यह "मुझे देख रहा है"। लेकिन अगले नहीं। मुझे नहीं पता कि मैं क्या कहता हूं स्पष्ट है ...:/ –

1

पहले, कैमरा के रोटेशन मैट्रिक्स मिलती है: मैट्रिक्स

let rotate = simd_float4x4(SCNMatrix4MakeRotation(sceneView.session.currentFrame!.camera.eulerAngles.y, 0, 1, 0)) 

फिर, गठबंधन:

let rotateTransform = simd_mul(r.worldTransform, rotate) 

अन्त में, एक अपने नोड के लिए बदलने लागू SCNMatrix4 के रूप में कास्टिंग:

node.transform = SCNMatrix4(rotateTransform) 

आशा है कि

+0

"आर.वर्ल्ड ट्रान्सफॉर्म" का क्या अर्थ है? मैं नहीं करता देखें कि यह क्या हो सकता है। –

+0

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

+0

आह ठीक है, मुझे लगता है कि दुनिया में परिवर्तन क्या है/करता है, बस नहीं, जहां से आया था, धन्यवाद! –

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