ios SceneKit:如何为相同的OBJ文件重新创建Google Poly的照明?

y0u0uwnf  于 2023-04-22  发布在  iOS
关注(0)|答案(3)|浏览(166)

目标是重新创建此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)
8i9zcol2

8i9zcol21#

通过模型I/O加载的OBJ文件默认使用基于物理的照明。这个模型有一个卡通的外观,使用了大量的环境光和一些反射高光。
您应该首先将所有材质转换为lambert照明模型。
然后添加一个ambient光到你的场景中。在这个场景中有很多环境光,物体的每个部分都被照亮。一个75%白色的color就可以了。
最后,在相机上加上一盏directional的灯,以突出显示用户面对的多边形。

qeeaahzv

qeeaahzv2#

除了MNuages回答,尝试启用屏幕空间环境光遮挡(在相机上).下面启用它为当前相机:

scnView.pointOfView.camera.screenSpaceAmbientOcclusionIntensity = 1.7;
scnView.pointOfView.camera.screenSpaceAmbientOcclusionNormalThreshold = 0.1;
scnView.pointOfView.camera.screenSpaceAmbientOcclusionDepthThreshold = 0.08;
scnView.pointOfView.camera.screenSpaceAmbientOcclusionBias = 0.33;
scnView.pointOfView.camera.screenSpaceAmbientOcclusionRadius = 3.0;

你可能需要调整一些值来获得你想要的结果,上面的就是我在某个场景中的工作。

wvmv3b1j

wvmv3b1j3#

.obj文件及其.mtl文件(材质)似乎仅支持基于物理的着色。
若要使用高级着色,如Phong、Lambert或Blinn,您需要使用.dae模型(Collada)。
您可以使用Blender将.obj模型导出为.dae,并取得不同程度的成功:
https://www.blender.org
否则,如果你要使用.obj和.mtl,你必须满足于基于物理的着色。

相关问题