Якорь по умолчанию в Reality Composer
Когда вы создаете любую сцену с помощью Reality Composer, вы должны сначала выбрать, какой тип привязки "пол, стена, лицо, объект" это означает, что когда вы загружаете сцену, она автоматически устанавливает себя на указанную привязку.
Мой вопрос: есть ли способ установить его вручную из кода, чтобы я, например, провел проверку попадания, а затем привязал его к определенной точке вручную?
Спасибо.
2 ответа
В официальной документации нет ссылки на возможность изменения привязки по умолчанию во время выполнения, но из вашего описания похоже, что вы можете попробовать Select Object Anchoring to Place a Scene Near Detected Objects
как описано здесь:
https://developer.apple.com/documentation/realitykit/creating_3d_content_with_reality_composer/selecting_an_anchor_for_a_reality_composer_scene
Вы можете легко применить другой тип привязки (при реализации проверки попадания или преобразования лучей), используя следующий код (привязка по умолчанию в Reality Composer
.horizontal
):
import ARKit
import RealityKit
@IBAction func onTap(_ sender: UITapGestureRecognizer) {
let estimatedPlane: ARRaycastQuery.Target = .estimatedPlane
let alignment: ARRaycastQuery.TargetAlignment = .vertical
let tapLocation: CGPoint = sender.location(in: arView)
let result: [ARRaycastResult] = arView.raycast(from: tapLocation,
allowing: estimatedPlane,
alignment: alignment)
guard let rayCast: ARRaycastResult = result.first
else { return }
let anchor = AnchorEntity(world: rayCast.worldTransform)
anchor.addChild(myScene)
arView.scene.anchors.append(anchor)
}
Или вы можете разместить якоря автоматически (например, как ARFaceAnchor
для обнаруженного лица):
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession,didUpdate anchors: [ARAnchor]) {
guard let faceAnchor = anchors.first as? ARFaceAnchor
else { return }
let anchor = AnchorEntity(anchor: faceAnchor)
// RealityKit's Facial analog
// AnchorEntity(.face).self
anchor.addChild(glassModel)
arView.scene.anchors.append(anchor)
}
}
... или вы можете разместить ARImageAnchor
так же:
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let imageAnchor = anchors.first as? ARImageAnchor,
let _ = imageAnchor.referenceImage.name
else { return }
let anchor = AnchorEntity(anchor: imageAnchor)
// RealityKit's image anchor analog
// AnchorEntity(.image(group: "Group", name: "model")).self
anchor.addChild(imageModel)
arView.scene.anchors.append(anchor)
}
}