2017-10-25 16 views
6

tworzę prostą aplikację z ARKit w której dodaję trochę tekstu na scenie, aby gwintowany pozycji:Jak ustawić orientację tekstu w 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) 
} 

to działa, ale mam problemy z orientacją tekstu. Kiedy dodaję go z oryginalną pozycją aparatu, orientacja tekstu jest w porządku, widzę tekst w tle (przykład 1). Ale kiedy obracam kamerę w lewo/w prawo, i dodawam tekst dotykając, widzę dodany tekst z boku (przykład 2).

Próbka 1:

3-D letter from the front

Próbka 2:

3-D letter from the side

wiem, że powinien być jakiś prosty trik, aby go rozwiązać, ale jako początkujący w tym temacie nie mogłem znajdź to tak daleko.

+0

Jakiego zachowania oczekujesz po umieszczeniu obiektu tekstowego? Czy chcesz, aby tekst zawsze był skierowany w stronę kamery podczas poruszania się, czy też chcesz, aby pozostała nieruchoma w orientacji, kiedy została po raz pierwszy umieszczona? – dbn

Odpowiedz

2

mam rację, mówiąc, że chcesz, aby tekst w obliczu aparatu podczas naciskania (gdziekolwiek się być skierowana), ale wtedy pozostaje nieruchoma?

Istnieje wiele sposobów regulacji orientacji dowolnego węzła. W tym przypadku proponuję po prostu ustawić eulerAngles węzła tekstowego na równy z obrazem kamery, w miejscu, w którym tworzysz tekst.

W funkcji addTag() dodać:

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

Dodatkowa .pi/2 jest tam, aby upewnić się, że tekst jest w prawidłowej orientacji, jako domyślny z ARKit jest dla orientacji poziomej i dlatego tekst wychodzi śmieszne . Powoduje to obrót wokół lokalnej osi Z.

Jest również prawdopodobne (i niektórzy mogą twierdzić, że lepiej) używać .localRotate() węzła lub uzyskać dostęp do jego transform nieruchomości, jednak podoba mi się podejście do manipulowania zarówno bezpośrednio pozycję i Kąty Eulera.

Mam nadzieję, że to pomoże.

EDYCJA: zastąpiono Float(1.57) z .pi/2.

+2

Zastąpienie 'Float (1.57)' z '.pi/2' dodaj jasności – dbn

+1

Dziękuję, przykro mi, że tylko teraz mogę odpowiedzieć, udało mi się tu dostać w każdą niedzielę. – Tom

2

Chcesz, aby tekst zawsze był skierowany w stronę aparatu? SCNBillboardConstraint jest twoim przyjacielem:

tagNode.constraints = [SCNBillboardConstraint()] 
+0

Mam problem. Mam dwa węzły SCNNodes, które są subchildami węzła głównego z pliku sceny i kiedy dodaję program SCNBillboardConstraint programowo do tych "węzłów tekstowych", po prostu znikają z ekranu. func addBillboardContraintsToText (Obiekt VirtualObject) { osłona pozwolić storeNode = object.childNodes.first else { powrotu } na węźle storeNode.childNodes { czy pozwolić geometria = node.geometry, geometry.isKind (z: SCNText.self) { węzeł.constraints = [SCNBillboardConstraint()] } } } – Cyupa

+0

@ Cyupa zadaj pytanie, a nie komentarz. – rickster

+0

Dodałem pytanie tutaj: https://stackoverflow.com/questions/49194597/adding-a-scnbillboardconstraint-makes-the-node-dissapear – Cyupa

Powiązane problemy