swift - SceneKit - 添加图像作为法线贴图

标签 swift scenekit collada

到目前为止,我能够下载 Collada 文件 (dae) 并将其显示在屏幕上。 现在我尝试以编程方式将图像放置在 Normal 属性中,因此前面的纹理将获得不同的效果。

根据文件检查器,正常选项位于 Material -> 正常。

Screenshow

我尝试通过 Material 更改“法线贴图”内容,但没有成功。 这是我的代码,不起作用。

/// Creating the Node
    let node = SCNNode()
    /// The dae file
    let scene = SCNScene(named: "bluebag.dae")
    let arryNode = scene?.rootNode.childNodes
    /// Override the assets
    for childNode in arryNode! {
        if let geo = childNode.geometry {
            for geoItem in geo.materials {
                geoItem.normal.contents = UIImage(named:"fabric.jpg") /// This is not working
            }
        }
        node.addChildNode(childNode)
    }

我还尝试创建一个新节点,其中包含 Material 和法线贴图图像,并将其添加到前面的纹理,但我再次没有成功。 有人可以告诉我如何将法线贴图添加到纹理吗?我错过了什么吗?

最佳答案

查看您的代码:

/// Creating the Node
let node = SCNNode()
/// The dae file
let scene = SCNScene(named: "bluebag.dae")
let arryNode = scene?.rootNode.childNodes                         // See Note 1
/// Override the assets
for childNode in arryNode! {
    if let geo = childNode.geometry {
        for geoItem in geo.materials {
            geoItem.normal.contents = UIImage(named:"fabric.jpg") // See Note 2
        }
    }
    node.addChildNode(childNode)
}

注1:您确定您的所有子节点都位于 rootNode 的第一级吗?

注释 2:如果 Assets.xcassets 中有 Fabric.jpg,则使用 UIImage(named:"fabric")

试试这个来遍历节点层次结构:

scene.rootNode.enumerateChildNodes { (node, stop) in
    if let geo = node.geometry {
        for material in geo.materials {
            material.normal.contents = UIImage(named: "fabric")
        }
    }
    scnView.scene?.rootNode.addChildNode(node) // or something like this
}

关于swift - SceneKit - 添加图像作为法线贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738340/

相关文章:

ios - 在 firestore 中存储字典值时存在逻辑问题

ios - SceneKit 几何图形看起来像是一场小故障灾难

opengl-es - Collada 与 OpenGL ES 的集成程度如何

android - Threejs - 导入 collada 模型在 Chrome Android 上看起来很有趣,纹理未正确加载

multithreading - 如何对这些同步方法进行有效的单元测试?

swift 3 : Inheritance from non-named type

swift - 将图例文本添加到饼图 Swift Charts

ios - SceneKit 在移动相机时遇到测试错误

swift - 检查 SCNNode 是否在 View 中重叠

cocoa - Scene Kit 的枢轴矩阵的语义是什么?