ARKit:在距相机特定Z距离的特定像素处绘制节点

时间:2018-06-25 02:50:26

标签: swift nodes arkit pixels

enter image description here

请参考上图。我在屏幕中央有一个红色节点,距离为1.0单位(1米远)。[请参阅iPhone Portrait Top View]

我要做的是捕获iPhone屏幕快照,得到的图像为750 x 1334像素[请参阅iPhone纵向前视图]

sceneView.snapshot()

我想做的是在iPhone屏幕相对于Red Circle的四个侧面(位于屏幕的死点)放置4个Red Square节点。我这样做是为了标记我做快照的位置。我想知道的是,如何在给定z距离的情况下精确地在某个x,y点上绘制盒节点。 (Z的值不是固定的,我仅使用1.0作为示例方案。)我想在给定的位置绘制(0,0),(750,0),(0,1334)和(750,1334) z为1.0并假设我在三脚架上,绘制的节点将出现在iPhone屏幕的四个侧面上。

我的数学非常糟糕,这个问题对我来说很难解决,要靠我目前的数学技能来解决。有人可以帮忙吗?好吗?

1 个答案:

答案 0 :(得分:0)

由于您需要ARnchor节点(以标记快照的完成位置),因此使用来自摄像机的实时信息而不是快照可能会更容易。特别是由于2D图像中的像素是从左到右和从上到下引用的(“ 0,0”坐标位于左上角) ...,我们知道AR节点是在3D坐标中引用的,而本地节点的中心是0,0,0坐标。

我尚未进行代码测试,但我认为以下属性应该有所帮助:

    let pPoint  = sceneView.projectPoint(self.centerBall.position)
    let fieldW  = sceneView.session.currentFrame?.camera.imageResolution.width
    let fieldH  = sceneView.session.currentFrame?.camera.imageResolution.height

“ pPoint”应返回与“ centerBall”的(0,0,0)3D坐标相对应的2D坐标,从那里应进行加或减计算以获得2D中的所有4个角。

最后将每个角的2D坐标传递到“ unprojectPoint( :)”方法应提供3D“世界”坐标,并且可以使用“ convertPosition()将其转换为” centerBall”坐标。位置:SCNVector3,来自节点:SCNNode?)“方法

这似乎很有趣,因此请在周末之前尝试对此进行编码

最后,我怀疑ARanchor节点可能不是100%稳定的