Swift 具有以前设备位置的ARKit投影点
我将ARKit与CNN相结合,以便在ARKit节点漂移时不断更新它们。因此:Swift 具有以前设备位置的ARKit投影点,swift,scenekit,arkit,Swift,Scenekit,Arkit,我将ARKit与CNN相结合,以便在ARKit节点漂移时不断更新它们。因此: 使用ARKit获得节点位置的估计值,并在世界中放置一个虚拟对象 使用CNN获取对象的估计2D位置 相应地更新节点位置(以优化其在三维空间中的位置) 问题是#2需要0,3秒左右。因此,我不能使用sceneView.unprojectPoint,因为该点将对应于从#1开始的设备世界位置的3D点 如何计算从旧位置到CNN 2D点的3D向量?unprojectPoint只是一个矩阵数学便利函数,类似于许多面向图形的库(如Dir
sceneView.unprojectPoint
,因为该点将对应于从#1开始的设备世界位置的3D点
如何计算从旧位置到CNN 2D点的3D向量?
unprojectPoint
只是一个矩阵数学便利函数,类似于许多面向图形的库(如DirectX、老式OpenGL、Three.js等)中的函数。在SceneKit中,它作为视图上的一种方法提供,这意味着它使用视图当前用于渲染的模型/视图/投影矩阵和视口进行操作。但是,如果您知道该函数是如何工作的,您可以自己实现它
非项目函数通常做两件事:
modelView
矩阵是ARCamera.transform
的逆矩阵,您也可以直接从ARCamera
获取projectionMatrix
。因此,如果您在某个时间点获取2D位置,也可以获取摄影机矩阵,这样您就可以在该时间点向后工作到3D
我提到的“Z深度提示”仍然存在一个问题:当渲染器将3D投影到2D时,它会丢失信息(实际上是其中一个D)。因此,当您转换回3D时,您必须恢复或猜测该信息-传递到上述函数的screenPoint
是x和y像素坐标,加上0和1之间的深度值。0离相机越近,1离相机越远。你如何利用这种方法取决于你剩下的算法是如何设计的。(至少,您可以同时取消Z=0和Z=1的投影,并在3D中获得线段的端点,原始点位于该直线的某个位置。)
当然,这是否真的可以与你基于CNN的新方法结合起来,完全是另一个问题。但至少你学会了一些有用的3D图形数学 嗨,瑞克斯特!有没有办法在ARKit/scenekit中将3D点转换为2D?我看着项目点,不确定如何正确地应用它。你能帮我一下吗?
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
}