Гладкая заливка в SceneKit - PullRequest
0 голосов
/ 17 января 2020

В настоящее время я работаю над приложением для iPadOS, которое использует SceneKit для рендеринга некоторых 3D-моделей. Ничего особенного, но я сталкиваюсь с большой трудностью, когда дело доходит до затенения этих моделей ...

В основном, что Я просто настраиваю сцену SceneKit (используя почти все настройки по умолчанию, у меня даже нет камеры) и создаю экземпляры 3D-объектов из некоторых моих файлов .obj, например, так.

let url =  <URL of my .obj file>
let asset = MDLAsset(url: url)
let object = asset.object(at: 0)
let node = SCNNode(mdlObject: object)
let texture = UIImage(data: try Data(contentsOf: <URL of the texture>))
let material = SCNMaterial()
material.diffuse.contents = texture
node.geometry!.materials = [material]
self.sceneView.scene!.rootNode.addChildNode(node)

Текстуры загружаются вручную, потому что, к сожалению, именно так клиент настроил файлы для меня. Код работает нормально, и я могу видеть меня sh и его текстуру, однако он также выглядит следующим образом

enter image description here

Как вы можете видеть затенение не совсем гладко ... и я понятия не имею, как это исправить.

Клиент мешает мне реализовать затенение Фонга, и, согласно документации Apple, именно так вы и делаете.

material.lightingModel = .phong

К сожалению, это все равно, как выглядит с включенным Phong. Я абсолютный новичок, когда дело доходит до 3D-рендеринга, так что это может быть смешно легко, но я клянусь, что не могу понять, как добиться более плавного затенения на этой модели.

Я пытался смотреть влево и вправо, и единственное, что привело к какому-либо заметному результату, - это использование subdivisionLevel для увеличения фактических граней в геометрии, но это плохо масштабируется, поскольку реальное приложение должно загружать тонну этих сеток, и оно быстро исчерпывает память, даже когда подразделение установить на 1

Наверняка должен быть способ сгладить эти тени без улучшения фактической геометрии?

Заранее спасибо!

1 Ответ

1 голос
/ 02 февраля 2020

Затенение требует правильных нормалей для вашей геометрии. Вы пытались использовать Model IO для их генерации?

https://developer.apple.com/documentation/modelio/mdlmesh/1391284-addnormals

...