所以我可以访问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的经验看,就像我拿着手电筒,我一直在发光……
有什么建议吗?
发布于 2017-07-07 21:38:03
你是在寻找一个虚拟手电筒来真实地照亮真实世界的场景吗?这是一个很高的要求。
你说的基本上是投影--将一个光锥映射到每个可见的真实表面,这需要检测和建模这些表面,这比水平平面检测ARKit所做的要多得多。
(如果你不想现实地照亮现实世界的场景,你所需要做的就是把一个半透明的白色圆圈放在视图的中间。)也许你会喜欢混合模式。为了更真实一点,可以根据命中测试改变你的圆圈的大小或3D距离--相对于AR场景,这是你视图的中心。)
您想要一个虚拟手电筒来照亮您放置在AR中的虚拟对象吗?这很容易做到。事实上,您的代码是实现这一目标的主要方法。可能出现的问题:
spotNode.position = position上面的片段并没有说明你从哪里得到这个职位。如果你想要将聚光灯节点连接到摄像机上,那么它应该是一个零矢量。也就是说,您希望它在相机节点的局部空间中有一个中立位置。将这个矢量设置为非零将抵消你的光源从相机的位置,以一个恒定的位移(可能是如此之多,它导致光没有做任何有用的在你的场景)。
sceneView.pointOfView?.addChildNode(spotLight)根据此代码的运行时间,sceneView.pointOfView可能为零,因此您实际上并不执行addChildNode调用。检查以确保相机节点存在,然后再向其添加子节点。(我尝试将这段代码添加到ARKit WWDC17会话中的示例代码中--如果将它放入它们的ARSCNView.setup()函数中,您应该会看到您放置的任何虚拟对象都会被明亮的聚光灯完全抛出。)
顺便说一句,您不一定需要向pointOfView节点中添加一个子节点才能保持光-- pointOfView节点可以同时有一个摄像机和一个灯。
https://stackoverflow.com/questions/44975983
复制相似问题