在什么情况下 ARSCNView.raycastQuery 返回 nil?

2023-12-28

在我的渲染器委托中,我从视图中心创建一个光线投射查询,以跟踪估计的平面并显示跟随光线投射结果的 3D 指针。

它是通过以下方式完成的view.raycastQuery(from:allowing:alignment:)但返回的是零。

我的问题是为什么?没有文档说明为什么此函数会返回 nil 值。我知道光线投射结果可能为空,但为什么不会创建查询?

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    guard view.session.currentFrame?.camera.trackingState == .normal else {
        return
    }
    DispatchQueue.main.async {
        let center = view.center
        DispatchQueue.global(qos: .userInitiated).async {
            if let query = view.raycastQuery(from: center, allowing: .estimatedPlane, alignment: .any) {
                let results = view.session.raycast(query)
                ...
            }
            else {
                // sometimes it gets here
            }
        }
    }
}

返回类型ARRaycastQuery?最初是可选的

据苹果公司称文档 https://developer.apple.com/documentation/arkit/arscnview/3194595-raycastquery:

raycastQuery(from:allowing:alignment:)实例方法创建一条从参数屏幕空间点沿 z 轴正方向延伸的射线,确定任何参数目标是否存在于沿着射线的物理环境中的任何位置。如果是这样,ARKit 将返回光线与目标相交的 3D 位置。

如果射线不与目标相交,则不存在ARRaycastQuery目的。所以有nil.

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

回国的两个可能原因是什么nil?

  • 没有检测到射线击中的平面
  • 代码逻辑错误

Solution

您的代码可能如下所示:

@IBOutlet var sceneView: ARSCNView!

@IBAction func onTap(_ sender: UIGestureRecognizer) {

    let tapLocation: CGPoint = sender.location(in: sceneView)
    let estimatedPlane: ARRaycastQuery.Target = .estimatedPlane      
    let alignment: ARRaycastQuery.TargetAlignment = .any

    let query: ARRaycastQuery? = sceneView.raycastQuery(from: tapLocation,
                                                    allowing: estimatedPlane,
                                                   alignment: alignment)
    
    if let nonOptQuery: ARRaycastQuery = query {

        let result: [ARRaycastResult] = sceneView.session.raycast(nonOptQuery)
        
        guard let rayCast: ARRaycastResult = result.first
        else { return }

        self.loadGeometry(rayCast)
    }
}

这是获取模型的方法:

func loadGeometry(_ result: ARRaycastResult) {

    let scene = SCNScene(named: "art.scnassets/myScene.scn")!

    let node: SCNNode? = scene.rootNode.childNode(withName: "model", 
                                               recursively: true)

    node?.position = SCNVector3(result.worldTransform.columns.3.x,
                                result.worldTransform.columns.3.y,
                                result.worldTransform.columns.3.z)

    self.sceneView.scene.rootNode.addChildNode(node!)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在什么情况下 ARSCNView.raycastQuery 返回 nil? 的相关文章

随机推荐

  • SqlAlchemy 的外键问题

    我收到错误 无法从字符串 MACHINE IE 解析 rfc1738 URL 当我尝试导入以下内容时 class MACHINE declarative base tablename MACHINE MACHINE UID Column I
  • 替换 OpenXML 中的内容控件

    我需要一些东西作为占位符 我起初将内容控制视为解决方案 但我遇到了一些问题 然后 我考虑将 CustomXML 添加到 docx 但由于 i4i 诉讼而放弃了这一做法 然后我决定通过 OpenXML SDK 2 0 简单地更改内容控件的文本
  • 如何使用 Prisma 动态生成的包部署到 Vercel

    我正在使用 Prisma 和 Vercel Prisma 动态生成 Prisma 客户端 但 Vercel 会缓存旧客户端并且不会重建它 除非我登录 Vercel 并单击 重新部署 这会强制它重新安装所有软件包 有没有办法强制这个包在我每次
  • viewDidLoad 中的边界和帧大小

    我推了一个视图控制器 mainVC 并向其添加一些子视图 大多数这些视图都是在用户采取某些操作时按需构建的 当我构建每个视图时 我参考mainVC view bounds调整视图大小 根据需求大小构建的就很好 但是第一个 我添加到viewD
  • 立即构建一个工具,以便稍后在同一 CMake 运行中使用它

    我有一个有趣的先有鸡还是先有蛋的问题以及一个潜在的解决方案 请参阅我发布的答案 但该解决方案以一种不寻常的方式使用 CMake 欢迎更好的替代方案或评论 问题 该问题的简单版本可以描述为具有以下特征的单个 CMake 项目 构建目标之一是一
  • 创建对象的静态方法而不是构造函数

    我正在我的 C 应用程序中创建一个 GUI 并且有一个名为GUIObject这是所有其他组件的基类 例如Button CheckBox Window etc 我也有课GUIObjectsStorage 其中包含所有GUIObject被创建的
  • Facebook“publish_actions”权限

    当 Facebook 删除 publish actions 权限时 我无法在用户时间轴上发布任何内容 如果可以 如何在用户时间线上上传视频 或者如何使用 Graph API v2 12 查看 publish actions 权限 2018年
  • 为什么使用Android Room时没有创建数据库文件?

    我在 Android 应用程序中使用 Room Persistence Library 但在创建后 我在设备上找不到包含表的 sql 文件 当我通过创建数据库时SQLiteOpenHelper我可以看到文件夹中的所有表格data在设备上 但
  • 尝试使用多个条件对 Excel 中的单元格进行计数

    正如标题所述 我试图在单独的工作表上计算单元格范围 但似乎无法让它工作 任何帮助将不胜感激 COUNTIFS MONTH original A2 A58 1 original D2 D58 East 问题是Month 部分在你的公式中 我理
  • Python 中的 for 循环

    在 C C 中 我可以有以下循环 for int k 1 k lt c k 2 如何在 Python 中做同样的事情 我可以做这个 for k in range 1 c 在 Python 中 这与 for int k 1 k lt c k
  • MS Access 中存在超过 1 个左连接的问题

    这与我之前的问题有关MS Access 中存在超过 1 个左连接 https stackoverflow com questions 1057167 more than 1 left joins in msaccess 问题是我有 3 个左
  • 在 Rails 应用程序中使用 rmagick 时出错

    尝试运行 Rails 应用程序时出现以下错误 opt ruby enterprise 1 8 7 2010 02 lib ruby gems 1 8 gems rmagick 2 12 2 lib RMagick2 so libMagick
  • 将字符串数组绑定到 DropDownList?

    一个我一直没有解决的问题 我将用两个代码示例进行说明 其中一个可以工作 另一个则不能 Page Load FontFamily oFamilyFontList FontFamily Families DropDownList Fonts D
  • 将自定义图例添加到散景栏

    我有熊猫系列 gt gt gt etypes 0 6271 1 6379 2 399 3 110 4 4184 5 1987 我想在 Bokeh 中绘制条形图 p Bar etypes 然而对于传奇我只是etypes索引号 我尝试用这本字典
  • TextUtils.isEmpty() 方法对于空字符串返回 false

    我有下面的测试返回 false 我错过了什么吗 TextUtils isEmpty 更新 由于某种原因 我无法回答我的问题或添加评论 我正在运行 JUNit 测试用例 而不是仪器测试用例 正如我所建议的 我发现当我们不作为仪器运行时 上述方
  • php db 变量中的下划线导致问题

    我将数据库的所有登录信息存储在公共树之外的变量中 例如 hostname 172 0 0 0 dbname myname mydbname username myname user pw password 这是相当标准的 问题是我正在使用的
  • git 索引损坏

    由于某种原因 我的 Git 索引文件不断损坏 例如 如果我这样做git status I get 错误 索引文件 sha1 签名错误和致命 索引文件损坏 这种情况已经在我身上发生过好几次了 我想这可能与我的开发环境有关 我在 Mac 上工作
  • 如何在JHipster中创建具有集合类型字段的实体?

    在我们的项目中 我们使用领域模型Document A document可能有几个titles 所以用我的 JPA 知识我会建模Document像这样的实体 Entity public class Document private Set
  • 使用 JPA 覆盖 @MappedSuperclass 中定义的 @Id

    我有一个 AbstractEntity 类 它由我的应用程序中的所有实体扩展 并且基本上充当标识符提供者 MappedSuperclass public class AbstractEntity implements DomainEntit
  • 在什么情况下 ARSCNView.raycastQuery 返回 nil?

    在我的渲染器委托中 我从视图中心创建一个光线投射查询 以跟踪估计的平面并显示跟随光线投射结果的 3D 指针 它是通过以下方式完成的view raycastQuery from allowing alignment 但返回的是零 我的问题是为