在Blender中,您可以查看和访问3D模型的每个面,如下所示:https://poly.google.com/view/6mRHqTCZHxw
是否可以在SceneKit中做同样的事情,即访问模型的每个面?
This question is similar并暗示这是不可能的,但是并不能确认SceneKit是否允许您以编程方式访问模型的所有面。 (它专注于识别被触摸的脸。)
两个问题:
1)您可以以编程方式访问每个面孔吗?
2)是否可以过滤并仅访问可见的面孔(即,忽略“在”内部或被其他面孔遮挡的面孔)?
最佳答案
可以,但是SceneKit没有内置的便捷方法可以让您做到这一点,因此您必须自己构建。
注意,faceIndex返回渲染的三角形而不是四边形/多边形,因此您必须对其进行转换(如果所有四边形都可行)。
我正在开发基于SceneKit的应用程序,该应用程序基本上是适用于ipad专业人员的迷你Blender。它使用带有对象的半边数据结构来存储顶点,边和面。这允许访问那些元素,但实际上,它允许访问映射到模型的半边数据结构,这构成了替换渲染的几何的基础。
综上所述,人脸只是顶点和索引的集合,它们存储在SCNGeometrySources中。如果添加为什么要添加面以及要对其顶点进行哪些操作,则可能会更容易提供更好的答案。
编辑:根据您的评论“例如,如果他们轻拍脸部,脸部将变成蓝色。”
正如我上面提到的,一张脸只是顶点和索引的集合,一张脸本身没有颜色,只有顶点才可以有颜色。一个SCNNode具有一个SCNGeometry,该SCNGeometry具有几个SCNGeometrySources,这些https://developer.apple.com/documentation/scenekit/scngeometryprimitivetype/scngeometryprimitivetypepolygon包含有关顶点以及它们如何用于渲染面的信息。因此,您要做的是从faceIndex到SCNGeometrySource中相应的顶点索引。然后,您需要将后者读入向量数组,根据需要对其进行更新,然后根据您自己的向量数组创建SCNGeometrySource。
正如我提到的,faceIndex仅提供呈现的内容(不一定是您提供的内容)的索引(SCNGeometrySource),因此这需要将模型映射到数据结构。
如果您的模型将由所有三角形组成并且具有与共享相反的唯一顶点,并且不会交织顶点数据,则faceIndex 0将对应于顶点0、1和2,faceIndex 1将对应于顶点3、4和5在SCNGeometrySource中。对于四边形和其他多边形以及交织的顶点数据,情况将变得更加复杂。
简而言之,无法直接访问SceneKit中的面实体,但可以通过编程方式修改SCNGeometrySources(具有顶点位置,颜色,法线,uv坐标)。
编辑2:基于进一步的评论:
PrimitiveType告诉Scenekit模型是如何构造的,实际上并没有将其转换。因此,仍然需要对模型进行三角剖分。但是如果所有的三角形都存在,并且如果模型使用唯一的顶点(与相邻的面共享顶点,则模型io提供了将顶点从共享中拆分为唯一的函数),并且SCNGeometrySource中的所有顶点都已实际渲染(如果模型构建正确,通常是这种情况),然后是。可以对多边形执行相同的操作,请参见
ojit_a
仅当多边形5、3、4、3都是显然不是的三角形时,多边形5、3、4、3才对应于面索引0、1、2、3。但是,基于每个多边形的顶点数,您可以确定将为该多边形渲染多少个三角形。基于此,可以获得相应顶点的索引。
例如,第一个多边形对应于面索引0、1和2(采用3个三角形来创建具有5个顶点的多边形),第二个多边形是面索引3,第三个面是faceIndex 4和5。
在实践中,这意味着循环遍历元素中的多边形并添加一个faceCounter变量(每个顶点的增量为1,大于2的顶点),直到达到与faceIndex相同的值为止。尽管使用我自己的数据结构,但实际上我自己也进行了相同的基本转换,并且效果很好。
EDIT3:在实际步骤中:
将SCNGeometryElement转换为一个整数数组。
将具有颜色语义的SCNGeometrySource转换为向量数组。可能没有带有颜色语义的SCNGeometrySource,在这种情况下,您必须创建它。
如果使用了多边形图元,请遍历您从SCNGeometryElement创建的数组的第一部分(最大为图元数,在这种情况下为多边形),并保留一个计数器,对于每一个大于2的顶点,将其添加1。如果多边形具有3个顶点,则将计数器加1;如果多边形具有4个顶点,则将计数器加2。每次增加计数器时,因此对于每个多边形,请检查是否已达到faceIndex。一旦到达包含点击的面的多边形,就可以使用上图所示的映射从SCNGeometryElement的第二部分获取相应的顶点索引。如果添加第二个变量并在循环遍历每个多边形时将其与每个多边形的顶点数一起递增,则您已经知道存储在元素中的顶点索引的索引。
如果所有多边形都是四边形,则转换会更容易,并且面索引0和1对应于面0,面索引2和3对应于面1。
从SCNGeometryElement获得顶点索引后,就可以修改从中为SCNGeometrySource创建的数组中这些索引的顶点。然后重新创建并更新SCNGeometry的SCNGeometrySource。
最后但并非最不重要的一点是,除非您使用自定义着色器,否则通过SCNGeometrySource提供的顶点颜色仅在所分配的材质具有白色漫反射色时才能正确显示(因此,您也必须将基本纹理设置为白色)。