从SceneKit导出的USDZ模型暗淡无光。

4

我想使用iOS13的新功能,利用SCNScene的func write(to url: URL, options: [String : Any]? = nil, delegate: SCNSceneExportDelegate?, progressHandler: SCNSceneExportProgressHandler? = nil) -> Bool函数将一个usdz文件从SCNScene导出。

如果使用没有修改过的内置.scn文件,它可以很好地工作,但是当我尝试插入自己的纹理时,就会遇到各种问题。

let scene = SCNScene(named: "scene.scnassets/original.scn")!
let node = scene.rootNode.childNode(withName: "Plane", recursively: true)
let plane = SCNPlane(width: 1, height: 1)
node?.geometry = plane
node?.geometry?.firstMaterial?.diffuse.contents = UIColor.black
node?.geometry?.firstMaterial?.roughness.contents = NSNumber(value: 0.0) //or UIColor.black doesn't work either

let documentsUrl = self.fileManager.urls(for: .documentDirectory, in: .userDomainMask)
guard !documentsUrl.isEmpty,
let url = documentsUrl.first else {
    completion(nil)
    return
}
let finalUrl = url.appendingPathComponent("result.usdz")
_ = scene.write(to: finalUrl, delegate: nil)

原始文件 original.scn 中仅包含一个光滑平面,我尝试在更改材质时再次将粗糙度设置为0。然而,生成的 usdz 文件总是将粗糙度设置为0.9。是否有其他人遇到过此问题并找到了解决方法?

1个回答

4
默认的光照模型是 SCNLightingModelBlinn,这意味着用于plane几何体的材质并非基于物理的。USDZ仅支持基于物理的材质,在导出时,SceneKit将尝试从Blinn材质构建PBR材质,并会为您推断出一个roughness
解决方法是将lightingModelName设置为SCNLightingModelPhysicallyBased

搞定了,谢谢!我只需要添加以下行: node.geometry?.firstMaterial?.lightingModel = .physicallyBased - geraldk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接