gpt4 book ai didi

swift - 具有先前设备位置的 ARKit 项目点

转载 作者:搜寻专家 更新时间:2023-11-01 07:06:12 26 4
gpt4 key购买 nike

我将 ARKit 与 CNN 相结合,以便在 ARKit 节点漂移时不断更新它们。所以:

  1. 使用 ARKit 估计节点位置并将虚拟对象放置在世界中
  2. 使用 CNN 获取对象的估计二维位置
  3. 相应地更新节点位置(以细化它在 3D 空间中的位置)

问题是#2 需要 0.3 秒左右。因此,我不能使用 sceneView.unprojectPoint,因为该点将对应于来自 #1 的设备世界位置的 3D 点。

如何计算从我的旧位置到 CNN 的 2D 点的 3D 向量?

最佳答案

unprojectPoint 只是一个矩阵数学便利函数,类似于许多面向图形的库(如 DirectX、旧式 OpenGL、Three.js 等)中的函数。在 SceneKit 中,它作为 View 上的一种方法提供,这意味着它使用模型/ View /投影矩阵和 View 当前用于渲染的视口(viewport)进行操作。但是,如果您知道该功能的工作原理,则可以自己实现。

Unproject 函数通常做两件事:

  1. 将视口(viewport)坐标(像素)转换为裁剪空间坐标系(所有方向上的 -1.0 到 1.0)。

  2. 反转投影变换(假设裁剪空间中的某个任意 Z 值)和 View (相机)变换以获得 3D 世界空间坐标。

有了这些知识,我们就可以构建自己的函数了。 (警告:未经测试。)

func unproject(screenPoint: float3, // see below for Z depth hint discussion
modelView: float4x4,
projection: float4x4,
viewport: CGRect) -> float3 {

// viewport to clip: subtract viewport origin, divide by size,
// scale/offset from 0...1 to -1...1 coordinate space
let clip = (screenPoint - float3(viewport.x, viewport.y, 1.0))
/ float3(viewport.width, viewport.height, 1.0)
* float3(2) - float3(1)
// apply the reverse of the model-view-projection transform
let inversePM = (projection * modelView).inverse
let result = inversePM * float4(clip.x, clip.y, clip.z, 1.0)
return float3(result.x, result.y, result.z) / result.w // perspective divide
}

现在,要使用它...传递给此函数的 modelView 矩阵是 ARCamera.transform 的逆矩阵,您还可以获得 projectionMatrix 直接来自 ARCamera。因此,如果您在某个时间点抓取 2D 位置,那么也抓取相机矩阵,这样您就可以从那时起回溯到 3D。

仍然存在我提到的“Z 深度提示”问题:当渲染器将 3D 投影到 2D 时,它会丢失信息(实际上是其中一个 D)。因此,当您转换回 3D 时,您必须恢复或猜测该信息——您传递给上述函数的 screenPoint 是 x 和 y 像素坐标,加上一个介于 0 和 1 之间的深度值。零离相机越近,1越远。你如何利用这种取决于你的算法的其余部分是如何设计的。 (至少,您可以取消投影 Z=0 和 Z=1,并且您将获得 3D 线段的端点,原始点某处沿该线。)

当然,这是否真的可以与您新颖的基于 CNN 的方法放在一起完全是另一个问题。但至少你学到了一些有用的 3D 图形数学知识!

关于swift - 具有先前设备位置的 ARKit 项目点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47887080/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com