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 направленный свет не оказывает никакого влияния. Как вы можете гарантировать, что задняя часть модели будет такой же легкой, как и передняя, ​​с предполагаемой архитектурой одного внешнего освещения и одного направленного света?

СКРИНШОТ 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)

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 с разной степенью успеха:

https://www.blender.org

В противном случае, если вы собираетесь использовать .obj и .mtl, вам придется согласиться на физическое затенение.

Другие вопросы по тегам