2017-06-07 7 views
11

मैं एआरकेट की कोशिश कर रहा हूं, और मैंने this tutorial का उपयोग कर ARSCNView सेट अप किया है।एआरकेट के साथ एक डीएई फ़ाइल प्रदर्शित करना और दृश्य में एंकर को ट्रैक करना

फिर this tutorial.

के दूसरे भाग के साथ ट्रैकिंग क्षैतिज 3 डी विमानों की स्थापना की मैं एक ही दृश्य आवेदन बनाया तो मेरे ViewController के लिए एक आउटलेट के साथ रूट दृश्य में एक ARSCNView फ्लश विवश है।

यहाँ ViewController में कोड है:

import UIKit 
import ARKit 

class ViewController: UIViewController { 

    //MARK: Properties 
    @IBOutlet weak var arScene: ARSCNView! 

    //MARK: ARKit variables 
    var realityConfiguration: ARWorldTrackingSessionConfiguration? 

    //MARK: Lifecycle 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     self.prepare() 
    } 

    //MARK: Actions 


    //MARK: Overrides 
} 

extension ViewController { 
    func prepare() { 
     //Check to see if active reality is supported 
     guard ARSessionConfiguration.isSupported else { 
      //Custom alert function that just quickly displays a UIAlertController 
      AppDelegate.alert(title: "Not Supported", message: "Active Reality is not supported on this device") 
      return 
     } 
     //Set up the ARSessionConfiguration 
     self.realityConfiguration = ARWorldTrackingSessionConfiguration() 
     //Set up the ARSCNView 
     guard let config = self.realityConfiguration else { 
      return 
     } 
     //Run the ARSCNView and set its delegate 
     self.arScene.session.run(config) 
     self.arScene.delegate = self 
    } 
} 

extension ViewController: ARSCNViewDelegate { 
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 
     return nil 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) { 
     guard let planAnchor = anchor as? ARPlaneAnchor else { 
      return 
     } 

     let plane = SCNPlane(width: CGFloat(planAnchor.extent.x), height: CGFloat(planAnchor.extent.z)) 
     let planeNode = SCNNode(geometry: plane) 
     planeNode.position = SCNVector3Make(planAnchor.center.x, 0, planAnchor.center.z) 

     planeNode.transform = SCNMatrix4MakeRotation(-Float.pi/2, 1, 0, 0) 

     node.addChildNode(planeNode) 

    } 

    func renderer(_ renderer: SCNSceneRenderer, willUpdate node: SCNNode, for anchor: ARAnchor) { 
     print("Will updated Node on Anchor: \(anchor.identifier)") 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { 
     print("Did updated Node on Anchor: \(anchor.identifier)") 
    } 

    func renderer(_ renderer: SCNSceneRenderer, didRemove node: SCNNode, for anchor: ARAnchor) { 
     print("Removed Node on Anchor: \(anchor.identifier)") 
    } 
} 

मैंने डाउनलोड Xcode 9 बीटा, इसके बाद एप्पल के ट्यूटोरियल और महसूस किया मेरे फोन (iPhone 6) ए 9 चिप ARWorldTrackingSessionConfiguration वस्तु के लिए आवश्यक नहीं है।

मेरे द्वारा लिंक किए गए पहले ट्यूटोरियल में लगभग आधे रास्ते में, ऐप्पल का कहना है कि आप अभी भी ए 9 चिप के बिना एआर अनुभव बना सकते हैं। हालांकि, वे आगे की जानकारी में नहीं जाते हैं। है किसी और एक प्रारंभिक बिंदु पाया, और यह

  • प्रदर्शित करने के लिए एक लंगर बिंदु का चयन एक .dae फ़ाइल और

    • का उपयोग कर ट्रैकिंग कि लंगर बिंदु
    • असल में प्रदर्शित करने का एक कोड उदाहरण प्रदान करने को तैयार है। डीएई फ़ाइल
  • +0

    आप Augmented Reality टेम्पलेट के साथ एक नया आईओएस एप्लिकेशन बना सकते हैं, और सामग्री प्रौद्योगिकी पॉपअप मेनू से SceneKit या SpriteKit चुनें। –

    उत्तर

    30

    आपके कोड का उपयोग करने के लिए वास्तव में कुछ भी नहीं है - बस एक लाइव कैमरा व्यू।

    मुख्य कारण यह है कि आप अपनी वास्तविकता में कोई वृद्धि नहीं देख रहे हैं, यह है कि आपका कोड केवल दृश्य में दृश्यकिट सामग्री जोड़ता है जब एंकर ARSession में जोड़े जाते हैं ... लेकिन आप मैन्युअल रूप से कोई एंकर नहीं जोड़ रहे हैं, और आप विमान पहचान को सक्षम नहीं किया है इसलिए ARKit स्वचालित रूप से एंकर जोड़ नहीं रहा है। आप हवाई जहाज का पता लगाने में सक्षम बनाते हैं, तो आप कहीं हो रही है ...

    self.realityConfiguration = ARWorldTrackingSessionConfiguration() 
    realityConfiguration?.planeDetection = .horizontal 
    

    शुरू करेंगे लेकिन आप अभी भी कुछ भी नहीं देख सकेंगे। ऐसा इसलिए है क्योंकि आपके ARSCNViewDelegate कार्यान्वयन में विरोधाभासी निर्देश हैं। यह हिस्सा:

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? { 
        return nil 
    } 
    

    ... मतलब है कि कोई SceneKit नोड्स अपने एंकर के लिए बनाया जाएगा। चूंकि कोई नोड्स नहीं है, इसलिए आपके renderer(_:didAdd:for:) फ़ंक्शन को कभी भी नहीं कहा जा रहा है, इसलिए उस विधि के भीतर आपका कोड कभी भी कोई दृश्यकिट सामग्री नहीं बना रहा है।

    अगर आप हवाई जहाज पहचान चालू करने और हटाने/बाहर टिप्पणी renderer(_: nodeFor:) विधि, अपने कोड के बाकी आप कुछ इस तरह मिलना चाहिए:।

    (शुद्ध सफेद क्षेत्र अपने SCNPlane मैं है सफेद टेबल पर अपना आईपैड कवर खोलना पड़ा था, कुछ भी ढूंढने के लिए विमान पहचान के लिए पर्याप्त दृश्य विवरण प्राप्त करें। इसके अलावा, पृष्ठभूमि की जांच करें ... वास्तव में डब्ल्यूडब्ल्यूडीसी में एक पल था जहां मर्च स्टोर लोगों से भरा नहीं था।) आप एक ए 9 की जरूरत है कि क्या के लिए

    के रूप में , ऐप्पल का संदेश यहां थोड़ा अस्पष्ट है। जब वे कहते हैं कि एआरकेट को ए 9 या बेहतर की आवश्यकता है, तो उनका वास्तव में क्या मतलब है ARWorldTrackingSessionConfiguration करता है। और यही वह जगह है जहां सभी बेहतरीन एआर जादू है।(यहां तक ​​कि एक UIRequiredDeviceCapabilities है कि वास्तव में दुनिया पर नज़र रखने के समर्थन के साथ उपकरणों को शामिल किया गया arkit के लिए महत्वपूर्ण है, तो आप केवल उन उपकरणों के लिए पेशकश की जा रही करने के लिए App स्टोर पर अपने ऐप सीमित कर सकते हैं।)

    अभी भी दुनिया पर नज़र रखने के बिना है कुछ ARKit, हालांकि। बेस क्लास ARSessionConfiguration के साथ एक सत्र चलाएं और आपको अभिविन्यास-केवल ट्रैकिंग मिलती है। (कोई स्थिति ट्रैकिंग नहीं, कोई विमान पहचान नहीं, कोई हिट परीक्षण नहीं।)

    इससे आपको क्या मिलता है? खैर, यदि आपने पोकेमॉन गो का वर्तमान संस्करण खेला है, तो यह इस तरह काम करता है: क्योंकि यह केवल डिवाइस अभिविन्यास को ट्रैक करता है, स्थिति नहीं, आप पिकाचु के नजदीक नहीं जा सकते हैं या उसके पीछे घूम सकते हैं - यह भ्रम कि वह असली है दुनिया तब तक रखती है जब तक आप इसे बिना घुमाने के अपने डिवाइस को झुकाएं या चालू करें।

    आप सीनियरकिट के साथ 3 डी सामग्री लोड करते हैं और इसे एआर में डालते हैं जैसे आप लोड करते हैं और इसे किसी अन्य सीनकेकिट ऐप/गेम में रखते हैं। इसके लिए बहुत सारे संसाधन हैं, और इसे करने के कई तरीके हैं। जब आप एक नई एआर प्रोजेक्ट बनाते हैं और सीनकिट चुनते हैं तो उनमें से एक आपको एक्सकोड टेम्पलेट में मिलेगा। लोड हो रहा है हिस्सा कुछ इस तरह चला जाता है:

    let scene = SCNScene(named: "ship.scn" inDirectory: "assets.scnassets") 
    let ship = scene.rootNode.childNode(withName: "ship", recursively: true) 
    

    तो यह जगह:

    ship.simdPosition = float3(0, 0, -0.5) 
    // half a meter in front of the *initial* camera position 
    myARSCNView.scene.rootNode.addChildNode(ship) 
    

    मुख्य अंतर यह एआर में चीजों को रखने के लिए याद करने के लिए है कि पदों मीटर में मापा जाता है (और अपनी सामग्री की जरूरत है डिजाइन किया जाना चाहिए ताकि यह समझ में मीटर में आकार का हो)।

    +0

    धन्यवाद रिकस्टर! आशा है कि आप डब्ल्यूडब्ल्यूडीसी में एक विस्फोट कर रहे हैं। अब मैं देखता हूं कि मेरे प्रतिनिधि तरीके विवादित हैं। मैंने सोचा कि 'ARWorldTrackingSessionConfiguration.planeDetection' डिफ़ॉल्ट रूप से चालू था लेकिन मैंने फिर से दस्तावेज़ों की जांच की और निश्चित रूप से पर्याप्त! –

    +0

    @ जोनवोगेल मुझे लगता है कि यह डिफ़ॉल्ट रूप से बंद है इसलिए आपको इसे काम करने के लिए इसे स्पष्ट रूप से सेट करना होगा, यह अब भी 'ARWorldTrackingConfiguration.PlaneDetection' है। – chengsam

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