我有一个.obj文件,包含一个3D模型,分为多个较小的网格,例如一个前面和一个背面。
我的目标是将该文件加载到SceneKit视图中,并与模型的不同部分进行交互,对它们进行着色、选择、隐藏或单独移动它们。
我能够将文件加载到一个包含MDLAsset的MDLMesh中,它本身包含作为MDLSubmesh的所有子网格。
要显示加载的模型,我必须将MDLMesh转换为SCNGeometry。
基本方法是调用SCNGeometry geometryWithMDLMesh:(MDLMesh *)mdlMesh。这很好,SCNGeometry包含不同的SCNGeometryElements。
然而,MDLSubmesh中的许多信息在将其转换为场景工具包几何时丢失了,而我与不同子网格交互的能力非常有限。
如果我将所有的MDLSubmesh分别转换为SCNGeometry,这将是非常理想的。我尝试过两种不同的方法:
[MDLMes newSubdividedMesh: aMesh submeshIndex: i subdivisionLevels:0]。然后我用它们创建了SCNGeometry。
问题是,SceneKit并没有将场景呈现为有立足之地。几何学是可行的,但光线并没有应用到模型中,这是在我转换整个MDLMesh时起作用的东西。从每个子网格生成一个新的网格:
for (NSInteger i = 0; i < [[mesh submeshes] count]; i++) {
MDLMesh *submesh = [MDLMesh newSubdividedMesh:mesh submeshIndex:i subdivisionLevels:0];
SCNGeometry *geometry = [SCNGeometry geometryWithMDLMesh:submesh];
SCNNode *subNode = [SCNNode nodeWithGeometry:geometry];
[node addChildNode:subNode];
}使用这种方法进行用细分网格绘制和转换整个MDLMesh绘制整个网格的结果呈现。注意上面的代码在第一次呈现时缺少的光线效果。
SCNGeometry方法生成SCNGeometry geometryWithSources:elements:。虽然我怀疑这是一种“正确”的方式来做这件事,但下面是我尝试过的。- (SCNNode\*) loadMDLMesh : (MDLMesh\*) mesh withSubmeshes: (bool) sub { if (sub) { //Generate a scene kit node SCNNode \* node = [SCNNode node];//从每个子网格生成一个新的网格,用于(NSInteger i= 0;i<[网格子网格计数];i++) {//从mdl子网格SCNGeometryElement *元素创建几何元素:[SCNGeometryElement geometryElementWithMDLSubmesh:[网格子网格对象a:i]];//从索引缓冲区MDLMeshBufferMap *map =[ [mesh子网格objectAtIndex:i] indexBuffer]映射创建几何源;SCNGeometrySource *source = [SCNGeometrySource几何网格对象属性索引:i]indexCount];//从源元素和元素SCNGeometry *subMesh = [SCNGeometry *subMesh:NSArray arrayWithObject:源元素:NSArray arrayWithObject: element ]创建SCNGeometry *subMesh;//更新名称subMesh.name =[[网格子网对象and :i] name];//创建子节点并将其添加到对象节点SCNNode *subNode = SCNNode nodeWithGe测:subMesh;节点addChildNode: subnode;}返回节点;}subMesh.name}{返回SCNNode nodeWithMDLObject:网格;}}
不幸的是,应用程序崩溃与一个坏的访问异常。
正如人们所看到的,我在开发目标-c方面没有那么丰富的经验.任何帮助修复我的想法或不同的方法细分的网格将是伟大的。
谢谢。
发布于 2016-01-20 13:13:53
重新张贴评论作为回答,因为它似乎提供了一个可行的解决方案。
当使用+newSubdividedMesh:submeshIndex:subdivisionLevels:从子网格构建一个新的网格时,我看上去您缺少法线。也许-initWithVertexBuffer:vertexCount:descriptor:submeshes:会带来更好的结果?
https://stackoverflow.com/questions/34897721
复制相似问题