2017-07-13 7 views
14

मैं समवर्ती दोनों ARKit और Scenekit सीखने की प्रक्रिया में हूँ में 'कैमरा' की वर्तमान स्थिति प्राप्त करें, और यह एक चुनौती का एक सा हो गया है।ARKit - दृश्य

एआरवर्ल्डट्रैकिंग सत्र कॉन्फ़िगरेशन सत्र के साथ, मैं सोच रहा था कि क्या किसी को दृश्य सत्र में उपयोगकर्ता के 'कैमरा' की स्थिति प्राप्त करने का कोई तरीका पता था। विचार यह है कि मैं किसी ऑब्जेक्ट को उपयोगकर्ता की वर्तमान स्थिति की ओर एनिमेट करना चाहता हूं।

let reaperScene = SCNScene(named: "reaper.dae")! 
    let reaperNode = reaperScene.rootNode.childNode(withName: "reaper", recursively: true)! 
    reaperNode.position = SCNVector3Make(0, 0, -1) 
    let scene = SCNScene() 
    scene.rootNode.addChildNode(reaperNode) 

    // some unknown amount of time later 

    let currentCameraPosition = sceneView.pointOfView?.position 
    let moveAction = SCNAction.move(to: currentCameraPosition!, duration: 1.0) 
    reaperNode.runAction(moveAction) 

हालांकि, ऐसा लगता है कि currentCameraPosition हमेशा [0,0,0] है, भले ही मैं कैमरे इधर-उधर जाने कर रहा हूँ। कोई विचार क्या मैं गलत कर रहा हूँ? आखिर में विचार यह है कि जब तक यह कैमरे के सामने न हो तब तक ऑब्जेक्ट को अदृश्य क्षेत्र के चारों ओर घुमाएगा और फिर इसे एनिमेट करेगा: Rotate SCNCamera node looking at an object around an imaginary sphere (जिस तरह से उपयोगकर्ता ऑब्जेक्ट को उनके प्रति एनिमेट करता है)

किसी भी मदद के लिए धन्यवाद।

उत्तर

14

ARSession.delegate के रूप में अपने आप को सेट करें। की तुलना में आप session(_:didUpade:) लागू कर सकते हैं जो आपके सत्र में संसाधित हर फ्रेम के लिए आप एक ARFrame दे देंगे। फ्रेम में camera संपत्ति है जो कैमरे के परिवर्तन, रोटेशन और स्थिति पर जानकारी रखती है।

func session(_ session: ARSession, didUpdate frame: ARFrame) { 
    // Do something with the new transform 
    let currentTransform = frame.camera.transform 
    doSomething(with: currentTransform) 
} 

संपादित: जैसा कि @rickster ने बताया तुम हमेशा session.currentFrame को फोन करके यह माध्यम से वर्तमान ARFrame और कैमरे की स्थिति प्राप्त कर सकते हैं। यदि आप, बस एक बार स्थिति की जरूरत है जैसे एक नोड जहां कैमरा दिया गया है स्थानांतरित करने के लिए, लेकिन आप delegate विधि का उपयोग करना चाहिए आप कैमरे की स्थिति पर नई जानकारी प्राप्त करना चाहते हैं तो उपयोगी है।

+1

यह काम करता है की जरूरत है, लेकिन आप यह भी सत्र के 'currentFrame' हो रही द्वारा सत्र प्रतिनिधि किया जा रहा बिना फ्रेम प्राप्त कर सकते हैं संपत्ति। – rickster

+1

@rickster आप तंग कर रहे हैं और मैं इसका जवाब संपादित किया है, लेकिन आम तौर पर आप अन्य नोड आप पर प्रतिक्रिया अपनी स्थिति, आप के आसपास का पालन करते हुए जैसे बदलते करना चाहते हैं। फिर आप नए कैमरे पर निरंतर अपडेट चाहते हैं वैसे भी। – orangenkopf

+1

सच है। प्वाइंट, है कि आपके ऐप अन्यथा की स्थापना की है पर निर्भर करता है, आप या तो ARKit पहुंचाने आप 60 fps फ्रेम और आप प्रतिपादन के रूप में आप उन्हें प्राप्त हो सकता था, या आप अपने स्वयं (तक) में पाश प्रस्तुत करना चलते रह सकते 60 fps और पूछना हर बार एक फ्रेम के लिए ARKit जब आप एक की जरूरत है। यह दोनों तरीकों का समर्थन करता है, इसलिए आप जो चाहें उसका उपयोग करें। – rickster

6

मैं जानता हूँ कि इसे हल कर दिया गया था, लेकिन मैं इसके लिए एक छोटे से साफ समाधान है .. मैं एक रेंडरर प्रतिनिधि विधि जोड़ने prefere होता .. यह ARSCNViewDelegate में एक विधि है

func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) { 
    guard let pointOfView = sceneView.pointOfView else { return } 
    let transform = pointOfView.transform 
    let orientation = SCNVector3(-transform.m31, -transform.m32, transform.m33) 
    let location = SCNVector3(transform.m41, transform.m42, transform.m43) 
    let currentPositionOfCamera = orientation + location 
    print(currentPositionOfCamera) 
} 
निश्चित रूप से

आप नहीं कर सकते डिफ़ॉल्ट रूप से बॉक्स से बाहर दो SCNVector3 जोड़ने .. ताकि आप कक्षा से बाहर चस्पा करने के लिए निम्नलिखित

func +(lhv:SCNVector3, rhv:SCNVector3) -> SCNVector3 { 
    return SCNVector3(lhv.x + rhv.x, lhv.y + rhv.y, lhv.z + rhv.z) 
} 
+0

आप रोटेशन मैट्रिक्स की विकर्ण प्रविष्टियां क्यों ले रहे हैं? और "स्थिति" "अभिविन्यास + स्थान" के बराबर क्यों है। स्थिति स्थान है, यानी।परिवर्तन का अंतिम स्तंभ। ऊपरी बाएं 3x3 मैट्रिक्स में अभिविन्यास (और संभवतः स्केल और कतरनी) होता है। पिच, यॉ और रोल को निकालने के लिए विभिन्न विधियां मौजूद हैं, लेकिन विकर्ण उनमें से एक नहीं है। – kjyv

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