В моем недавнем сообщении в блоге « Управление системами диффузии реагирования металла с помощью камеры iPad» было продемонстрировано использование процедурной текстуры шумов Model I / O на сцене Metal. В этом посте рассматривается использование MDLSkyCubeTexture модели ввода- вывода в проекте SceneKit.
MDLSkyCubeTexture процедурно генерирует физически реалистичное моделирование солнечного неба. Он идеально подходит для использования в качестве фона или карты отражений и, что интересно, его можно использовать вместе со световым зондом Model I / O для создания карт освещенности для освещения трехмерной геометрии на основе текстур.
В качестве введения в основы использования MDLSkyCubeTexture я создал простое демонстрационное приложение на основе SceneKit, которое содержит вращающийся тор, использующий текстуру небесного куба в качестве карты отражения. Я также применил ту же текстуру, что и фон сцены.
Создать текстуру небесного куба (которая имеет тип MDLTexture) довольно просто. Его инициализатор требует некоторых основных свойств:
- Мутность: мера пыли и влажности в атмосфере. Значение ноль имитирует чистое небо, а значение 1 вызывает распространение цвета солнца.
- Высота Солнца: значение 0,5 устанавливает уровень Солнца на горизонте, 1 — Солнце прямо над головой, а 0 — прямо под ним.
- Рассеяние в верхней атмосфере: значение 0 дает теплые цвета заката, а значение 1 имитирует цвета полудня.
- Наземный альбедо: количество света, которое отражается от земли. Значение 0 дает чистое небо, а значение 1 имитирует слабый туман.
Код для создания экземпляра текстуры куба выглядит следующим образом:
let sky = MDLSkyCubeTexture(name: nil,
channelEncoding: MDLTextureChannelEncoding.UInt8,
textureDimensions: [Int32(160), Int32(160)],
turbidity: 0,
sunElevation: 0,
upperAtmosphereScattering: 0,
groundAlbedo: 0)
С помощью UIStackView я выложил свой экран с основным представлением SceneKit и четырьмя ползунками для управления этими свойствами. Когда любой из ползунков изменяется, вызывается sliderChangeHandler () для обновления текстуры небесного куба.
Это довольно тяжелая операция, поэтому я делаю это в фоновом режиме, чтобы пользовательский интерфейс был отзывчивым. Но в двух словах, я установил четыре свойства, которые обсуждались выше, от их соответствующих ползунков:
self.sky.turbidity = self.turbiditySlider.value
self.sky.upperAtmosphereScattering = self.upperAtmosphereScatteringSlider.value
self.sky.sunElevation = self.sunElevationSlider.value
self.sky.groundAlbedo = self.groundAlbedoSlider.value
Затем явно обновите текстуру:
self.sky.updateTexture()
Из обновленной текстуры я могу получить ссылку на неуправляемый объект на CGImage небесного куба и назначить его для отражающего свойства материала тора и для свойства background моей сцены:
self.material.reflective.contents = self.sky.imageFromTexture()?.takeUnretainedValue()
self.sceneKitScene.background.contents = self.sky.imageFromTexture()?.takeUnretainedValue()
… и это все, что нужно сделать! Этот код был написан под Xcode 7 beta 3 и протестирован на iPad Air 2 под iOS 9 beta 3. Исходный код проекта доступен в моем репозитории GitHub здесь . Наслаждайтесь!