Swift 在RealityKit中实现十字线类行为

Swift 在RealityKit中实现十字线类行为,swift,augmented-reality,arkit,realitykit,reality-composer,Swift,Augmented Reality,Arkit,Realitykit,Reality Composer,我想要实现的目标:将一个球体连接到相机位置(以便在设备移动时始终保持在屏幕中心),并检测它何时位于其他AR对象的顶部-以触发AR对象上的其他动作/行为 方法:我已经创建了球体并连接到屏幕中心,如下所示 @IBOutlet var arView: ARView! override func viewDidLoad() { super.viewDidLoad() let mesh = MeshResource.generateSphere(radius: 0.1) let

我想要实现的目标:将一个球体连接到相机位置(以便在设备移动时始终保持在屏幕中心),并检测它何时位于其他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
}
下一步,在会话中执行hittest或光线投射
(\uuU2dUpdate:)

但我不断地得到地平面作为我的结果与这种方法。我有没有遗漏什么,或者有不同的方法来实现这一点


注意:为了以防万一,我创建了我的基本场景,因为我想在Reality Composer中跟踪图像并在图像标记上添加内容,并且使用Xcode中的.rcproject还为所有覆盖的项目启用了冲突属性。

尝试以下解决方案:

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)
    }
}
导入ARKit
进口商品
类ViewController:UIViewController{
@ibvar arView:arView!
VarSphere:ModelEntity?
覆盖func TouchesBegind(Touchs:Set,带有事件:UIEvent?){
让触摸=arView.center
let results:[CollisionCastHit]=arView.hitTest(触摸)
如果let result:CollisionCastHit=results.first{
如果result.entity.name==“Cube”&&sphere?.isAnchored==true{
打印(“砰!”)
}
}
}
重写func viewDidLoad(){
super.viewDidLoad()
//十字线
设mesh01=MeshResource.generateSphere(半径:0.01)
球体=模型实体(网格:mesh01)
球体?.transform.translation.z=-0.15
让cameraAnchor=AnchoreEntity(.camera)
球体?.setParent(cameraAnchor)
arView.scene.addAnchor(cameraAnchor)
//碰撞模型
设mesh02=MeshResource.generateBox(大小:0.3)
长方体=模型实体(网格:mesh02,材质:[SimpleMaterial()])
generateCollisionShapes(递归:true)
box.name=“多维数据集”
设平面锚定=锚定实体(.plane(.any),
分类:。任何,
最小边界:[0.2,0.2]))
box.setParent(平面锚定)
arView.scene.addAnchor(平面锚)
}
}

您的对象是否有碰撞组件?hitTest的文档说它将忽略没有实体的实体。我已经调用了
实体。generateCollisionShapes(recursive:true)
,还启用了Physics->Reality Composer中的碰撞形状。你好,Andy,感谢您的快速响应。但此时您需要检查是否点击了立方体。我试图实现的是,如果场景中已经有一个球体(放置在摄影机位置),我想检查在任何给定时间,来自球体位置的光线是否与立方体相交。基本上任何时候相机都可以直接(看着)与立方体对齐。可能是我接近它的方式是错误的&有一种更好的方法可以得到相机直接看到的东西,以及在它的直线视图中是否有AR对象。我希望这能让我的问题更清楚。非常感谢。我刚刚通过了上面代码中的
touch=arView.center
,它工作得非常好。再次感谢你!
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)
    }
}