如何在场景套件中显示金属质感
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
的值是否设置为AREnvironmentTexturingManual
或AREnvironmentTexturingAutomatic
?
在 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
【讨论】:
以上是关于如何在场景套件中显示金属质感的主要内容,如果未能解决你的问题,请参考以下文章