Экспорт USDZ из SceneKit приводит к скучным моделям - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь использовать новую возможность iOS13 для экспорта файла usdz из SCNScene с помощью функции func write(to url: URL, options: [String : Any]? = nil, delegate: SCNSceneExportDelegate?, progressHandler: SCNSceneExportProgressHandler? = nil) -> Bool 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 Ответ

1 голос
/ 27 апреля 2020

Модель освещения по умолчанию - SCNLightingModelBlinn, что означает, что материал, используемый для геометрии plane, не имеет физической основы. USDZ поддерживает только физически основанные материалы, и при экспорте SceneKit попытается построить PBR-материал из материала Blinn и выведет roughness от вашего имени.

Исправление состоит в установке lightingModelName в SCNLightingModelPhysicallyBased.

...