3

Experience.rcproject的动画可以通过点击动作触发。两个圆柱体分别命名为“Button 1”和“Button 2”,并打开了 Collide。

我正在使用Async加载 Experience.Map 场景的addAnchor方法和将 mapAnchor 添加到 ViewController 中的 ARView 的方法。

我尝试在现场运行 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

我真的需要打开碰撞才能在 HitTest 中检测到两个按钮吗?

问题 3

有一个 installGestures 方法。目前没有关于此的在线教程或讨论。我试过了,但我对(Entity & HasCollision)感到困惑。这种方法如何实现?

4

1 回答 1

2

在此处输入图像描述

要在 RealityKit 中实现健壮Hit-Testing,您只需要以下代码:

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,请阅读这篇文章

附言

如果您在 macOS 模拟器上运行此应用程序,它会打印Ground Plane而不是BOXCYLINDER. 所以你需要在 iPhone 上运行这个应用程序。

于 2020-01-22T19:22:54.350 回答