ARKit在相机正在寻找的位置提前点SCNLight点?

时间:2017-07-07 16:46:20

标签: ios scenekit arkit

所以我可以访问sceneView.pointOfView并且我想让AR体验感觉就像我正在我的前面照射闪光灯,当我指向它们时,我看着它变得明亮。

我试图创建一个像这样的聚光灯:

let spotLight = SCNLight()
spotLight.type = .spot
spotLight.spotInnerAngle = 60
spotLight.spotOuterAngle = 60
let spotNode = SCNNode()
spotNode.light = spotLight
spotNode.position = position

然后我认为将光添加到pointOfView节点会使光线随着相机一起移动,这意味着它总是会照亮前方......

sceneView.pointOfView?.addChildNode(spotLight)

这不起作用,物体显得黑色,没有光线。

我做错了什么?我希望通过AR体验让我看到的点亮,就好像我拿着手电筒一样,我正在向前照射光线......

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

您是否正在寻找能真实照亮相机Feed中真实世界场景的虚拟手电筒?这是一个非常高的命令。

你基本上是在谈论将光锥投影到每个可见的真实世界表面上,这需要检测和建模这些表面,这比ARKit的水平平面检测要多得多。

(如果你不想逼真地照亮现实世界的场景,你需要做的就是在视图的中间放置一个半透明的白色圆圈。也许是喜欢混合模式。更多一点点逼真,根据您对AR场景的视图中心的hit-testing,改变圆圈的大小或3D距离。)

您想要一个虚拟手电筒照亮您放置在AR中的虚拟物体吗?这很容易实现。事实上,您的代码是实现这一目标的最佳方式。可能存在的问题:

spotNode.position = position

上面的代码段并未说明您获得此职位的位置。如果您希望聚光灯节点连接到相机,它应该是零向量。也就是说,您希望它在摄像机节点的本地空间中具有中性位置。将此向量设置为非零会使光源从相机位置偏移一个恒定的位移(可能会导致光线在场景中没有做任何有用的事情)。

sceneView.pointOfView?.addChildNode(spotLight)

根据此代码运行的时间,sceneView.pointOfView可能为零,因此您实际上并未执行addChildNode调用。在向其添加子项之前,请检查以确保相机节点存在。 (我尝试将此代码添加到ARKit WWDC17 session的示例代码中 - 如果您将其放入ARSCNView.setup()函数中,您应该会看到任何虚拟对象被明亮的聚光灯完全剔除。)< / p>

顺便说一句,您不一定需要将子节点添加到pointOfView节点以保持灯光 - pointOfView节点可以同时连接摄像机和灯光。