Как показать Metalli c и прозрачные текстуры в SceneKit? - PullRequest
1 голос
/ 09 апреля 2020

У меня проблемы с отображением некоторых текстур в SceneKit. Я хотел бы использовать эту модель:

Модель в Sketchfab: https://skfb.ly/6QVTQ

Модель должна появляются в этих цветах и ​​текстурах в среде AR, используя Scene Kit. Но золотые кончики кажутся черными, а прозрачные линзы не появляются вообще. Есть какие-нибудь предложения по решению этой проблемы?

Модель в формате .scn. Вот свойства материалов модели: https://drive.google.com/file/d/1HIHEsyONLXyL95dcSy9xWMGX89udMPND/view?usp=sharing

https://drive.google.com/file/d/1ndrZfcjqIQ4d2OfG6ZNvwyfDXnihJbnH/view?usp=sharing

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Заранее спасибо.

1 Ответ

0 голосов
/ 10 апреля 2020

В SceneKit нет фотореалистичного c стекла с истинным показателем преломления (IoR), но вы можете легко создать поддельное с помощью шейдера phong. Фонг шейдер также имеет три важных свойства стекла - зеркальность , отражательная способность и fresnelExponent .

Для металлов c материал использовать physicallyBased модель затенения.

Вот код:

import SceneKit

class ViewController: NSViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let sceneView = self.view as! SCNView
        sceneView.scene = SCNScene(named: "glasses.scn")!
        sceneView.allowsCameraControl = true
        sceneView.pointOfView?.position.z = 20

        let glassesFrame = sceneView.scene?.rootNode.childNode(withName: "glassesFrame", 
                                                            recursively: true)

        glassesFrame?.geometry?.firstMaterial?.lightingModel = .physicallyBased
        glassesFrame?.geometry?.firstMaterial?.metalness.intensity = 1
        glassesFrame?.geometry?.firstMaterial?.diffuse.contents = NSColor.systemBrown

        let lens1 = sceneView.scene?.rootNode.childNode(withName: "rightLens", 
                                                     recursively: true)

        let lens2 = sceneView.scene?.rootNode.childNode(withName: "leftLens", 
                                                     recursively: true)

        let material = SCNMaterial()
        material.lightingModel = .phong
        material.diffuse.contents = NSColor(white: 0.2,
                                            alpha: 1)
        material.diffuse.intensity = 0.9
        material.specular.contents = NSColor(white: 1,
                                             alpha: 1)
        material.specular.intensity = 1.0
        material.reflective.contents = NSImage.Name("art.scnassets/texture.png")
        material.reflective.intensity = 2.0
        material.transparencyMode = .dualLayer
        material.fresnelExponent = 2.2
        material.isDoubleSided = true
        material.blendMode = .alpha
        material.shininess = 100
        material.transparency.native = 0.7
        material.cullMode = .back

        lens1?.geometry?.firstMaterial = material
        lens2?.geometry?.firstMaterial = material
    }
}

enter image description here

enter image description here

...