我目前正在做一个ARKit项目,在那里我想要使实际的相机馈送变暗,这样我的3D场景中的物体就更突出了。
到目前为止,我发现了2种解决方案:
A)手动将CIFilter应用于摄像机帧,并将其设置为SceneKit场景的背景图像,正如在这是如此的帖子中回答的那样,这里的问题是fps坦克非常明显。
B)设置如下背景颜色:
sceneView.scene.background.contents = UIColor(white: 0.0, alpha: 0.2)可悲的是,alpha <1的颜色仍然是不透明的,所以不管我设置了什么alpha,我都看不到相机的任何馈送。
有人能想出一个不同的方法来使摄像机的光线变暗吗?
发布于 2017-12-06 21:01:34
您的选项B不起作用有两个原因:
sceneView.scene.background是真正显示相机图像的东西,所以如果你把它设置成一种颜色,你就根本不显示相机图像了。其他一些选项(大部分是未经测试的)您可能会研究:
SCNTechnique设置多通呈现。在第一遍,使用excludeCategoryMask (和您的场景内容)设置为只渲染背景,使用阴影(或模糊或其他)所有像素的着色器渲染整个场景。在第二次传递时,只呈现您想要显示的节点,而不使用该着色器(使用简单的传递式着色器)。backgroundColor (而不是场景的background)设置为纯色,并设置场景的transparency background以淡出针对该颜色的摄像机馈送。SCNPlane,作为相机的一个子级放置在一定的距离上,比任何其他场景内容都要远得多。设置飞机的背景颜色和透明度。ARSCNView,非透明的,有清晰的背景,和另一个(不一定是SceneKit视图),只显示相机馈送。混乱的另一个视图(或其他有趣的东西,如UIVisualEffectView),以模糊的相机饲料。sceneView.background没有获得节点和材料(过滤器、着色器修饰符、完全着色程序)获得的全套阴影定制选项,没有这些选项,定制背景要比定制场景的其他方面困难得多。发布于 2020-04-17 08:42:44
我通过创建一个具有SCNNode几何结构的SCNSphere并使用ARSCNView.pointOfView将其连接到相机上实现了这一效果。

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距离,而不是在相机和目标之间的直线距离。
只要让你的球体足够大,一切都会看上去很好。
发布于 2019-09-19 13:03:01
对于那些想要实现rickster选项的人,请使用几何学为您的场景创建“物理”背景“,这是我的代码(.scnassets制作的平面和透明度)。
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)https://stackoverflow.com/questions/47679441
复制相似问题