首页 文章

iOS SceneKit - 将菲涅耳效果添加到材质透明度

提问于
浏览
4

我有一个可以拍摄人体的几何节点。物体的材料是透明

let node = newScene.rootNode.childNode(withName: "man_mesh", recursively: true)
let nodeMaterial = node?.geometry?.firstMaterial
nodeMaterial?.emission.contents = UIColor(red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
nodeMaterial?.transparencyMode = .rgbZero
nodeMaterial?.transparent.contents = UIColor(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

我想要获得的效果是物体在面向相机的区域中完全透明,但随着多边形面向侧面变得更加不透明......这会产生一种闪亮的蓝色边缘。这样的事情:

轮辋效应

知道如何创造这种效果吗?

谢谢

编辑:另一个有趣的观点:看来 SceneKit 确实支持菲涅尔效应。效果会影响反射贴图 - 但是,一旦对对象应用透明度,它也会影响反射率(完全透明度也会使反射率消失) - 我认为这是 Apple 的概念性错误 - 材料可以透明,仍然反射光!

1 回答

  • 1

    我做了一些研究并找到了答案。要实现此效果,您可以使用以下代码。

    func ghostEffect(scene: SCNScene) {
    
        let sphere = SCNSphere(radius: 3)
    
        let material = SCNMaterial()
        material.diffuse.contents = UIColor.black
        material.reflective.contents = UIColor(red: 0, green: 0.764, blue: 1, alpha: 1)
        material.reflective.intensity = 3
        material.transparent.contents = UIColor.black.withAlphaComponent(0.3)
        material.transparencyMode = .default
        material.fresnelExponent = 4
    
        sphere.materials = [material]
    
        let node = SCNNode(geometry: sphere)
    
        scene.rootNode.addChildNode(node)
    
    }
    

    解释自:SCNMaterial

    透明 - 确定材质中每个点的不透明度的对象

    反思 - 定义曲面上每个点的反射颜色的对象

    fresnselExponent - 影响材料反射率的因素

    该方法可以应用于任何 3D 对象。

    结果

    P.S。希望它会有用。

相关问题