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
}