2015-03-06 5 views
5

Voglio visualizzare il testo accanto al mio modello 3D usando SceneKit in iOS. Deve solo apparire come se fosse 2D. Quindi il testo dovrebbe essere sempre rivolto verso la fotocamera, tuttavia ruoto il modello 3D. Ho un SCNNode con una geometria SCNText ed ho attaccato un SCNLookAtConstraint in questo modo:SCNText con SCNLookAtConstraint che guarda nel modo sbagliato

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

sembrano essere di fronte alla telecamera, ma solo il modo sbagliato! Vedo tutto il testo specchiato! Inoltre, a volte il testo ruota, voglio che sia allineato orizzontalmente in ogni momento. Quindi questo è tutto il comportamento che non voglio.

Qualcuno può aiutarmi qui? Voglio solo avere del testo che segue alcuni nodi nel mio oggetto 3D. Non mi interessa come. Non deve essere SCNText per tutto quello che mi interessa, se questo può essere fatto con una semplice UILabel: bene con me! Dimmi solo come!

+0

Siete riusciti a trovare una soluzione per questo? – Cyupa

risposta

3

Dalla documentazione:

Quando SceneKit valuta un look-a vincolo, aggiorna proprietà transform del nodo vincolata in modo che il nodo negativo asse z punti per nodo di destinazione del vincolo.

È possibile risolvere il problema impostando il nodo pivot o utilizzando un nodo intermedio. Quel nodo sarebbe vincolata, e avrebbe il testo come un nodo figlio (che sarebbe ruotato di π lungo l' sull'asse y)

Aggiornamento

partire iOS 11.0 la classe SCNLookAtConstraint espone la proprietà localFront che consente di specificare un diverso asse frontale. Il valore predefinito è (0, 0, -1) e puoi modificarlo in (0, 0, 1) per ottenere ciò che desideri.

0

Ho affrontato questo problema su 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

Sulla base di @mnuages ​​risposta, l'impostazione di rotazione del nodo al dovrebbe fare il trucco seguente.

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