HitTest печатает имя объекта AR, даже если я не нажимаю на него. Что мне не хватает?
Мой Experience.rcproject имеет анимацию, которая может быть вызвана действием нажатия. Два цилиндра имеют названия "Кнопка 1" и "Кнопка 2" и имеют функцию Collide.
Я использую метод ASync для загрузки сцены Experience.Map и метод addAnchor для добавления mapAnchor к ARView в ViewController.
Я попытался запустить HitTest на сцене, чтобы увидеть, правильно ли реагирует приложение.
Тем не менее, результат HitTest печатает имя объекта кнопки, даже когда я не нажимаю на нее, а на область рядом с ней.
class augmentedReality: UIViewController {
…
@IBOutlet weak var arView: ARView!
@IBAction func onTap(_ sender: UITapGestureRecognizer) {
let tapLocation = sender.location(in: arView)
// Get the entity at the location we've tapped, if one exists
if let button = arView.entity(at: tapLocation) {
// For testing purposes, print the name of the tapped entity
print(button.name)
}
}
Ниже моя попытка добавить сцену AR и распознаватель жестов касания в arView.
class augmentedReality: UIViewController {
…
arView.scene.addAnchor(mapAnchor)
mapAnchor.notifications.hideAll.post()
mapAnchor.notifications.mapStart.post()
self.arView.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(onTap))
self.arView.addGestureRecognizer(tapGesture)
Вопрос 1 Как я могу достичь цели, только напечатав название сущности кнопки, когда я действительно нажимаю на нее, а не на нее?
Вопрос 2 Нужно ли включать Collide, чтобы обе кнопки могли быть обнаружены в HitTest?
Вопрос 3 Есть метод installGestures. Там нет онлайн-учебников или обсуждений по этому поводу в данный момент. Я пытался, но меня смущает (Entity & HasCollision). Как этот метод может быть реализован?
0 ответов
Для реализации надежного
Hit-Testing
в RealityKit вам нужен только следующий код:
import RealityKit
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
let scene = try! Experience.loadScene()
@IBAction func onTap(_ sender: UITapGestureRecognizer) {
let tapLocation: CGPoint = sender.location(in: arView)
let result: [CollisionCastHit] = arView.hitTest(tapLocation)
guard let hitTest: CollisionCastHit = result.first
else { return }
let entity: Entity = hitTest.entity
print(entity.name)
}
override func viewDidLoad() {
super.viewDidLoad()
scene.steelBox!.scale = [2,2,2]
scene.steelCylinder!.scale = [2,2,2]
scene.steelBox!.name = "BOX"
scene.steelCylinder!.name = "CYLINDER"
arView.scene.anchors.append(scene)
}
}
Когда вы нажимаете на объекты в ARView, область отладки печатает " BOX " или " CYLINDER ". И если вы коснетесь чего-либо, кроме объектов, в области отладки будет напечатана просто " Плоскость земли ".
Если вам нужно реализовать Ray-Casting, прочтите этот пост, пожалуйста.
PS
Если вы запустите это приложение в симуляторе macOS, оно распечатает просто Ground Plane
вместо того BOX
а также CYLINDER
. Итак, вам нужно запустить это приложение на iPhone.