3

因此,我可以访问,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 体验看到的东西,就好像我拿着手电筒,我正向前方照射光......

有什么建议吗?

4

1 回答 1

4

您是否正在寻找一种虚拟手电筒,可以真实地照亮相机馈送中的真实场景?这是一个非常高的要求。

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

(如果你想不真实地照亮现实世界的场景,你需要做的就是在视图中间放置一个半透明的白色圆圈。也许会喜欢混合模式。为了更真实一点,改变基于对AR 场景的视图中心的命中测试,您的圆圈的大小或到该圆圈的 3D 距离。)


您想要一个能够照亮您在 AR 中放置的虚拟对象的虚拟手电筒吗?这很容易做到。事实上,您的代码是实现这一目标的大部分方法。可能的问题:

spotNode.position = position

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

sceneView.pointOfView?.addChildNode(spotLight)

根据此代码运行的时间,sceneView.pointOfView可能为 nil,因此您实际上并未执行addChildNode调用。在向其添加子节点之前检查以确保相机节点存在。(我尝试将此代码添加到来自ARKit WWDC17 会话的示例代码中——如果你把它放在他们的ARSCNView.setup()函数中,你应该会看到你放置的任何虚拟对象都被明亮的聚光灯完全变白了。)

顺便说一句,您不一定需要向节点添加子节点pointOfView来保存灯光——pointOfView节点可以同时连接相机和灯光。

于 2017-07-07T21:38:03.640 回答