Присоединение узла scenekit к ARAnchor просто устанавливает преобразование узла в преобразование якоря? - PullRequest
0 голосов
/ 10 декабря 2018

Я читал, что для того, чтобы «виртуальные объекты, казалось, оставались на месте относительно реального мира» в сцене AR, вы должны использовать ARAnchors.

  • Могу ли я присоединить узел scenekit к якорю, который я создал, кроме как путем установки преобразования узла в значения преобразования якоря?Для меня это не похоже на то, чтобы прикрепить его к якору, а просто поместить их в одно и то же трехмерное положение.
  • Это не скажет ARKit обновить преобразование узлов при изменении преобразования привязки.Я прав?Я не вижу смысла использовать якорь в этом случае.

1 Ответ

0 голосов
/ 10 декабря 2018

ARKit управляет позициями якорей и путем расширения узлов, прикрепленных к ним, любым необходимым преобразованием.Таким образом, относительное положение присоединенного узла остается неизменным, однако положение якоря может измениться.Вы также можете установить ограничения, чтобы вращение всегда было одинаковым по отношению к камере или какому-либо другому узлу.

Итак, вопрос № 1: это может быть любое преобразование относительно привязки.И вопрос № 2: см. Объяснение выше, относительное преобразование узла в привязку остается неизменным, однако позиция привязки может измениться.

Пример добавления сферы в позиции привязки и надписи над ней, которая всегда будет обращена ккамера:

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
}
...