检查 ARReferenceImage 是否在相机视图中不再可见

2024-04-28

我想检查一下是否AR参考图像 https://developer.apple.com/documentation/arkit/arreferenceimage在相机视图中不再可见。目前我可以检查图像的节点是否在相机的视图中,但是当AR参考图像 https://developer.apple.com/documentation/arkit/arreferenceimage被其他图像覆盖或图像被删除时。

func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
    guard let node = self.currentImageNode else { return }

    if let pointOfView = sceneView.pointOfView {
        let isVisible = sceneView.isNode(node, insideFrustumOf: pointOfView)
        print("Is node visible: \(isVisible)")
    }
}

因此,我需要检查图像是否不再可见,而不是图像的节点可见性。但我不知道这是否可能。第一个屏幕截图显示了找到下面的图像时添加的三个框。当找到的图像被覆盖时(参见屏幕截图 2),我想删除这些框。


我设法解决了这个问题!使用了一点 Maybe1 的代码和他的概念来解决问题,但是以不同的方式。下面这行代码仍然用于重新激活图像识别。

// Delete anchor from the session to reactivate the image recognition
sceneView.session.remove(anchor: anchor) 

让我解释。首先我们需要添加一些变量。

// The scnNodeBarn variable will be the node to be added when the barn image is found. Add another scnNode when you have another image.    
var scnNodeBarn: SCNNode = SCNNode()
// This variable holds the currently added scnNode (in this case scnNodeBarn when the barn image is found)     
var currentNode: SCNNode? = nil
// This variable holds the UUID of the found Image Anchor that is used to add a scnNode    
var currentARImageAnchorIdentifier: UUID?
// This variable is used to call a function when there is no new anchor added for 0.6 seconds    
var timer: Timer!

完整代码,下面有注释。

/// - Tag: ARImageAnchor-Visualizing
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
    guard let imageAnchor = anchor as? ARImageAnchor else { return }

    let referenceImage = imageAnchor.referenceImage

    // The following timer fires after 0.6 seconds, but everytime when there found an anchor the timer is stopped.
    // So when there is no ARImageAnchor found the timer will be completed and the current scene node will be deleted and the variable will set to nil
    DispatchQueue.main.async {
        if(self.timer != nil){
            self.timer.invalidate()
        }
        self.timer = Timer.scheduledTimer(timeInterval: 0.6 , target: self, selector: #selector(self.imageLost(_:)), userInfo: nil, repeats: false)
    }

    // Check if there is found a new image on the basis of the ARImageAnchorIdentifier, when found delete the current scene node and set the variable to nil
    if(self.currentARImageAnchorIdentifier != imageAnchor.identifier &&
        self.currentARImageAnchorIdentifier != nil
        && self.currentNode != nil){
            //found new image
            self.currentNode!.removeFromParentNode()
            self.currentNode = nil
    }

    updateQueue.async {

        //If currentNode is nil, there is currently no scene node
        if(self.currentNode == nil){

            switch referenceImage.name {
                case "barn":
                    self.scnNodeBarn.transform = node.transform
                    self.sceneView.scene.rootNode.addChildNode(self.scnNodeBarn)
                    self.currentNode = self.scnNodeBarn
                default: break
            }

        }

        self.currentARImageAnchorIdentifier = imageAnchor.identifier

        // Delete anchor from the session to reactivate the image recognition
        self.sceneView.session.remove(anchor: anchor)
    }

}

当计时器结束表明没有找到新的 ARImageAnchor 时删除该节点。

@objc
    func imageLost(_ sender:Timer){
        self.currentNode!.removeFromParentNode()
        self.currentNode = nil
    }

这样当图像被覆盖或者发现新的图像时,当前添加的scnNode就会被删除。

遗憾的是,该解决方案并没有解决图像的定位问题,原因如下:

ARKit 不会跟踪每个检测到的图像的位置或方向的变化。

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

检查 ARReferenceImage 是否在相机视图中不再可见 的相关文章

随机推荐

  • 确保 QTableView 中列的唯一值

    我已经实现了一个自定义QTableView and QAbstractTableModel The QTableView使用Qt 用于操作字符串数据的默认文本行编辑委托 我想确保在提交编辑后 按enter 该字符串对于其列来说是唯一的 如果
  • ngClassOdd/ngClassEven 未按预期工作

    使用 Angular 版本 1 2 15 我发现了一个错误 该错误似乎从版本 1 2 2 开始直到 1 2 15 重现 Plunker 演示 http plnkr co edit 3nExMtZ92AQS7BvLsQ8m p preview
  • 同时验证 C# Windows 窗体上的多个文本框

    我有一个带有几个文本框和其他控件的表单 我正在使用 errorprovider 控件 并将验证事件连接到需要验证的每个文本框上 当一个控件将焦点转移给另一个控件时 将发生 Validating 事件 因此 当您使用 Tab 键离开当前控件或
  • 对象作为参数传递给另一个类,通过值还是引用?

    在C 中 我知道默认情况下 传递给函数的任何参数都是通过复制的 也就是说 在函数内 有一个参数的本地副本 但是 当一个对象作为参数传递给另一个类时该怎么办 像下面这样的场景是通过引用传递还是通过值传递 class MyClass priva
  • 递归 - 与 Java 中不重复的数组相结合

    所以我知道如何获取组合的大小 数组大小 在我的例子中 除以所需数组子集大小的阶乘 我遇到的问题是获取组合 到目前为止 我已经阅读了 stackoverflow 上的大部分问题 但一无所获 我认为我发现的问题是我想将创建的组合子集中的元素添加
  • Azure DevOps REST API - 选项列表如何与字段关联?

    I am trying to use rest to create fields and picklists on the web site I created a field as type picklist String and add
  • MySQL 存储映像 BLOB 不良实践性能

    我知道不建议在 SQL 中将图像存储为 BLOB 然而 在我的本地 PC 和服务器上同时工作使得在两者之间同步图像变得困难 是否还有理由不单独使用 BLOB 作为备份 这会在本地创建缓存文件 以静态方式提供服务 本质上 只有选择 BLOB
  • 当 br 位于允许的内容中时,ckeditor 会删除

    当我将 br 添加到 ckeditor 允许的内容并添加 br 标签正在被更改为 br 但是当我添加 br 它正在被删除 为什么当 br 属于允许的内容时它会被删除 有什么建议么 您的帖子中缺少一些内容 不知道为什么 也不知道您想说什么 如
  • 堆内存和Slab分配

    我很困惑heap and free list 我有几个问题 我对C中malloc的工作原理有自己的理解 如果我错了 请纠正我 堆内存是否被组织为数据的链表 空闲列表 块 堆内存和空闲列表有区别吗 我对存储分配的理解 有待改进 当我们调用ma
  • 如何获取资源文件中所有资源的名称

    在 Visual Basic 项目中 我添加了一个包含一堆图像的资源文件 resx 现在我想查询图像的名称 如果我在 Visual Studio IDE 的设计器视图中打开 resx 文件并选择一个图像 属性网格会显示一个名称属性 默认为
  • 如何使用共享数据库在 Heroku 上进行 GIS 查询?

    我有一张带有纬度和经度的地理编码位置表 我希望我的数据库查询返回它们的过滤列表 按距固定点的距离排序 我探索过以下几个选项 Postgresql 的 Earthdistance 贡献 http www postgresql org docs
  • 无法通过 phantomjs 网络服务器传送图像文件

    我正在尝试让 phantomjs 网络服务器为我工作 我想提供 2 个文件 html 文件和 png 图像文件 html 文件服务良好并在浏览器中正确呈现 但 png 文件不是 这是服务器的代码 var fs require fs func
  • 使用 CORS 进行 React 中的 Fetch 时出现问题

    我对 CORS 完全陌生 并且遇到以下问题 我正在使用 create react app 端口 3000 调用 spring boot 端口 8080 中创建的一些 REST 服务 我将 JWT 身份验证添加到我的 REST API 中 因
  • 如何根据本地目录中的requirements.txt 文件使用pip 安装软件包?

    问题是这样的 我有一个要求 txt文件看起来像 BeautifulSoup 3 2 0 Django 1 3 Fabric 1 2 0 Jinja2 2 5 5 PyYAML 3 09 Pygments 1 4 SQLAlchemy 0 7
  • mongodb 聚合随机化(shuffle)结果

    我正在浏览一堆 mongo 文档 但找不到洗牌或随机化结果内容的可能性 有没有 特别是对于聚合框架本身来说 实际上并没有任何本地方法 因为还没有可用的运算符来执行诸如生成随机数之类的操作 因此 无论您可能投射一个字段进行排序的任何匹配 都不
  • 打开和关闭 RDP 窗口

    我有很多服务器 我想检查是否可以使用 RDP 连接到它们 我有 2000 台服务器 所以我想实现自动化 我对 PowerShell 不太熟悉 以下是我所掌握的 列表 txt ip1 ip2 ip3 ipn 这是我的代码 我在每个 ip 上循
  • 解决 emacs 错误的想法:“应用:生成子进程:exec 格式错误”

    我正在尝试将 rdebug 与 emacs 和 cygwin 一起使用 但遇到了麻烦 每当我执行 M x rdebug 并为其提供适当的脚本来运行时 它都会因错误而停止 apply Spawning child process exec f
  • 是否可以在 Cython 中声明和定义位字段?

    在 C C 中你可以声明一个位域 https en cppreference com w cpp language bit field作为结构体 通过指定用于结构体中给定字段的位数 例如 typedef struct char threeB
  • 如何在 ActionBar Sherlock 中使用滑动菜单?

    我正在尝试在使用操作栏 Sherlock 的现有项目中使用滑动菜单 但我无法做到这一点 如果您能给我一个简单的演示或教程来向我展示如何做到这一点 那就太好了 我们必须使用片段来实现滑动菜单吗 Update 当用户单击滑动菜单列表中的某个项目
  • 检查 ARReferenceImage 是否在相机视图中不再可见

    我想检查一下是否AR参考图像 https developer apple com documentation arkit arreferenceimage在相机视图中不再可见 目前我可以检查图像的节点是否在相机的视图中 但是当AR参考图像