我正在尝试使用 Model I/O 框架导入 .obj 文件以在 Scene Kit 中使用。我最初使用简单的 MDLAsset initWithURL: 函数,但是在将网格转移到 SCNGeometry 之后,我意识到这个函数正在对网格进行三角剖分,这样每个面都有 3 个唯一的顶点,并且在边界面的同一位置有单独的顶点。这导致我的其他函数出现一些重大问题,因此我尝试通过使用 MDLAsset initWithURL:vertexDescriptor:bufferAllocator:preserveTopology 函数来修复它,将 preserveTopology 设置为 YES,并将描述符/分配器设置为默认值,nil。这种保留拓扑解决了我复制顶点的问题,所以面/边都很好,但在这个过程中我丢失了法线数据。
失去法线,我不是指多重索引,我的意思是在将 preserveTopology 设置为 YES 之后,缓冲区根本不包含任何法线值。而之前它是 v1/n1/v2/n2... 并且步幅是 24 个字节(3 个维度 *4 个字节/浮点数 * 2 个属性),现在缓冲区的前半部分是 v1/v2/...步幅为 12,缓冲区的整个第二半只有 0.0 个浮点数。
这也有点奇怪,当你查看几何的 SCNGeometrySources 时,有 2 个源,1 个带有语义 kGeometrySourceSemanticVertex,1 个带有语义 kGeometrySourceSemanticNormal。您会认为语义顶点源将包含位置数据,而语义法线源将包含法线数据。然而事实并非如此。无论您设置什么 preserveTopology,它们都是大小的缓冲区,以包含具有相同值的位置数据和正常数据。所以当我之前说没有正常数据时,我的意思是这两个缓冲区,语义顶点和语义正常都从 v1/n1/v2/n2... 变为 v1/v2/.../(0.0, 0.0, 0.0)/(0.0, 0.0, 0.0)/... 我进入 mdlmesh 的缓冲区(在转移到场景套件之前)发现了同样的问题,所以问题一定是 initWithURL 的问题,
所以我认为默认的顶点描述符和缓冲区分配器一定有问题(因为我使用的是 nil)并开始尝试创建我自己的匹配这两种可能的数据格式。唉,经过多次尝试,我无法得到有效的东西。
关于我应该如何做到这一点的任何想法?如何为 MDLAsset 提供正确的 vertexDescriptor 和 bufferAllocator(我觉得这里 nil 应该没问题)以导入 .obj 文件?谢谢