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