【问题标题】:Is it possible to place objects with hit test without plane detection?是否可以在没有平面检测的情况下放置带有碰撞测试的物体?
【发布时间】:2019-11-13 22:38:30
【问题描述】:

按照 Apple 的 Creating an Immersive AR Experience with Audio ,我认为尝试将对象放置在任何地方而不是垂直和水平平面上会很有趣。是否可以在没有平面检测的情况下使用触摸放置对象?我知道平面检测会提高命中测试和 ARAnchor 检测的准确性,那么有什么方法可以在场景中的任何其他位置执行命中测试吗?

【问题讨论】:

    标签: swift scenekit augmented-reality arkit realitykit


    【解决方案1】:

    如果您的 AR 场景在当前会话中已经包含任何 3D 几何体,您绝对可以使用 hit-testing 在其中放置新模型(基于已包含的 3D 几何体的放置),或者您可以使用特征点来放置模型(如果有)。

    如果您的 AR 场景中根本没有 3D 几何图形,或者有一个非常稀疏的点云,那么您会将命中测试方法应用于什么?命中测试是将 2D 点从屏幕空间投影到 3D 表面(请记住,检测到的平面是隐藏的 3D 平面)或任何适当的 feature point

    因此,在 AR 中,平面检测在开发人员使用命中测试时至关重要

    func hitTest(_ point: CGPoint, 
                   types: ARHitTestResult.ResultType) -> [ARHitTestResult]
    

    在这里您可以看到所有可用的ARHitTestResult.ResultType

    但是注意这个,有一个hitTest方法返回SCNHitTestResult

    func hitTest(_ point: CGPoint, 
                 options: [SCNHitTestOption : Any]?) -> [SCNHitTestResult]
    

    用法:

    let touchPosition: CGPoint = gesture.location(in: sceneView)
    
    let hitTestResult = sceneView.hitTest(touchPosition, 
                                          types: .existingPlaneUsingExtent)
    

    或:

    let hitTestResult = sceneView.hitTest(touchPosition, 
                                          types: .featurePoint)
    

    此外,命中测试在 3D 游戏中得到了积极使用,但它更适用于 VR 而不是 AR。

    【讨论】:

    • 谢谢。所以,我自己说,命中测试主要是确定地理2D平面的功能,而不是3D平面。 ARKit 构建了一个粗略的点云来了解用户周围的 3D 世界,然后将这些点视为可能是现实世界平面一部分的锚点。我仍然不确定的是:我可以在非 2D 平面上进行命中测试吗?例如,将 3D 对象放置在空中而不是表面上。
    • 您可以将 3D 对象放置在空中而无需使用命中测试。为此,您可以使用 ARCamera + 一些 z 距离的变换矩阵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    相关资源
    最近更新 更多