首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARKit在摄像机的前面做了一个SCNLight点?

ARKit在摄像机的前面做了一个SCNLight点?
EN

Stack Overflow用户
提问于 2017-07-07 16:46:19
回答 1查看 1.3K关注 0票数 3

所以我可以访问sceneView.pointOfView,我想让AR体验就像我把闪光灯直射在我前面的物体上,当我指着它们的时候,我看到的东西就会亮起来。

我试着制造这样的聚光灯:

代码语言:javascript
复制
let spotLight = SCNLight()
spotLight.type = .spot
spotLight.spotInnerAngle = 60
spotLight.spotOuterAngle = 60
let spotNode = SCNNode()
spotNode.light = spotLight
spotNode.position = position

然后我想,将光线添加到pointOfView节点会使光线随着摄像机移动,这意味着它总是会在前面发光……

代码语言:javascript
复制
sceneView.pointOfView?.addChildNode(spotLight)

这是不工作的,物体看起来是黑色的,没有光。

我做错了什么?我想做它,所以光线指向我通过AR的经验看,就像我拿着手电筒,我一直在发光……

有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-07 21:38:03

你是在寻找一个虚拟手电筒来真实地照亮真实世界的场景吗?这是一个很高的要求。

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

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

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

代码语言:javascript
复制
spotNode.position = position

上面的片段并没有说明你从哪里得到这个职位。如果你想要将聚光灯节点连接到摄像机上,那么它应该是一个零矢量。也就是说,您希望它在相机节点的局部空间中有一个中立位置。将这个矢量设置为非零将抵消你的光源从相机的位置,以一个恒定的位移(可能是如此之多,它导致光没有做任何有用的在你的场景)。

代码语言:javascript
复制
sceneView.pointOfView?.addChildNode(spotLight)

根据此代码的运行时间,sceneView.pointOfView可能为零,因此您实际上并不执行addChildNode调用。检查以确保相机节点存在,然后再向其添加子节点。(我尝试将这段代码添加到ARKit WWDC17会话中的示例代码中--如果将它放入它们的ARSCNView.setup()函数中,您应该会看到您放置的任何虚拟对象都会被明亮的聚光灯完全抛出。)

顺便说一句,您不一定需要向pointOfView节点中添加一个子节点才能保持光-- pointOfView节点可以同时有一个摄像机和一个灯。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44975983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档