2017-10-25 15 views
6

मैं जिसमें मैं उपयोग स्थिति के लिए दृश्य के लिए कुछ पाठ जोड़ने ARKit के साथ एक सरल अनुप्रयोग बनाने हूँ:मैं ARKit में टेक्स्ट अभिविन्यास कैसे सेट कर सकता हूं?

@objc func tapped(sender: UITapGestureRecognizer){ 
    let sceneView = sender.view as! ARSCNView 
    let tapLocation = sender.location(in: sceneView) 
    let hitTest = sceneView.hitTest(tapLocation, types: .featurePoint) 
    if !hitTest.isEmpty{ 
     self.addTag(tag: "A", hitTestResult: hitTest.first!) 
    } 
    else{ 
     print("no match") 
    } 
} 

func addTag(tag: String, hitTestResult: ARHitTestResult){ 
    let tag = SCNText(string:tag, extrusionDepth: 0.1) 
    tag.font = UIFont(name: "Optima", size: 1) 
    tag.firstMaterial?.diffuse.contents = UIColor.red 

    let tagNode = SCNNode(geometry: tag) 

    let transform = hitTestResult.worldTransform 
    let thirdColumn = transform.columns.3 
    tagNode.position = SCNVector3(thirdColumn.x,thirdColumn.y - tagNode.boundingBox.max.y/2,thirdColumn.z) 
    print("\(thirdColumn.x) \(thirdColumn.y) \(thirdColumn.z)") 
    self.sceneView.scene.rootNode.addChildNode(tagNode) 
} 

यह काम करता है, लेकिन मैं पाठ के उन्मुखीकरण के साथ समस्या है। जब मैं इसे कैमरे की मूल स्थिति के साथ जोड़ता हूं, तो पाठ अभिविन्यास ठीक है, मैं पाठ को आगे की तरफ देख सकता हूं (नमूना 1)। लेकिन जब मैं बाएं/दाएं कैमरे को चालू करता हूं, और टैप करके टेक्स्ट जोड़ता हूं, तो मैं तरफ से जोड़ा गया टेक्स्ट देख सकता हूं (नमूना 2)।

नमूना 1:

3-D letter from the front

नमूना 2:

3-D letter from the side

मैं इसे हल करने के लिए कुछ सरल चाल होना चाहिए पता है, लेकिन इस विषय में अभी शुरुआत के रूप में मैं नहीं कर सकता इसे अभी तक ढूंढें।

+0

टेक्स्ट ऑब्जेक्ट को रखने के दौरान आप किस प्रकार के व्यवहार की तलाश कर रहे हैं? क्या आप चाहते हैं कि पाठ हमेशा कैमरे का सामना करें जब आप घूमते हैं, या क्या आप इसे पहले रखा गया था जब अभिविन्यास पर तय रहना चाहते हैं? – dbn

उत्तर

2

हूँ मैं कह रही है कि आप पाठ कैमरा जब आप टैप (भी आप हो सामना करना पड़ सकता है) का सामना करना चाहते हैं को सही है, लेकिन फिर स्थिर रहते?

किसी भी नोड के अभिविन्यास को समायोजित करने के कई तरीके हैं। इस मामले के लिए मैं पाठ नोड के बराबर होने के लिए टेक्स्ट नोड के eulerAngles को बस सेट करने का सुझाव दूंगा, जिस बिंदु पर आप टेक्स्ट को तुरंत चालू करते हैं।

अपने addTag() समारोह में आप जोड़ें:

let eulerAngles = self.sceneView.session.currentFrame?.camera.eulerAngles 
tagNode.eulerAngles = SCNVector3(eulerAngles.x, eulerAngles.y, eulerAngles.z + .pi/2) 

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

यह भी प्रशंसनीय है (और कुछ यह बेहतर है का तर्क हो सकता है) नोड के .localRotate() उपयोग करने के लिए, या अपने transform संपत्ति का उपयोग करने की, हालांकि मैं दोनों की स्थिति और eulerAngles सीधे जोड़ तोड़ के दृष्टिकोण की तरह।

उम्मीद है कि इससे मदद मिलती है।

संपादित करें: Float(1.57).pi/2 के साथ प्रतिस्थापित किया गया।

+2

'.pi/2' के साथ' फ्लोट (1.57) 'को बदलना स्पष्टता जोड़ें – dbn

+1

धन्यवाद, अभी जवाब देने के लिए खेद है, मैं यहां आने के लिए कामयाब रहा। – Tom

2

क्या आप हमेशा कैमरे का सामना करना चाहते हैं? SCNBillboardConstraint अपने दोस्त है:

tagNode.constraints = [SCNBillboardConstraint()] 
+0

मुझे एक मुद्दा है। मेरे पास दो एससीएनएनोड हैं जो एक दृश्य फ़ाइल से रूट नोड के उप-समूह हैं और जब मैं इन "टेक्स्ट नोड्स" के लिए प्रोग्रामिक रूप से एससीएनबिलबोर्ड कॉन्स्ट्रेनट जोड़ता हूं तो वे स्क्रीन को गायब करते हैं। समारोह addBillboardContraintsToText (वस्तु: VirtualObject) { गार्ड अगर ज्यामिति = node.geometry, geometry.isKind (की जाने जाने storeNode = object.childNodes.first बाकी storeNode.childNodes { में { वापसी } नोड के लिए: SCNText.self) { नोड।बाधाएं = [एससीएनबिलबोर्ड कॉन्स्ट्रेन()] } } } – Cyupa

+0

@ क्यूपा कृपया एक प्रश्न पोस्ट करें, कोई टिप्पणी नहीं। – rickster

+0

मैंने यहां एक प्रश्न जोड़ा है: https://stackoverflow.com/questions/49194597/adding-a-scnbillboardconstraint-makes-the-node-dissapear – Cyupa

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