iOS SceneKit - 为材质透明度添加菲涅尔效果。

问题描述 投票:5回答:1

我有一个几何节点,画了一个人体,对象的材料是透明的。

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)

我想得到的效果是让对象在面对摄像机的区域完全透明,但当多边形朝向侧面时变得更加不透明......这将产生一种闪亮的蓝色边缘,类似这样。

Rim Effect

有什么办法可以创造这种效果吗?

有什么办法吗?

EDIT: 另一个有趣的问题:似乎SceneKit确实支持菲涅尔效果。该效果会影响反射图--这是应该的,然而,一旦你将透明度应用到你的对象上,它也会影响反射率(完全透明会使反射率也消失)--我相信这是苹果公司的一个概念性错误--一种材料可以是透明的,但仍然可以反射光线!我有一个几何节点,它是一个人体的图片。

ios scenekit
1个回答
2
投票

我研究了一下,找到了答案。要达到这个效果,可以使用以下代码。

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对象。

Result

P.S.希望对大家有用。

© www.soinside.com 2019 - 2024. All rights reserved.