在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体

2024-01-10

我在寻找什么?

我的要求的简单解释是这样的

  1. 使用 ARKit,使用 iPhone 相机检测对象
  2. 找到这个物体在这个虚拟空间上的位置
  3. 使用 SceneKit 将 3D 对象放置在该虚拟空间上。 3D 对象应该位于 标记。

一个示例是使用相机检测 3D 空间中的小图像/标记位置,在虚拟空间中的该标记后面放置另一个 3D 球模型(因此球将对用户隐藏,因为标记/图像位于前面)

到目前为止我能做什么?

  1. 我能够使用 ARKit 检测标记/图像
  2. 我能够在屏幕上放置球 3D 模型。

我的问题是什么?

我无法将球放置在检测到的标记后面。

当球位于标记前面时,球会正确隐藏标记。您可以在侧视图中看到球位于标记的前面。见下文

但当球位于标记后面时,则不会发生相反的情况。球总是在前方阻挡标记。我预计记分员会隐藏球。所以场景不考虑球位置的 z 深度。见下文

Code

也请看一下评论

override func viewDidLoad() {
    super.viewDidLoad()

    sceneView.delegate = self
    sceneView.autoenablesDefaultLighting = true

    //This loads my 3d model.
    let ballScene = SCNScene(named: "art.scnassets/ball.scn")
    ballNode = ballScene?.rootNode

    //The model I have is too big. Scaling it here.
    ballNode?.scale = SCNVector3Make(0.1, 0.1, 0.1)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    //I am trying to detect a marker/image. So ImageTracking configuration is enough
    let configuration = ARImageTrackingConfiguration()

    //Load the image/marker and set it as tracking image
    //There is only one image in this set
    if let trackingImages = ARReferenceImage.referenceImages(inGroupNamed: "Markers",
                              bundle: Bundle.main) {
        configuration.trackingImages = trackingImages
        configuration.maximumNumberOfTrackedImages = 1
    }

    sceneView.session.run(configuration)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    sceneView.session.pause()
}


func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
    let node = SCNNode()

    if anchor is ARImageAnchor {
        //my image is detected
        if let ballNode = self.ballNode {

            //for some reason changing the y position translate the ball in z direction
            //Positive y value moves it towards the screen (infront the marker)
            ballNode.position = SCNVector3(0.0, -0.02, 0.0)

            //Negative y value moves it away from the screen (behind the marker)
            ballNode.position = SCNVector3(0.0, -0.02, 0.0)
            node.addChildNode(ballNode)
        }
    }

    return node
}

如何使场景尊重 z 位置?或者换句话说,如何在使用 ARKit 框架检测到的图像/标记后面显示 3D 模型?

我正在使用 Xcode 10.3 针对 iOS 12 运行。如果需要任何其他信息,请告诉我。


为此,您需要在 3D 场景中创建一个遮挡物。自从ARReferenceImage has a physicalSize当场景中添加几何体时,应该很简单ARImageAnchor被建造。

几何形状将是SCNPlane with a SCNMaterial适合封堵器。我会选择一个SCNLightingModelConstant照明模型(这是最便宜的,我们实际上不会绘制飞机)colorBufferWriteMask等于SCNColorMaskNone。该对象应该是透明的,但仍然写入深度缓冲区(这就是它充当遮挡器的方式)。

最后,通过设置遮挡物来确保遮挡物在任何增强对象之前渲染renderingOrder to -1(如果应用程序已经使用渲染顺序,则可以使用更低的值)。

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

在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体 的相关文章

随机推荐

  • Java中的动态ArrayList

    我对java有一个疑问 我们可以创建动态的吗 ArrayList or String 在 for 循环内 例如 在我的应用程序中 有类别字段 不是静态的 从服务器获取 我想创建ArrayList or String 基于类别大小的对象 如何
  • 允许任何语言的字母(如“ñ”)的正则表达式

    尝试让用户使用其他语言 例如西班牙语或法语 中的特殊字符 我原来有这个 A Za z0 9 i 然后将其更改为 p L p N i 但仍然不起作用 应允许使用诸如 之类的字母 谢谢 修订 我发现在开头加上 UTF8 有助于解决问题 所以我使
  • Nodejs 可以与 Cakephp 集成吗?

    我想实时监控用户输入的数据comments桌子 我有一个 Apache 服务器正在运行 并且假设它在端口 1337 上有一个节点服务器 每次有人保存新数据时 我该怎么做 例如返回表中的总行数comment并显示在view 也许方法是使 th
  • 自动展开PropertyGrid中的一些属性

    我想通过使用该类的属性来自动展开加载了我的 SettingsStructure 类的实例的 PropertyGrid 中的一些节点 另外 如果用户在 PropertyGrid 上再次加载该实例 我试图让实例 记住 每个属性是否已展开 我做了
  • 在SQL中显示表的结构

    有人可以向我更好地解释一下吗 如何显示表的结构 我运行select from table 当然它会显示表中的所有内容 但是 我被要求显示表的结构 这是什么意思 命令是什么 这是我的下表 SQL gt select from dept DEP
  • 我应该在 Python 中使用“公共”属性还是“公共”属性?

    在 Python 中 我有以下示例类 class Foo self attr 0 property def attr self return self attr attr setter def attr self value self at
  • 从 data.table 聚合返回多列[重复]

    这个问题在这里已经有答案了 我想用data table作为替代aggregate or ddply 因为这两种方法没有像希望的那样有效地扩展到大型对象 不幸的是 我还没有弄清楚如何让向量返回聚合函数在结果中生成多列data table 例如
  • Bootstrap 3:嵌套选项卡

    我试图将一个选项卡放在一个选项卡内 但是每当我单击内部嵌套选项卡时 整个内部嵌套选项卡行就会消失 这是 jsfiddle 中的示例 http jsfiddle net jNWMY 1 http jsfiddle net jNWMY 1 尝试
  • 创建原始数据包来欺骗 UDP 数据包

    我正在寻找使用 Java 欺骗 UDP 数据包 有没有好的 Java 库可以让您创建自己的原始套接字 我会使用一个 Java API 来包装libpcap http www tcpdump org libpcap 有一个 注入 功能 允许您
  • 如何不在nginx访问日志中记录get请求参数?

    我需要启用访问日志 但出于合规性原因 无法在访问日志中记录敏感 GET 请求参数的数据 虽然我知道 我可以解析日志 事后 并清理它们 但这不是一个可接受的解决方案 因为出于合规性原因 日志不能被篡改 如何防止 sensitive data
  • 正则表达式匹配除某些之外的所有集合

    我确定以前曾问过这个问题 但我似乎找不到它 或知道要搜索的正确措辞 基本上我想要一个匹配除连字符之外的所有非字母数字的正则表达式 所以基本上匹配 W 除了排除 我不知道如何从预制集中排除特定的 W是一个简写 w So w 一些背景知识 定义
  • 识别批处理文件的运行实例

    这些对我不起作用 有什么帮助可以明确纠正以下四个示例吗 即使我打开了三个 CMD exe EXAMPLE01 也只是回显 继续 示例 01 echo off wmic process where name cmd exe find cmd
  • 依赖于自身的 Spark 窗口函数

    假设我在 DataFrame 中有一列已排序的时间戳 我想编写一个函数 向该 DataFrame 添加一列 根据以下规则将时间戳切割成连续的时间片 从第一行开始并继续迭代到最后 对于每一行 如果您在当前组中走了 n 行 或者您在当前组中走了
  • 获取从星期日开始的周数

    我目前有这样的代码 我可以通过添加和减去按钮获取周数以及该周的开始 结束日 Date prototype getWeekNumber function var d new Date Date UTC this getFullYear thi
  • Razor:条件语句中的 标记引发错误

    if Model Property null
  • Jenkins“仅在构建成功时才运行”对于不成功的构建仍然运行

    我正在使用 Jenkins 进行持续集成 并且我有一些具有上游和下游构建连接的项目 我已选择Run only if build succeeds在每个项目的配置中 然而 构建后步骤仍然会因不稳定的构建而被触发 詹金斯版本是 1 480 3
  • 使用循环数组实现队列:调整循环数组大小的最佳方法是什么?

    我正在实施一个使用循环数组进行队列 我有点陷入困境resize 方法实现 当数组已满时 在 的里面enqueue 方法我检查数组的大小是否等于它的长度 并获取它是否已满 现在 我不再抛出异常 而是尝试调整数组的大小 问题是 我有两种情况要考
  • postgresql 中 array_agg 的子选择

    有没有办法在 Postgresql 9 2 的having子句中使用聚合函数的值 例如 我想得到每个monkey id第二高的number gt 123 也是第二高的数字 在下面的示例中 我想获取 monkey id 1 number 22
  • 使用 AddDistributedRedisCache 时设置 IDistributedCache.SetAsync 的过期时间

    我正在使用 net core api 2 1 和 aws redis 缓存 我没有找到设置过期时间的方法IDistributedCache SetAsync https learn microsoft com en us dotnet ap
  • 在 iOS 中使用相机检测物体并使用 ARKit 定位 3D 物体

    我在寻找什么 我的要求的简单解释是这样的 使用 ARKit 使用 iPhone 相机检测对象 找到这个物体在这个虚拟空间上的位置 使用 SceneKit 将 3D 对象放置在该虚拟空间上 3D 对象应该位于 标记 一个示例是使用相机检测 3