2017-07-10 7 views
7

अरे मैं यह पता लगाने की जगह में एक साधारण नोड मैं ARKit में इसके चारों ओर चलना है रखने के लिए कोशिश कर रहा हूँ कैसेजगह में ARKit SCNNode रखने के लिए कैसे

कोड:

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { 

    if let planeAnchor = anchor as? ARPlaneAnchor { 

    if planeDetected == false { // Bool only allows 1 plane to be added 
      planeDetected = true 
     self.addPlane(node: node, anchor: planeAnchor) 
    } 

    } 
} 

यह SCNNode कहते हैं

func addPlane(node: SCNNode, anchor: ARPlaneAnchor) { 

    // We add the anchor plane here 

    let showDebugVisuals = Bool() 
    let plane = Plane(anchor, showDebugVisuals) 
    planes[anchor] = plane 
    node.addChildNode(plane) 



    // We add our custom SCNNode here 

    let scene = SCNScene(named: "art.scnassets/PlayerModel.scn")! 
    let Body = scene.rootNode.childNode(withName: "Body", recursively: true)! 

    Body.position = SCNVector3.positionFromTransform(anchor.transform) 
    Body.movabilityHint = .movable 
    wrapperNode.position = SCNVector3.positionFromTransform(anchor.transform) 

    wrapperNode.addChildNode(Body) 

    scnView.scene.rootNode.addChildNode(wrapperNode) 

Ive एक विमान/एंकर नोड जोड़ते और उसे में "द बॉडी" नोड डालने की कोशिश की लेकिन यह अभी भी ले जाता है। मैंने सोचा कि शायद यह अद्यतन समारोह के साथ कुछ करने के लिए है।

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { 
} 

या सबसे अधिक संभावना स्थिति की स्थापना

wrapperNode.position = SCNVector3.positionFromTransform(anchor.transform) 

iv'e हर स्रोत/प्रोजेक्ट फाइल/इंटरनेट पर वीडियो के माध्यम से देखा और कोई भी इस साधारण सी समस्या के लिए एक सरल उपाय है।

+0

कोई आसान समाधान नहीं है। आपको बेहतर परिणाम के लिए सतह का पता लगाना चाहिए, लेकिन ऑब्जेक्ट्स अभी भी थोड़ा आगे बढ़ेंगे। –

+0

ठीक है यह पुष्टि करने के लिए धन्यवाद कि वास्तव में एक सरल समाधान नहीं है। – Hunter

उत्तर

16

"इधर-उधर जाने" है कि यहां हो रहा हो सकता के दो प्रकार होते हैं।


एक यह है कि ARKit लगातार वास्तविक दुनिया में डिवाइस की स्थिति सार करने के लिए नक्शे कैसे अंतरिक्ष आप में आभासी सामग्री डाल रहे हैं समन्वय के अपने अनुमान को परिष्कृत किया जाता है। उदाहरण के लिए, आप (0, 0, -0.5) पर एक आभासी वस्तु डाल लगता है , और उसके बाद अपने डिवाइस को बाईं ओर 10 सेमी तक ले जाएं। वर्चुअल ऑब्जेक्ट केवल तभी भौतिक स्थान में लगाया जाएगा जब एआरकिट ठीक से चलती है। लेकिन दृश्य जड़त्वीय odometry एक सटीक विज्ञान नहीं है, इसलिए यह संभव ARKit आप 10.5 सेमी द्वारा छोड़ा के लिए चले गए सोचता है कि है - उस स्थिति में, अपने आभासी वस्तु दिखाई देगी 5 मिमी से सही करने के लिए "पर्ची", भले ही करने के लिए अपने ARKit/SceneKit समन्वय अंतरिक्ष में स्थिति।

आप वास्तव में इस बारे में ज्यादा, आशा है कि एप्पल बेहतर सेंसर, बेहतर कैमरा, या बेहतर सीपीयू/GPUs के साथ उपकरणों बनाता है और दुनिया के विज्ञान पर नज़र रखने को बेहतर बनाता है के अलावा अन्य नहीं कर सकते। (समय की परिपूर्णता में, कि शायद एक सुरक्षित शर्त है, हालांकि कि शायद अपने वर्तमान परियोजना के साथ मदद नहीं करता है।)


आप भी विमान का पता लगाने के साथ काम कर रहे हैं, वहाँ एक और शिकन है। एआरकिट अपने अनुमानों को लगातार परिष्कृत कर रहा है जहां एक पता लगाया गया विमान है। तो, भले ही विमान की वास्तविक दुनिया की स्थिति को बदलने नहीं है, ARKit/SceneKit में अपनी स्थिति समन्वय जगह नहीं है।

आंदोलन इस तरह की आम तौर पर एक अच्छी बात है - आप अपने वर्चुअल वस्तु वास्तविक दुनिया की सतह के लिए लंगर डाले प्रकट करना चाहते हैं, तुम कहाँ है कि सतह है के बारे में सुनिश्चित होना चाहते हैं। के रूप में विमान का पता लगाने सतह की स्थिति की अधिक यकीन हो जाता है आप कुछ आंदोलन देखेंगे, लेकिन थोड़े समय के बाद, आप कम "पर्ची" देखना चाहिए के रूप में आपको लगता है कि सिर्फ दुनिया में तैर रहे हैं उन लोगों की तुलना योजना-लंगर डाले आभासी वस्तुओं के लिए चारों ओर ले जाने के लिए कैमरा अंतरिक्ष।


अपने कोड में, हालांकि, आप लाभ विमान का पता लगाने के नहीं ले जा रहे हैं ("PlayerModel.scn" से) अपने कस्टम सामग्री बनाने के लिए हवाई जहाज लंगर से चिपक:

wrapperNode.position = SCNVector3.positionFromTransform(anchor.transform) 
wrapperNode.addChildNode(Body) 
scnView.scene.rootNode.addChildNode(wrapperNode) 

इस कोड विश्व अंतरिक्ष में wrapperNode को स्थान देने के लिए प्रारंभिक स्थिति एंकर की स्थिति का उपयोग करता है (क्योंकि आप इसे रूट नोड का बच्चा बना रहे हैं)।यदि आप इसके बजाय wrapperNode विमान एंकर के नोड के बच्चे (जिसे आप renderer(_:didAdd:for:) में प्राप्त करते हैं) बनाते हैं, तो यह विमान से जुड़ा रहेगा क्योंकि एआरकिट विमान की स्थिति के अनुमान को परिशोधित करता है। आपको शुरुआत में थोड़ा और अधिक आंदोलन मिलेगा, लेकिन विमान पहचान "बसने" के रूप में, आपका वर्चुअल ऑब्जेक्ट कम "पर्ची" करेगा।

(जब आप विमान के बच्चे को नोड बनाते हैं, तो आपको अपनी स्थिति निर्धारित करने की आवश्यकता नहीं होती है - शून्य की स्थिति का मतलब है कि यह सही है जहां विमान है। कुछ भी, आपको इसकी स्थिति केवल सापेक्ष निर्धारित करने की आवश्यकता है विमान - यानी इसके ऊपर/नीचे/कितना है।)

+0

आपको महान उत्तर धन्यवाद! – Hunter

+0

ऐप्पल देव ने इस परियोजना https://github.com/gao0122/ARKit-Example-by- एप्पल में अधिक विवरण उदाहरण प्रदान किया है यह सब कुछ ठीक से और सरल समझाता है। – mychar

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