基于转换的重新计算SCNNODE几何形状



是否有一种方法可以通过重新计算其几何形状来巩固scnnode量表和方向?

基本上,我是从导出到DAE文件的Sketchup文件转换的SCN文件中加载一个scnnode。由于Arkit以米的量和不同的轴向工作起作用,因此我必须将加载的SCNNODE刻度(为0.0254)和Eulerangle(x -90deg)设置为正确显示。但是,这一切都很好,因此缩放和旋转使一条逻辑弄乱了一条逻辑,因为该逻辑也使用旋转,从而覆盖了上一个...(

>

我认为,如果我可以简单地告诉scnnode基于当前尺度(基本上是其转换矩阵)来重新计算其几何形状,这将是很棒的,这将导致带有变换矩阵的scnnode the Zero矩阵。..

如果"简单地"要告诉节点以永久扩展其顶点,则必须编写一个函数才能这样做,因为没有标准选项。

该函数应读取节点几何形状的顶点源到向量的数组中,然后使用glkmatrix4multiplyandProjectVector3将转换应用于每个矢量,然后将新的scngeemetry应用于每个verts。

GLKMatrix4 scalemat = GLKMatrix4MakeScale(aNode.scale.x, aNode.scale.y, aNode.scale.z);
for (HEVertex* vert in toBeTransformedVerts) {
     vert.pos = SCNVector3FromGLKVector3(GLKMatrix4MultiplyAndProjectVector3(scalemat, SCNVector3ToGLKVector3(vert.pos)) );
}
//reset node scale property.
aNode.scale = SCNVector3Make(1.0, 1.0, 1.0);

Severtex是我用于存储顶点的类,POS属性是SCNVector3。在您的情况下,您必须将scnnode几何的顶点读取到scnvector3数组中,然后循环通过这些数字。

转换每个顶点的位置后,您需要更新节点的几何形状。IE。这样的东西:

SCNGeometrySource *_vertexSource =
        [SCNGeometrySource geometrySourceWithVertices:_meshVertices count:_vertexCount];
aNode.geometry = [SCNGeometry geometryWithSources:@[_vertexSource, _aNode.geometry.geometrySources[1], _aNode.geometry.geometrySources[2]] elements:@[_aNode.geometry.geometryElements.firstObject]];

这只是一个粗略的示例,它仅更新顶点源,并重用正常和颜色的几何源和几何元素,而几何元素可以大大差异。

非常可行,但不像以适当大小重新出口模型那样简单。

如果节点没有任何子节点,则可以简单地将节点寄给空节点,在节点上执行所需的转换,然后在空的父节点上呼叫flatten。您的节点的中心和方向将与空的父节点相匹配。如果您的节点有一个子节点树,则需要递归进行此操作。

作为更复杂方法的替代方案,您可以通过简单的孩子节点轻松地完成此操作...

  1. 创建一个新节点
  2. 将几何(以及您想要的任何其他节点属性)从原始节点移动到新节点
  3. 将新节点添加为原始节点的孩子
  4. 将量表转换应用于子节点。

本质上,在步骤3之后,您应该在做任何事情之前恰好回到自己的位置,除了您现在有一个新的孩子节点可以将秤变换应用于,而将父节点单独使用,以便它可以使用身份矩阵(或其他任何您想要的矩阵。)

类似的方法是使用现有节点AS ...

  1. 创建一个新的父节点
  2. 将其添加到与您现有节点的同一父母
  3. 将您现有的节点从旧父行业移至这个新父母
  4. 将转换从现有的子节点复制到新的父节点
  5. 用比例转换替换子节点上的转换

在两者之间进行选择确实取决于您要移动的节点上有多少东西以及最初的变换。(即,如果扩展节点,它可能与模型相对于模型的原始位置不合适。)您选择基于该信息的上述哪项。

也就是说,如果仅仅是几何形状并将其缩放在现场工作,那就可以使用第一个。如果有很多节点属性,请随身携带。要点是,您正在添加一个专门将缩放量表应用于现有节点的新节点,无需直接的几何修改。

最新更新