SceneKit:如何为同一个 OBJ 文件从 Google Poly 重新创建光照?
SceneKit: how to recreate lighting from Google Poly for same OBJ file?
目标是为这个 OBJ 文件重新创建光照:https://poly.google.com/view/cKryD9VnDEZ
将OBJ文件加载到SceneKit的代码(可以从上面下载文件link):
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)
通过模型 I/O 加载的 OBJ 文件默认使用基于物理的光照。该模型具有卡通风格的外观,并使用了大量带有一些镜面高光的环境照明。
您应该首先将所有材质转换为 lambert
光照模型。
然后添加 75% 的 ambient
light to you scene. There's a lot of ambient lighting in this scene, every part of the object is lit. A color
白色即可。
最后附上一张directional
light to the camera to highlight the polygons facing the user. A color
50% 白音差不多就对了
除了 MNuages 答案之外,尝试启用屏幕 space 环境遮挡(在相机上)。以下为当前相机启用它:
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;
您可能需要稍微调整一下值才能获得您想要的结果,以上只是在特定场景中对我有用的方法。
目标是为这个 OBJ 文件重新创建光照:https://poly.google.com/view/cKryD9VnDEZ
将OBJ文件加载到SceneKit的代码(可以从上面下载文件link):
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)
通过模型 I/O 加载的 OBJ 文件默认使用基于物理的光照。该模型具有卡通风格的外观,并使用了大量带有一些镜面高光的环境照明。
您应该首先将所有材质转换为 lambert
光照模型。
然后添加 75% 的 ambient
light to you scene. There's a lot of ambient lighting in this scene, every part of the object is lit. A color
白色即可。
最后附上一张directional
light to the camera to highlight the polygons facing the user. A color
50% 白音差不多就对了
除了 MNuages 答案之外,尝试启用屏幕 space 环境遮挡(在相机上)。以下为当前相机启用它:
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;
您可能需要稍微调整一下值才能获得您想要的结果,以上只是在特定场景中对我有用的方法。