在 RealityKit 中实现十字准线类型行为

问题描述

我想要实现的目标: 将球体附加到相机位置(以便在设备移动时它始终位于屏幕的中心)并检测它何时位于其他 AR 之上对象 - 在 AR 对象上触发其他动作/行为。

方法:我已经创建了球体并附加到屏幕的中心,如下所示

@IBOutlet var arView: ARView!

override func viewDidLoad() {
    super.viewDidLoad()

    let mesh = MeshResource.generateSphere(radius: 0.1)
    let sphere = ModelEntity(mesh: mesh)

    let anchor = AnchorEntity(.camera)

    sphere.setParent(anchor)
    arView.scene.addAnchor(anchor)

    sphere.transform.translation.z = -0.75
}

下一步,执行命中测试或光线投射in session(_:didUpdate:)

 let results = arView.hitTest(CGPoint(x: 0.5,y: 0.5),query: .all,mask: .default)
//normalised center ; 2D position of the camera (our sphere) in the view’s coordinate system

但是我通过这种方法不断获得地平面作为结果。是否有我遗漏的东西或有不同的方法来实现这一点

注意:为了防止出现问题,我创建了我的基本场景,因为我想跟踪图像并在 Reality Composer 中的图像标记顶部添加内容并使用 .rcproject Xcode 还为所有重叠的项目启用了碰撞属性。

解决方法

尝试以下解决方案:

import ARKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    var sphere: ModelEntity?
    
    override func touchesBegan(_ touches: Set<UITouch>,with event: UIEvent?) {
        let touch = arView.center
        let results: [CollisionCastHit] = arView.hitTest(touch)
        
        if let result: CollisionCastHit = results.first {
            if result.entity.name == "Cube" && sphere?.isAnchored == true {
                print("BOOM!")
            }
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Crosshair
        let mesh01 = MeshResource.generateSphere(radius: 0.01)
        sphere = ModelEntity(mesh: mesh01)
        sphere?.transform.translation.z = -0.15
        let cameraAnchor = AnchorEntity(.camera)
        sphere?.setParent(cameraAnchor)
        arView.scene.addAnchor(cameraAnchor)
        
        // Model for collision
        let mesh02 = MeshResource.generateBox(size: 0.3)
        let box = ModelEntity(mesh: mesh02,materials: [SimpleMaterial()])
        box.generateCollisionShapes(recursive: true)
        box.name = "Cube"
        let planeAnchor = AnchorEntity(.plane(.any,classification: .any,minimumBounds: [0.2,0.2]))
        box.setParent(planeAnchor)
        arView.scene.addAnchor(planeAnchor)
    }
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...