首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >深色/减轻ARKit相机在物体后面的馈送

深色/减轻ARKit相机在物体后面的馈送
EN

Stack Overflow用户
提问于 2017-12-06 16:48:11
回答 3查看 1.5K关注 0票数 3

我目前正在做一个ARKit项目,在那里我想要使实际的相机馈送变暗,这样我的3D场景中的物体就更突出了。

到目前为止,我发现了2种解决方案:

A)手动将CIFilter应用于摄像机帧,并将其设置为SceneKit场景的背景图像,正如在这是如此的帖子中回答的那样,这里的问题是fps坦克非常明显。

B)设置如下背景颜色:

代码语言:javascript
运行
复制
sceneView.scene.background.contents = UIColor(white: 0.0, alpha: 0.2)

可悲的是,alpha <1的颜色仍然是不透明的,所以不管我设置了什么alpha,我都看不到相机的任何馈送。

有人能想出一个不同的方法来使摄像机的光线变暗吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-12-06 21:01:34

您的选项B不起作用有两个原因:

  1. 场景视图是不透明的,所以在它的背后没有什么可以混合的部分透明的背景颜色。
  2. sceneView.scene.background是真正显示相机图像的东西,所以如果你把它设置成一种颜色,你就根本不显示相机图像了。

其他一些选项(大部分是未经测试的)您可能会研究:

  • 如您所链接的答案所引用的,请使用SCNTechnique设置多通呈现。在第一遍,使用excludeCategoryMask (和您的场景内容)设置为只渲染背景,使用阴影(或模糊或其他)所有像素的着色器渲染整个场景。在第二次传递时,只呈现您想要显示的节点,而不使用该着色器(使用简单的传递式着色器)。
  • 保留您的选项B,但使场景视图不透明。将视图的backgroundColor (而不是场景的background)设置为纯色,并设置场景的transparency background以淡出针对该颜色的摄像机馈送。
  • 使用几何为您的场景创建一个“物理”背景--例如,一个大尺寸的SCNPlane,作为相机的一个子级放置在一定的距离上,比任何其他场景内容都要远得多。设置飞机的背景颜色和透明度。
  • 使用多个视图-- ARSCNView,非透明的,有清晰的背景,和另一个(不一定是SceneKit视图),只显示相机馈送。混乱的另一个视图(或其他有趣的东西,如UIVisualEffectView),以模糊的相机饲料。
  • 向Apple提交一个bug关于sceneView.background没有获得节点和材料(过滤器、着色器修饰符、完全着色程序)获得的全套阴影定制选项,没有这些选项,定制背景要比定制场景的其他方面困难得多。
票数 5
EN

Stack Overflow用户

发布于 2020-04-17 08:42:44

我通过创建一个具有SCNNode几何结构的SCNSphere并使用ARSCNView.pointOfView将其连接到相机上实现了这一效果。

代码语言:javascript
运行
复制
override func viewDidLoad() {
    super.viewDidLoad()

    let sphereFogNode = makeSphereNode()
    arView.pointOfView!.addChildNode(sphereFogNode)

    view.addSubview(arView)
}

private static func makeSphereGeom() -> SCNSphere {
    let sphere = SCNSphere(radius: 5)
    let material = SCNMaterial()

    material.diffuse.contents = UIColor(white: 1.0, alpha: 0.7)
    material.isDoubleSided = true

    sphere.materials = [material]
    return sphere
}

private static func makeSphereNode() -> SCNNode {
    SCNNode(geometry: makeSphereGeom())
}

外球裁剪

这会使摄像机和球体之外的任何东西变暗。命中测试(ARFrame.hitTest)不尊重球面边界。你可以从球体外接收结果。

在你球体之外的事物将通过球体的不透明度被看到。似乎不透明的东西会在球体外变成透明的。

白色部分是球体内的平面,灰色部分是球体外的平面。这架飞机是纯白的,不透明的.我试着使用SCNScene.fog*将SceneKit图形剪辑到球体之外,但是看起来fog并没有屏蔽呈现的内容,只是影响了它的外观。SCNCamera.zFar也不工作,因为它的剪辑是基于Z距离,而不是在相机和目标之间的直线距离。

只要让你的球体足够大,一切都会看上去很好。

票数 1
EN

Stack Overflow用户

发布于 2019-09-19 13:03:01

对于那些想要实现rickster选项的人,请使用几何学为您的场景创建“物理”背景“,这是我的代码(.scnassets制作的平面和透明度)。

代码语言:javascript
运行
复制
    guard let backgroundPlane = sceneView.scene.rootNode.childNode(withName: "background", recursively: false) else { return }
    backgroundPlane.removeFromParentNode()
    backgroundPlane.position = SCNVector3Make(0, 0, -2)
    sceneView.pointOfView?.addChildNode(backgroundPlane)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47679441

复制
相关文章

相似问题

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