首页 > 解决方案 > 在 ARKit 和 RealityKit 中使用 Raycast 的真正好处是什么?

问题描述

ARKit 和 RealityKit 中的光线投射有什么用

当我需要使用makeRaycastQuery实例方法时:

func makeRaycastQuery(from point: CGPoint, 
                 allowing target: ARRaycastQuery.Target, 
                       alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?

任何帮助表示赞赏。

标签: swiftaugmented-realityarkitrealitykit

解决方案


SimpleRay-Casting与 相同Hit-Testing,通过将虚拟光线从屏幕点投射到检测到的平面上,帮助在真实世界表面上找到 3D 位置。在 Apple 文档 (2019) 中,光线投射有以下定义:

光线投射是在现实环境中寻找表面位置的首选方法,但为了兼容性,命中测试功能仍然存在。通过跟踪光线投射,ARKit 和 RealityKit 会继续优化结果,以提高您通过光线投射放置的虚拟内容的位置精度。

当用户想要将虚拟内容放置到检测到的表面上时,最好为此提供提示。许多 AR 应用程序绘制一个焦点圆或正方形,让用户直观地确认 ARKit 所知道的表面的形状和对齐方式。因此,要找出在现实世界中放置焦点圈或正方形的位置,您可以使用 anARRaycastQuery询问 ARKit 在现实世界中的哪些表面存在。

这是一个示例,您可以在其中看到如何实现光线投射方法makeRaycastQuery()raycast()

import UIKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    let model = try! Entity.loadModel(named: "usdzModel")
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.raycasting()
    }

    fileprivate func raycasting() {
            
        guard let query = arView.makeRaycastQuery(from: arView.center,
                                              allowing: .estimatedPlane,
                                             alignment: .horizontal)
        else { return }

        guard let result = arView.session.raycast(query).first
        else { return }

        let raycastAnchor = AnchorEntity(raycastResult: result)
        raycastAnchor.addChild(model)
        arView.scene.anchors.append(raycastAnchor)
    }
}

如果你想知道如何Convex-Ray-Casting在 RealityKit 中使用 a,请阅读这篇文章。

如果你想知道如何Hit-Testing在 RealityKit 中使用,请阅读这篇文章。


推荐阅读