加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ios – 组合两个或多个SCNGeometries

发布时间:2020-12-14 17:46:47 所属栏目:百科 来源:网络整理
导读:我使用这种方法来获取UI Image并将其转换为3D模型.然而,这意味着我添加了大量节点.我想也许可以通过将所有几何添加到单个节点来优化它.有办法实现吗? 这是代码 static inline SCNNode* S2NNode(const UIImage* sprite) { SCNNode *spriteNode = [SCNNode no
我使用这种方法来获取UI Image并将其转换为3D模型.然而,这意味着我添加了大量节点.我想也许可以通过将所有几何添加到单个节点来优化它.有办法实现吗?

这是代码

static inline SCNNode* S2NNode(const UIImage* sprite) {
  SCNNode *spriteNode = [SCNNode node];
  CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(sprite.CGImage));
  const UInt8* data = CFDataGetBytePtr(pixelData);
  for (int x = 0; x < sprite.size.width; x++)
  {
    for (int y = 0; y < sprite.size.height; y++)
    {
      int pixelInfo = ((sprite.size.width * y) + x) * 4;
      UInt8 alpha = data[pixelInfo + 3];
      if (alpha > 3)
      {
        UInt8 red   = data[pixelInfo];
        UInt8 green = data[pixelInfo + 1];
        UInt8 blue  = data[pixelInfo + 2];
        UIColor *color = [UIColor colorWithRed:red/255.0f green:green/255.0f blue:blue/255.0f alpha:alpha/255.0f];
        SCNNode *pixel = [SCNNode node];
        pixel.geometry = [SCNBox boxWithWidth:1.001 height:1.001 length:1.001 chamferRadius:0];
        pixel.geometry.firstMaterial.diffuse.contents = color;
        pixel.position = SCNVector3Make(x - sprite.size.width / 2.0,y - sprite.size.height / 2.0,0);
        [spriteNode addChildNode:pixel];
      }
    }
  }
  CFRelease(pixelData);
  //The image is upside down and I have no idea why.
  spriteNode.rotation = SCNVector4Make(1,M_PI);
  return spriteNode;
}

解决方法

这个答案解决了最初提出的问题 – 如何合并几何.但是,合并几何图形似乎并不能解决您的实际问题 – 如何获得具有一定厚度的像素化“精灵”,并具有良好的性能.请参阅 my other answer.

SCNNode方法flattenedClone将节点子节点的所有几何结构组合成具有单个几何的单个节点.这将减少场景处理开销并在单个OpenGL绘制调用中渲染……但它也会使立方体不能独立移动并且所有共享相同的材质,因此它们将不会是不同的颜色.此外,根据您希望多维数据集排列的方式,您可能会推送比GPU更多的顶点数据,这仍然会损害您的性能.

取决于你想要的效果,可能有更好的解决方案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读