2015-03-06 4 views
5

Я хочу отобразить текст рядом с моей 3D-моделью, используя SceneKit в iOS. Он просто должен выглядеть так, как будто это 2D. Поэтому текст всегда должен быть обращен к камере, однако я вращаю 3D-модель. У меня есть SCNNode с SCNText геометрией, и я прикрепил SCNLookAtConstraint вот так:SCNText с SCNLookAtConstraint выглядит не так

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

Они, кажется, смотрит в камеру, но только не в ту сторону! Я вижу весь текст зеркально! Кроме того, иногда текст вращается, я хочу, чтобы он был выровнен по горизонтали в любое время. Так что это все, чего я не хочу.

Может ли кто-нибудь помочь мне здесь? Я просто хочу иметь некоторый текст, который следует за несколькими узлами моего 3D-объекта. Мне все равно, как. Это не обязательно должно быть SCNText для всех, что мне нужно, если это можно сделать с помощью простого UILabel: отлично со мной! Просто скажи мне, как!

+0

Вы смогли найти починку для этого? – Cyupa

ответ

3

Из документации:

Когда SceneKit оценивает взгляд, при ограничении, он обновляет преобразования свойство стесненных узла таким образом, что для этого узла отрицательной оси Z. указывает на целевой узел ограничение в.

Вы можете обойти это, установив нулевой узел pivot или используя промежуточный узел. Этот узел будет ограничен, и будет иметь текст в качестве дочернего узла (который будет повернут на я по у оси)

Update

Начиная IOS 11.0 SCNLookAtConstraint класса предоставляет localFront недвижимости который позволяет вам указать другую переднюю ось. По умолчанию он равен (0, 0, -1), и вы можете изменить его на (0, 0, 1), чтобы достичь желаемого.

0

Я столкнулся с этой проблемой на iOS11 бета 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

основе @mnuages ​​ответа, установив стержень этого узла к следующему следует сделать трюк.

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

Смежные вопросы