我试图使用新的iOS13功能,从一个SCNScene导出usdz文件,使用 func write(to url: URL, options: [String : Any]? = nil, delegate: SCNSceneExportDelegate?, progressHandler: SCNSceneExportProgressHandler? = nil) -> Bool
的功能,如果我使用一个没有修改的内置.scn文件,它的工作效果很好,但是当我尝试插入我自己的纹理时,却遇到了各种问题。
如果我使用一个没有修改的baked in .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。有谁遇到过这种情况,并找到了解决的方法?
默认的照明模型是 SCNLightingModelBlinn
意思是说,用在 plane
几何体不是基于物理的。USDZ只支持基于物理的材质,在导出时,SceneKit会尝试从Blinn材质中建立一个PBR材质,并会推断出一个 roughness
代表您。
修正包括设置 lightingModelName
到 SCNLightingModelPhysicallyBased
.