首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MDLMesh划分为多个SCNGeometry

将MDLMesh划分为多个SCNGeometry
EN

Stack Overflow用户
提问于 2016-01-20 10:39:56
回答 1查看 1.2K关注 0票数 2

我有一个.obj文件,包含一个3D模型,分为多个较小的网格,例如一个前面和一个背面。

我的目标是将该文件加载到SceneKit视图中,并与模型的不同部分进行交互,对它们进行着色、选择、隐藏或单独移动它们。

我能够将文件加载到一个包含MDLAssetMDLMesh中,它本身包含作为MDLSubmesh的所有子网格。

要显示加载的模型,我必须将MDLMesh转换为SCNGeometry

基本方法是调用SCNGeometry geometryWithMDLMesh:(MDLMesh *)mdlMesh。这很好,SCNGeometry包含不同的SCNGeometryElements

然而,MDLSubmesh中的许多信息在将其转换为场景工具包几何时丢失了,而我与不同子网格交互的能力非常有限。

如果我将所有的MDLSubmesh分别转换为SCNGeometry,这将是非常理想的。我尝试过两种不同的方法:

  1. 我尝试在每个子网格中使用[MDLMes newSubdividedMesh: aMesh submeshIndex: i subdivisionLevels:0]。然后我用它们创建了SCNGeometry。 问题是,SceneKit并没有将场景呈现为有立足之地。几何学是可行的,但光线并没有应用到模型中,这是在我转换整个MDLMesh时起作用的东西。

从每个子网格生成一个新的网格:

代码语言:javascript
复制
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绘制整个网格的结果呈现。注意上面的代码在第一次呈现时缺少的光线效果。

  1. 第二种方法是使用SCNGeometry方法生成SCNGeometry geometryWithSources:elements:。虽然我怀疑这是一种“正确”的方式来做这件事,但下面是我尝试过的。
代码语言:javascript
复制
- (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方面没有那么丰富的经验.任何帮助修复我的想法或不同的方法细分的网格将是伟大的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 13:13:53

重新张贴评论作为回答,因为它似乎提供了一个可行的解决方案。

当使用+newSubdividedMesh:submeshIndex:subdivisionLevels:从子网格构建一个新的网格时,我看上去您缺少法线。也许-initWithVertexBuffer:vertexCount:descriptor:submeshes:会带来更好的结果?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34897721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档