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.

Другие вопросы по тегам