如何在场景套件中显示金属质感

Posted

技术标签:

【中文标题】如何在场景套件中显示金属质感【英文标题】:How to show metallic texture in scene kit 【发布时间】:2020-09-05 03:21:37 【问题描述】:

我是sceneKit中的超级菜鸟,我对SceneKit中(金属纹理)的外观有疑问,我使用此代码来显示它。

 let glassesFrame = contentNode!.childNode(withName: "Metallic_Part",
                                                            recursively: true)

        glassesFrame?.geometry?.firstMaterial?.lightingModel = .physicallyBased
         glassesFrame?.geometry?.firstMaterial?.metalness.contents = 0.8
         glassesFrame?.geometry?.firstMaterial?.roughness.contents = 0.2

但问题是 (metalness, roughness) 的值会影响颜色的变暗(越大金属的值,越暗 颜色)。

这里是一个更清楚的例子:

金属度:0.2 粗糙度:0.8:here is the result

金属度:0.8 粗糙度:0.2:here is the result

当我将“1”设置为金属度值时,颜色变为黑色,here is the result

这是我使用的模型:Sketchfab 中的模型:https://skfb.ly/6QVTQ

我怎样才能使金属看起来自然(像镜子一样)。 这是完整的代码:

class BlendShapeCharacter: NSObject, VirtualContentController 

    var contentNode: SCNNode?

    private var originalJawY: Float = 0

    private lazy var jawNode = contentNode!


    private lazy var jawHeight: Float = 
        let (min, max) = jawNode.boundingBox
        return max.y - min.y
    ()

    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? 
        guard anchor is ARFaceAnchor else  return nil 

        contentNode = SCNReferenceNode(named: "Glasses")
        let glassesFrame = contentNode!.childNode(withName: "Metallic_Part",
                                                            recursively: true)

        glassesFrame?.geometry?.firstMaterial?.lightingModel = .physicallyBased
         glassesFrame?.geometry?.firstMaterial?.metalness.contents = 0.8
         glassesFrame?.geometry?.firstMaterial?.roughness.contents = 0.2


        let lens1 = contentNode!.childNode(withName: "Glass_Part",
                                                     recursively: true)

        let material = SCNMaterial()
        material.lightingModel = .phong
        material.diffuse.contents = UIColor(white: 0.2,
                                            alpha: 1)
        material.diffuse.intensity = 0.9
        material.specular.contents = UIColor(white: 1,
                                             alpha: 1)
        material.specular.intensity = 1.0
        material.reflective.contents = UIImage(named:"Models.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.4
        material.cullMode = .back

        lens1?.geometry?.firstMaterial = material

        originalJawY = jawNode.position.y
        return contentNode
    

提前谢谢你

【问题讨论】:

【参考方案1】:

environmentTexturing 的值是否设置为AREnvironmentTexturingManualAREnvironmentTexturingAutomatic

在 3D 资产渲染中,环境纹理是 基于图像的照明算法,其中表面可以逼真 反射周围环境的光线。 ARKit 可以生成环境 在 AR 会话期间使用相机图像的纹理,允许 SceneKit 或自定义渲染引擎以提供逼真的基于图像的照明 用于您的 AR 体验中的虚拟对象。

【讨论】:

实际上我的代码中根本没有“environmentTexturing”。你能告诉我应该如何以及在哪里将它添加到我的代码中【参考方案2】:

尝试设置场景lightingEnvironment 属性。如果您希望反射看起来像周围区域,您还可以使用图像作为场景背景内容以提供更多真实感。 Great example found here.

let backgroundImage = UIImage(named: "ImageName")
scene.background.contents = backgroundImage

let environmentImage = UIImage(named: "ImageName")
scene.lightingEnvironment.contents = environmentImage
scene.lightingEnvironment.intensity = 2

【讨论】:

以上是关于如何在场景套件中显示金属质感的主要内容,如果未能解决你的问题,请参考以下文章

快过年了,用MATLAB轻松写出年味满满的金属质感艺术字

PS 金属质感文字制作

如何在 SceneKit 中显示金属和透明纹理?

如何在 Cucumber 测试套件中订购功能文件?

如何让我的精灵套件场景出现在 UIView 上方?

在场景包中的透明地板/平面上显示阴影