4

目标是为此 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 中,定向光似乎没有效果。您如何确保模型的背面与正面一样轻,并采用建议的一种环境光和一种定向光的架构?

屏幕截图 1: 在此处输入图像描述

屏幕截图 2: 在此处输入图像描述

代码:

    // 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)
4

2 回答 2

5

默认情况下,通过模型 I/O 加载的 OBJ 文件使用基于物理的光照。该模型具有卡通外观,并使用大量环境照明和一些镜面高光。

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

ambient然后为您的场景添加灯光。这个场景中有很多环境照明,物体的每个部分都被照亮。一个color75% 的白色就可以了。

最后directional在相机上加一盏灯以突出显示面向用户的多边形。color50% 白色的 A听起来差不多。

于 2018-02-15T10:53:08.283 回答
1

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

您可能需要稍微调整这些值以获得您想要的结果,以上只是在某个场景中对我有用的方法。

于 2018-02-21T01:34:59.987 回答