2015-03-06 13 views
5

Chcę wyświetlić tekst obok mojego modelu 3D przy użyciu SceneKit w iOS. Po prostu musi wyglądać, jakby był 2D. Dlatego tekst powinien zawsze być skierowany w stronę kamery, ale obracam model 3D. Mam SCNNode z SCNText geometrii i załączeniu SCNLookAtConstraint jak tak:SCNText z SCNLookAtConstraint szuka w niewłaściwy sposób

let constraint = SCNLookAtConstraint(target: cameraNode) 
constraint.gimbalLockEnabled = true 
textNode.constraints = [constraint] 

Wydają się naprzeciwko kamery, ale tylko wspak! Widzę cały tekst odbity! Czasami tekst obraca się, chcę, aby zawsze był wyrównany poziomo. A więc to jest całe zachowanie, którego nie chcę.

Czy ktoś może mi pomóc? Po prostu chcę mieć tekst, który następuje po kilku węzłach w moim obiekcie 3D. Nie obchodzi mnie, jak. Nie musi to być SCNText dla wszystkich, które mnie interesują, jeśli można to zrobić za pomocą prostej UILabel: dobrze ze mną! Po prostu powiedz mi, jak!

+0

Czy udało się znaleźć rozwiązanie tego? – Cyupa

Odpowiedz

3

Z dokumentacji:

Kiedy SceneKit ocenia spojrzenie-na ograniczenie aktualizuje przekształcenia własności ograniczonego węzła tak, że węzeł jest negatywny oś punkty w kierunku węzła docelowego więzu.

Można to obejść, ustawiając węzeł na pivot węzła lub za pomocą węzła pośredniego. Że węzeł będzie ograniczona, a miałby tekst jako węzła potomnego (który byłby obrócony przez Õ wzdłuż y osi)

aktualizacji

Zaczynając iOS 11.0 klasa SCNLookAtConstraint naraża właściwość localFront co pozwala określić inną oś przednią. Domyślnie jest to (0, 0, -1) i możesz go zmienić na (0, 0, 1), aby osiągnąć to, co chcesz.

0

I w obliczu tego problemu na iOS11 beta 5, Swift4:

//1. Rotate your `textNode`, and don't add `textNode` into `sceneView` 
textNode.eulerAngles = SCNVector3Make(0, .pi, 0) 

//2. Create new wrapper node, add `textNode` as a child node 
let textWrapperNode = SCNNode() 
textWrapperNode.addChildNode(textNode) 

//3. Add constraint for wrapper node 
let constraint = SCNLookAtConstraint(target: cameraNode) 
constraint.gimbalLockEnabled = true 
textWrapperNode.constraints = [constraint] 

//4. Add wrapper node into `sceneView` 
sceneView.scene.rootNode.addChildNode(textNode) 
0

podstawie @mnuages ​​odpowiedzi ustawienie odchyl węzła do następujących powinno załatwić sprawę.

node.pivot = SCNMatrix4Rotate(node.pivot, Float.pi, 0, 1, 0)