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 направленный свет не оказывает никакого влияния. Как вы можете гарантировать, что задняя часть модели будет такой же легкой, как и передняя, с предполагаемой архитектурой одного внешнего освещения и одного направленного света?
КОД:
// 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 ответа
Файлы OBJ, загруженные через модель ввода-вывода, по умолчанию используют физическое освещение. Эта модель имеет мультяшный вид и использует много внешнего освещения с несколькими зеркальными бликами.
Вы должны начать с конвертации всех ваших материалов в lambert
модель освещения.
Затем добавьте ambient
свет тебе сцена. В этой сцене много внешнего освещения, освещена каждая часть объекта. color
75% белых подойдут.
Наконец прикрепить directional
Осветите камеру, чтобы выделить многоугольники, стоящие перед пользователем. color
50% белого звучит о праве.
В дополнение к ответу 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;
Вам, вероятно, придется немного подправить значения, чтобы получить желаемый для вас результат. Вышеуказанное - это то, что мне подходит в определенной сцене.
Похоже, что файл .obj и его файл .mtl (материал) поддерживают только физическое затенение.
Чтобы использовать расширенное затенение, такое как Фонг, Ламберт или Блинн, вам необходимо использовать модель .dae (Collada).
Вы можете экспортировать модель .obj как .dae с помощью Blender с разной степенью успеха:
В противном случае, если вы собираетесь использовать .obj и .mtl, вам придется согласиться на физическое затенение.