Wie verwende ich SceneKit, um mithilfe der benutzerdefinierten SCNGeometry eine bunte Punktwolke anzuzeigen?

Ich arbeite derzeit an der Entwicklung von OS X-Software mit Swift, um eine Punktwolke anzuzeigen, die aus einer PLY-Datei gelesen wird. Die Datei wird in ein Array von @ konvertierPointCloudVertex was wie folgt definiert ist:

struct PointCloudVertex {
    let x: Double, y: Double, z: Double
    let r: Double, g: Double, b: Double
}

Dann versuche ich ein @ zu bauSCNGeometry aus dem Array:

var vertices = [PointCloudVertex]()
for p in points {
    let v = PointCloudVertex(x: p[0], y: p[1], z: p[2], r: p[3], g: p[4], b: p[5])
    vertices.append(v)
}
let vertexData = NSData(bytes: &vertices, length: sizeof(PointCloudVertex) * points.count)
let positionSource = SCNGeometrySource(data: vertexData, semantic: SCNGeometrySourceSemanticVertex, vectorCount: points.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(Double), dataOffset: 0, dataStride: sizeof(PointCloudVertex))
let colorSource = SCNGeometrySource(data: vertexData, semantic: SCNGeometrySourceSemanticColor, vectorCount: points.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(CGFloat), dataOffset: sizeof(Double) * 3, dataStride: sizeof(PointCloudVertex))
let elements = SCNGeometryElement(data: nil, primitiveType: .Point, primitiveCount: points.count, bytesPerIndex: sizeof(Int))
let pointCloud = SCNGeometry(sources: [positionSource, colorSource], elements: [elements])
let pcNode = SCNNode(geometry: pointCloud)
self.modelScene.rootNode.addChildNode(pcNode)

wopoints ist ein[[Double]] speichert alle Positions- und Farbdaten der Punkte. Ich versuche die Punktwolke anzuzeigen. Die Positionen sind korrekt, aber alle Punkte sind schwarz und nicht in der Farbe, die ich an das @ übergebPointCloudVertex. Außerdem habe ich auch versucht, @ zu verwendSCNMaterial Um die Geometrie zu verknüpfen, ist die Farbe immer noch schwarz. Wie kann ich die Punktwolke farbig darstellen? Ich weiß, dass das SceneKit über eine benutzerdefinierte Rendering-API verfügt, und ich frage mich, ob dies hilfreich ist. Es wäre hilfreich, wenn es dafür Code geben würde, da ich mit OpenGL oder Metal Drawing nicht so vertraut bin.

Übrigens habe ich auch versucht,SCNSphere um die Punktwolke anzuzeigen, funktioniert es, aber ich muss eine erstellenSCNSphere für jeden einzelnen Punkt. Auf meinem Mac ist mit dieser Methode kein Speicher mehr verfügbar, da ich ungefähr 1 Million Punkte anzeigen muss.

Die PLY-Datei hat das folgende Format:

ply
format ascii 1.0
comment VCGLIB generated
element vertex 684398
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property uchar alpha
end_header
7.42808 15.3133 1.45829 55 45 43 255 
3.92053 20.8015 -32.8147 156 141 121 255 
4.80496 21.0725 -34.3995 160 146 133 255 
8.09035 14.6247 33.5683 127 119 101 255 
14.66 20.5331 -26.406 70 64 40 255 
-0.911526 14.6359 7.66687 157 146 150 255 
...

Bei meiner PLY-Dateireader-Methode wird jede Zeile im Hauptteil in ein @ konvertier[Double] (die letzte Spalte, bei der es sich um den Alpha-Wert handelt, wird verworfen). Für Rot, Grün und Blau habe ich sie durch 255 geteilt, sodass der Wert zwischen 0 und 1 liegt.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage