在ARKit和RealityKit中使用Raycast的真正好处是什么?

ARG*_*Geo 2 augmented-reality swift arkit realitykit

什么是光线投射在ARKit和RealityKit方法?

       func raycast(origin: SIMD3<Float>, 
                 direction: SIMD3<Float>, 
                    length: Float = 100, 
                     query: CollisionCastQueryType = .all, 
                      mask: CollisionGroup = .all, 
relativeTo referenceEntity: Entity? = nil) -> [CollisionCastHit]
Run Code Online (Sandbox Code Playgroud)

或makeRaycastQuery实例方法:

func makeRaycastQuery(from point: CGPoint, 
                 allowing target: ARRaycastQuery.Target, 
                       alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏。

ARG*_*Geo 5

Ray-Casting,就像Hit-Testing帮助您在给定屏幕点的情况下在真实表面上找到3D位置一样。我发现了raycasting的以下定义:

射线投射是在现实环境中查找曲面上位置的首选方法,但是为了兼容性,命中测试功能仍然存在。通过跟踪射线广播,ARKit会继续完善结果,以提高通过射线广播放置的虚拟内容的位置精度。

当用户想要在某个表面上放置虚拟内容时,为此提示一个好主意。许多AR应用程序会绘制一个焦点圆或正方形,以使用户可以视觉确认ARKit知道的曲面的形状和对齐方式。因此,要找出在现实世界中放置焦点圆或正方形的位置,您可以使用ARRaycastQuery问ARKit现实世界中任何表面存在的地方。

这是一些抽象示例,您可以在其中看到光线投射方法makeRaycastQuery():

import UIKit
import RealityKit

class ViewController: UIViewController {

    @IBOutlet var arView: ARView!
    let entity: Entity? = nil

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func rayCastingMethod() {

        // target iOS 13.0+, Xcode 11.0
        guard let raycastQuery = arView.makeRaycastQuery(from: arView.center,
                                                     allowing: .estimatedPlane,
                                                    alignment: .vertical) else {
            return
        }

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

        let transformation = Transform(matrix: result.worldTransform)
        entity.transform = transformation

        let raycastAnchor = AnchorEntity(raycastResult: result)
        raycastAnchor.addChild(entity)
        arView.addAnchor(raycastAnchor)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 多谢!我忘记补充一点,我试图让重铸结果持续跟随相机位置。尝试从Apple的iOS13 ARKit3 + SceneKit示例代码派生[放置对象和处理3D交互](https://developer.apple.com/documentation/arkit/placing_objects_and_handling_3d_interaction)我在这里通过确实将调用放入光线投射来满足我的要求进入“会话(_会话:ARSession,didUpdate框架:ARFrame)”。事实上,显然它一定不是“trackedRaycast()”。您的代码是否被连续调用?我要再试一次。 (2认同)