2017-07-07 8 views
5

मेरे ARKit ऐप में मैं एक मोडल विंडो प्रस्तुत कर रहा हूं। जब मैं मोडल बंद करने और वापस ARSCNView के पास जाओ तो मुझे पता है कि सत्र के लिए इस कोड की वजह से रोक दिया गया है:ARKit सत्र रोका गया और

override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 

     // Pause the view's session 
     sceneView.session.pause() 
    } 

जब मैं मॉडल को बंद करने और ARKit कैमरा दृश्य स्क्रीन पर वापस जाने के लिए इस कोड निकाल दिया जाता :

override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     // Create a session configuration 
     let configuration = ARWorldTrackingSessionConfiguration() 

     // Run the view's session 
     sceneView.session.run(configuration) 
    } 

लेकिन यह कोड सत्र को फिर से शुरू नहीं करता है। स्क्रीन को पढ़ने वाली आखिरी छवि पर पूरी तरह जमे हुए है। कोई विचार?

मैं viewDidAppear कोड को निम्न होने के लिए अद्यतन करता हूं। यह अभी भी छवि जमे हुए के साथ कैमरा स्क्रीन पर फंस गया है।

override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     // Create a session configuration 
     let configuration = ARWorldTrackingSessionConfiguration() 

     sceneView.session.delegate = self 

     if self.isPaused { 
      sceneView.session.run(sceneView.session.configuration!) 
     } else { 
      // Run the view's session 
      sceneView.session.run(configuration) 
     } 


    } 

उत्तर

5

सुनिश्चित नहीं हैं कि क्यों अपने सत्र शुरू करने नहीं है, लेकिन ... यह आम तौर पर एक स्थिति तुम वैसे भी में रहना चाहता हूँ नहीं है। रीडमी कि एप्पल के ARKit नमूना कोड के साथ जहाजों (WWDC17 session on ARKit से जुड़ी) में

नोटिस:

बचें एआर अनुभव दखल। यदि उपयोगकर्ता आपके ऐप में किसी अन्य फुलस्क्रीन यूआई में संक्रमण करता है, तो वापस आने पर एआर व्यू अपेक्षित स्थिति नहीं हो सकता है।

सेटिंग्स को एडजस्ट करते समय या मोडल चयन करने के दौरान उपयोगकर्ता को एआर अनुभव में रखने के लिए सहायक दृश्य नियंत्रकों के लिए पॉपओवर प्रेजेंटेशन (आईफोन पर भी) का उपयोग करें। इस उदाहरण में, SettingsViewController और VirtualObjectSelectionViewController कक्षाएं पॉपओवर प्रस्तुति का उपयोग करती हैं।

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

+0

धन्यवाद @rickster! अब समझ में आता है। मैं यह सुनिश्चित कर दूंगा कि उपयोगकर्ता एआर अनुभव नहीं छोड़ता है और पॉपओवर प्रस्तुति का उपयोग नहीं करता है। –

+0

मैं पॉपओवर प्रेजेंटेशन का उपयोग करते समय सत्र को जमे हुए देख रहा हूं। संभावित बग? https://forums.developer.apple.com/thread/81943 –

1

मुझे लगता है कि आपने एक उत्तर चुना है, और वह उत्तर है जो सेब द्वारा अनुशंसित है, आप एआर सत्र को पुनरारंभ कर सकते हैं। हालांकि, सत्र को अनपॉज़/फिर से शुरू नहीं किया जा सकता है, क्योंकि जब आप एआरएससीन व्यू प्रस्तुत करने वाले आपके नियंत्रक से बाहर हो जाते हैं तो डिवाइस इसकी ट्रैकिंग बंद कर देता है और आपके द्वारा दृश्य में रखी गई वस्तुओं के सापेक्ष आपके डिवाइस की स्थिति का ट्रैक रखने से रोक देगा ।

वैसे भी, मैंने अपने सत्र के सभी पहलुओं को नष्ट करके और मेरे दृश्य को फिर से प्रकट होने पर, या एक बटन प्रेस के माध्यम से उन्हें पुनर्निर्माण करके सत्र को पुनरारंभ करने में कामयाब रहा है।

मैं यहां कुछ नमूना कोड पोस्ट करूंगा। यह उद्देश्य-सी कारण में है, मेरी परियोजना उसमें लिखी गई थी, लेकिन यह भविष्य में लोगों को एक ही प्रश्न के साथ मदद कर सकती है।

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated] 
    [self setupScene]; 
    [self setupSession]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self destroySession]; 
    [self destroyScene]; 
} 

- (void)setupScene { 

// Setup the ARSCNViewDelegate - this gives us callbacks to handle new 
// geometry creation 
    self.sceneView.delegate = self; 

// A dictionary of all the current planes being rendered in the scene 
    self.planes = [NSMutableDictionary new]; 

// Contains a list of all the boxes rendered in the scene 
    self.boxes = [NSMutableArray new]; 

// Show statistics such as fps and timing information 
    self.sceneView.showsStatistics = YES; 
    self.sceneView.autoenablesDefaultLighting = YES; 

    SCNScene *scene = [SCNScene new]; 

    [self.sceneView setScene:scene]; 

    self.sceneView.scene.physicsWorld.contactDelegate = self; 
} 

- (void)setupSession { 

    // Create a session configuration 
    ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfiguration new]; 
    //ARWorldTrackingSessionConfiguration *configuration = [ARWorldTrackingSessionConfiguration new]; This has been deprecated in favor of the previous line in XCode 9 beta 5. 

    // Specify that we do want to track horizontal planes. Setting this will cause the ARSCNViewDelegate 
    // methods to be called when scenes are detected 
    //configuration.planeDetection = ARPlaneDetectionHorizontal; 

    // Run the view's session 
    [self.sceneView.session runWithConfiguration:configuration options:ARSessionRunOptionResetTracking]; 
} 


-(void)destroyScene { 
    bottomPlane = nil; 
    [self.sceneView setScene:nil]; 
    [self.sceneView setDebugOptions:nil]; 
    self.boxes = nil; 
    self.planes = nil; 
    self.sceneView.delegate = nil; 
} 

-(void)destroySession { 
    [self.sceneView.session pause]; 
    [self.sceneView setSession:nil]; 
} 

दृश्य नष्ट होने पर ये नष्ट विधियों का उपयोग किया जाता है। मैं एक बटन प्रेस पर एआर सत्र को फिर से शुरू कर रहा हूं, लेकिन यह इन तरीकों से नहीं है। यह निम्नानुसार है:

-(void)resetPressed{ 
    NSLog(@"Reset Pressed"); 
    [_sceneView.session pause]; 


    SCNScene *scene = [[SCNScene alloc] init]; 
    [_sceneView setScene:scene]; 
    [_sceneView.scene.rootNode enumerateChildNodesUsingBlock:^(SCNNode * _Nonnull child, BOOL * _Nonnull stop) { 
     [child removeFromParentNode]; 
    }]; 

    ARWorldTrackingConfiguration *configuration = [[ARWorldTrackingSessionConfiguration ARWorldTrackingConfiguration] init]; 
    [_sceneView.session runWithConfiguration:configuration options:ARSessionRunOptionResetTracking | ARSessionRunOptionRemoveExistingAnchors]; 
} 

उम्मीद है कि यह मदद करता है।

+0

यही वह है जो मैं कर रहा हूं। लेकिन किसी भी तरह एआरएसशन के आसपास दूसरी बार बनाया जाता है यदि लंबे समय तक फ्रेम लापता रहता है। कैमरा स्थिति अनिश्चित काल तक ARTrackingStateLimited पर रहता है। – nishant

+0

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

+0

@ dvp.petrov मैं निर्देशांक में परिवर्तन को संबोधित नहीं कर रहा हूं। मैं बस इस मुद्दे पर इस मुद्दे को संबोधित कर रहा था, जो कि जब ओपी एआर व्यू कंट्रोलर में लौट आया तो एआर सत्र रोका गया और आगे नहीं बढ़ रहा था। एक बार जब आप उस व्यू कंट्रोलर पर वापस जाते हैं तो मैं बस सत्र को पुनरारंभ करने का एक तरीका पेश कर रहा था। आपके प्रश्न के संबंध में, मुझे लगता है कि आप अपने द्वारा जोड़े गए सभी नोड्स की स्थिति को सहेज सकते हैं और वापस आने के बाद उन्हें दोबारा जोड़ सकते हैं, लेकिन इस बात की कोई गारंटी नहीं है कि डिवाइस उसी भौतिक स्थान पर होगा बिंदु। –

1

मुझे नहीं पता कि आईओएस 11 जीएम बीज या एक्सकोड 9 जीएम बीज संस्करणों ने आज इसे ठीक किया है, हालांकि मैं मूल प्रश्न के रूप में कोड के साथ एक रोके हुए ARSCNview को सफलतापूर्वक फिर से शुरू कर सकता हूं।

sceneView.session.run(sceneView.session.configuration!) 
+0

स्वीकृत उत्तर यह भी कहता है कि वे इस मुद्दे को पुन: उत्पन्न करने में असमर्थ थे और अधिक विस्तार से आगे बढ़े। क्या इस उत्तर को ओपी और अन्य लोगों को इस मुद्दे के साथ मूल्य जोड़ने के लिए संपादित किया जा सकता है? – stealththeninja

+0

यह मेरे लिए बहुत अच्छा काम किया! पहले self.sceneView.session.pause() फिर sceneView.session.run (sceneView.session.configuration!) – Jordan

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