Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 具有以前设备位置的ARKit投影点_Swift_Scenekit_Arkit - Fatal编程技术网

Swift 具有以前设备位置的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

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

  • 使用ARKit获得节点位置的估计值,并在世界中放置一个虚拟对象
  • 使用CNN获取对象的估计2D位置
  • 相应地更新节点位置(以优化其在三维空间中的位置)
  • 问题是#2需要0,3秒左右。因此,我不能使用
    sceneView.unprojectPoint
    ,因为该点将对应于从#1开始的设备世界位置的3D点


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

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

    非项目函数通常做两件事:

  • 将视口坐标(像素)转换为剪辑空间坐标系(-1.0到1.0)

  • 反转投影变换(假定剪辑空间中的某个任意Z值)和视图(摄影机)变换以获得三维世界空间坐标

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

    现在,使用它。。。传递给此函数的
    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
    }