Как добавить слова (комментарий) на 3D-модель в Scenekit? - PullRequest
0 голосов
/ 12 февраля 2019

Я показал 3D-модель в своем приложении со Scenekit.Модель могла вращаться, масштабироваться, двигаться жестом.Теперь мне нужно добавить несколько комментариев на экране, чтобы объяснить, что каждая часть модели представляет из себя (например, сердечный модуль, включает сердечную мышцу, кровеносный сосуд ...).Комментарии всегда должны следовать за частью модели, когда преобразование модели, и размер слова не изменятся, всегда лицом к пользователю .Но я не знаю, как этого добиться.

Моя идея состоит в том, чтобы сделать трехмерную мировую координату координатой экрана и добавить UILabels в SCNView, когда модель преобразуется, измените фрейм UILabels.Но я не знаю, как конвертировать координаты.Конечно, это может быть лучший способ , я не знаю.Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

Этот фрагмент взят из проекта ARKit, но с учетом того, что текстовая метка прикреплена к SCNNode и всегда обращена к пользователю, это то, что вам нужно -

func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        guard let featureAnchor = anchor as? FeatureAnchor else {
            return nil
        }
        let feature = featureAnchor.feature

        let billboardConstraint = SCNBillboardConstraint()
        billboardConstraint.freeAxes = SCNBillboardAxis.Y

        let sphere = SCNSphere(radius: Global.dotRadius)
        sphere.firstMaterial?.transparency = Global.annotationTransparency
        sphere.firstMaterial?.diffuse.contents = UIColor.yellow
        sphere.firstMaterial?.specular.contents = UIColor.white
        let node = SCNNode(geometry: sphere)
        node.constraints = [billboardConstraint]

        let text = SCNText(string: feature.description, extrusionDepth: Global.textDepth)
        text.chamferRadius = Global.textDepth
        text.firstMaterial?.transparency = Global.annotationTransparency
        text.firstMaterial?.diffuse.contents = UIColor.green
        text.firstMaterial?.specular.contents = UIColor.white
        text.firstMaterial?.isDoubleSided = true
        text.font = Global.textFont
        text.alignmentMode = kCAAlignmentCenter

        let (min, max) = text.boundingBox
        let dx: Float = (max.x - min.x) / 2.0 // x = center
        let dy: Float = min.y // y = bottom
        let dz: Float = Float(Global.textDepth) / 2.0 // z = center

        let textNode = SCNNode(geometry: text)
        textNode.pivot = SCNMatrix4MakeTranslation(dx, dy, dz)
        textNode.scale = SCNVector3Make(Global.textScale, Global.textScale, Global.textScale)

        node.addChildNode(textNode)

        return node
    }

...