Как включить затенение в складках 3D модели?

Я попытался установить черную тень в областях глубины продукта в ARKit сцена, но не успех. Я пытался с этим кодом:

node.geometry?.materials.first?.ambientOcclusion.contents = 0.5

Я приложил требуемое изображение результата и изображение текущего результата.

Текущий результат

h ttps:https://stackru.com/images/9408c7f2261e1cf527770fbb8e7a1663b7c247c0.jpg

ожидаемый результат

h ttps:https://stackru.com/images/524ce94b1d101c4c5a4a5f906dff2a2cd5fd0c72.jpg

1 ответ

Самым надежным и простым способом работы с самозатенением и Ambient Occlusion для 3D-моделей является создание подделки UV-mapped texture для этого (вместо рендеринга самозатенения в складках в реальном времени). Так что с поддельной текстурой AO на 3D-модели нагрузка на CPU/GPU минимальна, и ваша батарея также очень вам благодарна.

Для создания UV-карт Diffuse и Ambient Occlusion вам понадобится UV Texture Editor что вы можете найти в любом популярном приложении для создания 3D (например, Maya или 3dsMax). После рендеринга текстуры AO с UV-отображением (как четырехканальный PNG-файл с предварительно умноженным альфа-значением RGBxA) вы можете просто назначить его, используя этот код:

node.geometry?.materials.first?.ambientOcclusion.contents = UIImage(named: "AO.png")

Посмотрите на эти 2 uv-mapped текстуры, хранящиеся в 2 разных файлах png:

Вот ссылка на 5-минутное видео о том, как использовать uv-map текстуры в Maya.

Или, как еще более простое решение, вы можете нарисовать UV-mapped Diffuse texture в Photoshop-подобном приложении, используя полупрозрачную кисть черного цвета.

Затем назначьте теневую текстуру с помощью diffuse слот:

node.geometry?.materials.first?.diffuse.contents = UIImage(named: "diffuseWithShadows.png")

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