我有一个几何节点,画了一个人体,对象的材料是透明的。
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)
我想得到的效果是让对象在面对摄像机的区域完全透明,但当多边形朝向侧面时变得更加不透明......这将产生一种闪亮的蓝色边缘,类似这样。
有什么办法可以创造这种效果吗?
有什么办法吗?
EDIT: 另一个有趣的问题:似乎SceneKit确实支持菲涅尔效果。该效果会影响反射图--这是应该的,然而,一旦你将透明度应用到你的对象上,它也会影响反射率(完全透明会使反射率也消失)--我相信这是苹果公司的一个概念性错误--一种材料可以是透明的,但仍然可以反射光线!我有一个几何节点,它是一个人体的图片。
我研究了一下,找到了答案。要达到这个效果,可以使用以下代码。
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.希望对大家有用。