【问题标题】:Rotating lighting environment content ARKit and SceneKit旋转光照环境内容 ARKit 和 SceneKit
【发布时间】:2019-04-25 11:58:46
【问题描述】:

我来自 Unity 世界。在 Unity 中,我们可以轻松旋转 image based lighting 的背景天空盒。我看到在 Swift 中我们可以通过键入以下内容来应用天空盒:

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

但我希望它能够旋转,以便与真实环境相匹配。到目前为止,在旋转照明环境内容方面的代码还没有运气。

任何帮助将不胜感激。

【问题讨论】:

    标签: swift scenekit augmented-reality arkit light


    【解决方案1】:

    您应该使用 contentsTransform 实例属性 - 可以应用于材质属性的视觉内容的转换:

    var contentsTransform: SCNMatrix4 { get set }
    

    scene.lightingEnvironment.contentsTransform
    

    SceneKit 将此转换应用于材质所附加到的几何对象提供的纹理坐标,然后使用生成的坐标将材质属性的内容映射到材质表面。

    关于读取 here 的 4x4 矩阵的表示。

    另外,请阅读我关于剪切和比例组合(旋转)here 的回答。

    【讨论】:

    • 我注意到相同的结果,似乎 contentTransforms 对lightingEnvironment 没有影响。
    【解决方案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)))
    

    但是,例如,当我在 sphere 节点上看到内容时,似乎没有任何变化。我把任何角度放在那里似乎都反映没有任何变化。

    【讨论】:

      猜你喜欢
      • 2018-12-25
      • 2019-03-17
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多