USDZ 模型在 SceneKit 中有孔,但在 QuickLook 中没有
Posted
技术标签:
【中文标题】USDZ 模型在 SceneKit 中有孔,但在 QuickLook 中没有【英文标题】:USDZ models have holes in SceneKit but not QuickLook 【发布时间】:2019-11-01 14:42:36 【问题描述】:一些 NASA .usdz 球形模型在 ios SceneKit 应用程序中显示时,会在渲染纹理中显示“洞”,显然在模型的顶点处。
模型在 QuickLook(iOS 12.3.1 和 MacOS 10.14.6 Beta 上)中正确显示,没有漏洞,我相信它也在使用 SceneKit。
但是,Xcode(10.2.1 和 11.0 Beta 2)与 iOS 应用程序一样,在编辑 .usdz 文件以及导出的 .scn 文件时会显示漏洞。
是否有一些 SceneKit 选项可以解决这个问题?换句话说,QuickLook 在“修复”这个问题上有什么魔力?
这是来自 NASA 的火星模型示例:https://solarsystem.nasa.gov/resources/2372/mars-3d-model/
这是在 MacOS 上通过 QuickLook 截取的火星模型截图:
以下是在 Xcode 中查看的带有孔的火星模型的屏幕截图,在 iOS 上的 SceneKit 应用中看起来相同:
【问题讨论】:
【参考方案1】:这可能发生在使用细分曲面但在导入模型时未指定 SCNSceneSourceLoadingOptionPreserveOriginalTopology
时。确保在加载场景时将此选项设置为 YES
。
这也可能是出口商的问题。如果模型已经足够详细,则可能不需要细分曲面。如果 USDZ 文件中未指定任何内容,则 Catmull-Clark 细分为 default setting,但一些出口商并未明确指定 none
。
【讨论】:
在每个加载节点的几何上将 subdivisionLevel 设置为零似乎可以解决问题。非常感谢!对所有用户加载的模型执行此操作似乎“合理”(即,您认为 QuickLook 是否这样做)? 取决于型号。如果你知道你的数据,你就知道你是否想要细分。如果模型来自未知来源,则您无法确定默认行为是有意的还是导出器中是否存在错误。快速查看使用SCNSceneSourceLoadingOptionPreserveOriginalTopology
。
我尝试了以下方法,但如果没有在节点中专门将 subdivisionLevel 设置为零,它似乎无法解决问题:` let options = [SCNSceneSource.LoadingOption.preserveOriginalTopology: true] if let url = url, let modelSource = SCNSceneSource(url: url, options: options) do let node = try modelSource.scene(options: options).rootNode`
模型可能有重复的相邻面的顶点。在这种情况下,细分将导致间隙,您无法对此做任何事情,只能修复模型。也就是说,如果您的模型不打算细分,只需将 subdivisionLevel
设置为 0 或修复 USDZ 文件,以便指定细分方案应为 none
。以上是关于USDZ 模型在 SceneKit 中有孔,但在 QuickLook 中没有的主要内容,如果未能解决你的问题,请参考以下文章