Umwandle ein Bild in einen SceneKit-Knoten

Ich habe ein Bitmap-Bild:

(Dies sollte jedoch mit jedem beliebigen Bild funktionieren)

Ich möchte mein Bild aufnehmen und es zu einem 3D-SCNNode machen. Ich habe so viel mit diesem Code erreicht. Das nimmt jedes Pixel im Bild und erzeugt einen SCNNode mit einer SCNBox-Geometrie.

static inline SCNNode* NodeFromSprite(const UIImage* image) {
  SCNNode *node = [SCNNode node];
  CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
  const UInt8* data = CFDataGetBytePtr(pixelData);
  for (int x = 0; x < image.size.width; x++)
  {
    for (int y = 0; y < image.size.height; y++)
    {
      int pixelInfo = ((image.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 - image.size.width / 2.0,
                                        y - image.size.height / 2.0,
                                        0);
        [node addChildNode:pixel];
      }
    }
  }
  CFRelease(pixelData);
  node = [node flattenedClone];
  //The image is upside down and I have no idea why.
  node.rotation = SCNVector4Make(1, 0, 0, M_PI);
  return node;
}

Aber das Problem ist, dass das, was ich tue, viel zu viel Speicher beansprucht!

Ich versuche, einen Weg zu finden, dies mit weniger Speicher zu tun.

Alle Codes und Ressourcen finden Sie unter:https: //github.com/KonradWright/KNodeFromSprit

Antworten auf die Frage(6)

Ihre Antwort auf die Frage