目标是重新创建此OBJ文件的照明:https://poly.google.com/view/cKryD9VnDEZ
将OBJ文件加载到SceneKit的代码(可以从上面的链接下载文件):
let modelPath = "model.obj"
let url = NSURL(string: modelPath)
let scene = SCNScene(named: modelPath)!
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
sceneView.scene = scene
sceneView.backgroundColor = UIColor.white
迄今为止尝试的选项:
1)默认的环境光线比Google Poly的光线要苛刻得多。移除环境光线会使一切都变得过于平坦。
2)使用四个平行光:一个在前面,一个在后面,一个在下面,一个在模型上面。所有的灯都成Angular 指向模型。这是最好的,但仍然留下了一些阴影和更严厉的地区没有看到谷歌聚合物。
3)在选项#2中增加了两个灯,这次是在左边和右边增加了灯。这一个比选项#2更糟糕,因为额外的灯与四个现有的灯结合在一起,并粉饰了模型。
根据以下建议进行更新:
代码现在实现了环境光和平行光。
由于某种原因,将平行光添加到摄影机节点与场景根节点没有任何区别。
灯光代码在下面。
有两个问题:
1)在截图1中,胸部的右侧太亮,没有显示任何边缘。胸部最左边的脸太暗。具有最佳照明的脸在中心。如何使所有脸的照明都像这样(或更好地匹配Google Poly照明)?
2)在屏幕截图2中,定向光似乎没有效果。如何确保模型的背面与正面一样轻,建议使用一个环境光和一个定向光的架构?
截图1:
截图二:
验证码:
// Create ambient light
let ambientLightNode = SCNNode()
ambientLightNode.light = SCNLight()
ambientLightNode.light!.type = .ambient
ambientLightNode.light!.color = UIColor(white: 0.50, alpha: 1.0)
// Add ambient light to scene
scene.rootNode.addChildNode(ambientLightNode)
// Create directional light
let directionalLight = SCNNode()
directionalLight.light = SCNLight()
directionalLight.light!.type = .directional
directionalLight.light!.color = UIColor(white: 0.40, alpha: 1.0)
directionalLight.eulerAngles = SCNVector3(x: Float.pi, y: 0, z: 0)
// Add directional light
scene.rootNode.addChildNode(directionalLight)
3条答案
按热度按时间8i9zcol21#
通过模型I/O加载的OBJ文件默认使用基于物理的照明。这个模型有一个卡通的外观,使用了大量的环境光和一些反射高光。
您应该首先将所有材质转换为
lambert
照明模型。然后添加一个
ambient
光到你的场景中。在这个场景中有很多环境光,物体的每个部分都被照亮。一个75%白色的color
就可以了。最后,在相机上加上一盏
directional
的灯,以突出显示用户面对的多边形。qeeaahzv2#
除了MNuages回答,尝试启用屏幕空间环境光遮挡(在相机上).下面启用它为当前相机:
你可能需要调整一些值来获得你想要的结果,上面的就是我在某个场景中的工作。
wvmv3b1j3#
.obj文件及其.mtl文件(材质)似乎仅支持基于物理的着色。
若要使用高级着色,如Phong、Lambert或Blinn,您需要使用.dae模型(Collada)。
您可以使用Blender将.obj模型导出为.dae,并取得不同程度的成功:
https://www.blender.org
否则,如果你要使用.obj和.mtl,你必须满足于基于物理的着色。