首页 文章

基于转换重新计算 SCNNode 几何

提问于
浏览
0

有没有办法通过重新计算几何图形来固化 SCNNode 比例和方向?

基本上我正在从 scn 文件中加载 SCNNode,该文件是从导出到 DAE 文件的 sketchup 文件转换而来的。因为 ARKit 以米为单位并且具有不同的轴方向,所以我必须设置加载的 SCNNode 的比例(到 0.0254)和 eulerangle(x -90deg)来正确显示它。这一切都很好但是因此缩放和旋转会使线下的某些逻辑混乱,因为这个逻辑也使用旋转从而覆盖了前一个...... :(

我认为如果我能简单地告诉 SCNNode 根据其当前的比例,方向...(基本上是它的转换矩阵)重新计算其几何形状将会很好,这将导致 SCNNode 具有转换矩阵零矩阵....

2 回答

  • 0

    如果您“只是”想要告诉节点永久地缩放其顶点,则必须编写一个函数来执行此操作,因为没有标准选项。

    该函数应将节点几何的顶点源读入向量数组,然后使用 GLKMatrix4MultiplyAndProjectVector3 将变换应用于每个向量,然后使用新顶点作为源创建新的 SCNGeometry。

    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);
    

    HEVertex 是我用来存储顶点的类,pos 属性是 SCNVector3。在您的情况下,您必须将 SCNNode 的.geometry 的顶点源读取到 SCNVector3 的数组中,然后循环遍历这些。

    变换每个顶点的位置后,需要更新节点的几何体。 I.e。这样的事情:

    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]];
    

    这只是一个粗略的例子,它只更新顶点源,并重用普通和颜色几何源以及几何元素,它们可能因模型而异。

    非常可行,但不像 re-exporting 那样简单,具有合适的尺寸。

  • 0

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

相关问题