SceneKit:如何从Google Poly为同一个OBJ文件重新创建照明?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SceneKit:如何从Google Poly为同一个OBJ文件重新创建照明?相关的知识,希望对你有一定的参考价值。

目标是为此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)使用四个方向灯:一个在前面,一个在后面,一个在下面,一个在模型上方。所有灯都倾斜指向模型。这是最好的,但仍留下一些阴影和更难以在Google Polymer上看到的区域。

3)在选项#2中再添加两个灯,这次向左右添加灯光。这个比选项#2更糟糕,因为额外的灯光与现有的四个灯光相结合,并且粉刷了模型。

建议后的更新:

该代码现在实现了环境光和定向光。

将方向光添加到摄像机节点,而不是场景根节点,由于某种原因没有区别。

灯光代码如下。

有两个问题:

1)在屏幕截图1中,胸部右侧太亮并且没有边缘。胸部最左侧的脸太暗了。最佳照明的脸部位于中心。如何让所有面部的照明都像这样(或者更好地匹配Google Poly照明)?

2)在屏幕截图2中,方向灯似乎没有效果。如何确保模型的背面与前面一样轻,具有一个环境光和一个方向光的建议架构?

SCREENSHOT 1:enter image description here

屏幕截图2:enter image description here

码:

    // 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)
答案

通过模型I / O加载的OBJ文件默认使用基于物理的照明。这个模型具有卡通外观,并使用了许多环境光和一些镜面高光。

您应该首先将所有材料转换为lambert照明模型。

然后为你的场景添加一个ambient灯。在这个场景中有很多环境光,物体的每个部分都被点亮。一个75%白色的color会做。

最后将directional灯连接到相机以突出面向用户的多边形。一个50%白色的color声音正确。

另一答案

除了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;

您可能需要稍微调整一下这些值以获得所需的结果,以上就是在某个场景中对我有用的东西。

以上是关于SceneKit:如何从Google Poly为同一个OBJ文件重新创建照明?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问从 Firebase 下载的 SceneKit 文件?

如何从 SceneKit 中的 .dae 文件访问文本元素?

如何从代码在 SceneKit 中设置基于物理的渲染?

如何使用 SceneKit 从 COLLADA (.dae) 文件中获取几何图形

如何创建要在 SceneKit 中使用的 DAE 文件?

如何从 SCNVector3 在 SceneKit 中生成凹面或凸面多边形平面