Вращающееся освещение среды контента ARKit и SceneKit

Я родом из мира Единства. В Unity мы можем легко вращать фоновый скайбокс для image based lighting, Я вижу, что в Swift мы можем применить скайбокс, набрав:

// Create a new scene
let scene = SCNScene()
var IBLImage = UIImage()
scene.lightingEnvironment.contents = IBLImage

Но я хочу, чтобы он мог вращаться, чтобы он мог соответствовать реальной среде. Пока что не повезло с кодом с точки зрения вращающегося освещения.

Любая помощь будет высоко оценена.

2 ответа

Спасибо за ответ, на основе вашего объяснения я создал функцию следующим образом

func makeRotationAroundY(angle: Float) -> simd_float4x4 {
 let rows = [
        simd_float4( cos(angle), Float(0.0), -sin(angle), Float(0.0)),
        simd_float4( Float(0.0), Float(1.0), Float(0.0), Float(0.0)),
        simd_float4( sin(angle), Float(0.0), cos(angle), Float(0.0)),
        simd_float4( Float(0.0), Float(0.0), Float(0.0), Float(1.0))
    ]
 return float4x4(rows: rows)
 }

и называется

scene.lightingEnvironment.contentsTransform = SCNMatrix4(makeRotationAroundY(angle: GLKMathDegreesToRadians(180)))

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

Вам следует использовать свойство экземпляра contentsTransform - преобразование, которое можно применить к визуальному содержимому свойства материала:

var contentsTransform: SCNMatrix4 { get set }

или же

scene.lightingEnvironment.contentsTransform

SceneKit применяет это преобразование к координатам текстуры, предоставленным геометрическим объектом, к которому прикреплен материал, а затем использует полученные координаты, чтобы отобразить содержимое свойства материала по всей поверхности материала.

О представлении Матрицы 4х4 читайте здесь.

Кроме того, прочитайте мой ответ о комбинации сдвига и масштаба (вращение) здесь.

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