SceneKit - Добавление изображения как карты нормалей - PullRequest
0 голосов
/ 10 октября 2018

Пока мне удалось загрузить файл Collada (dae) и показать его на экране.Теперь я пытаюсь программно разместить изображение в свойстве Normal, чтобы передняя текстура получала другой эффект.

В соответствии с инспектором файлов, параметр Normal находится в разделе Materials -> Normal.

Screenshow

Я пытался изменить содержание «Карты нормалей» в материале, но безуспешно.Это мой код, который не работал.

/// 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)
    }

Я также пытался создать новый узел с материалом и изображением карты нормалей внутри себя и добавить его к лицевой текстуре, но опять-таки у меня ничего не получилось.Кто-нибудь может подсказать мне, как добавить карту нормалей в текстуру?я что-то упустил?

1 Ответ

0 голосов
/ 11 октября 2018

Просмотр вашего кода:

/// 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: Если у вас есть файл fabric.jpg в Assets.xcassets, тогда используйте 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
}
...