Как использовать SceneKit для отображения разноцветного облака точек с помощью пользовательской SCNGeometry?

В настоящее время я работаю над разработкой программного обеспечения OS X с использованием Swift для отображения чтения облака точек из файла PLY. Файл конвертируется в массивPointCloudVertex который определяется следующим образом:

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

Затем я пытаюсь построитьSCNGeometry из массива:

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)

гдеpoints это[[Double]] в котором хранятся данные о положении и цвете всех точек. Я пытаюсь отобразить облако точек. Положения правильные, но все точки выделены черным цветом, а не цветом, который я передаюPointCloudVertex, Более того, я также пытался использоватьSCNMaterial чтобы связать с геометрией цвет по-прежнему черный. Итак, как я могу отображать облако точек красочным образом? Я знаю, что у SceneKit есть некоторый пользовательский API рендеринга, и мне интересно, поможет ли это. Было бы полезно, если бы для этого был какой-то код, потому что я не очень знаком с OpenGL или металлическими материалами для рисования.

Кстати, я тоже пытался использоватьSCNSphere для отображения облака точек, это работает, но мне нужно создатьSCNSphere для каждой отдельной точки. Мой Mac исчерпал память, используя этот метод, так как у меня есть около 1 миллиона точек для отображения.

Файл PLY имеет следующий формат:

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 
...

В моем методе чтения файлов PLY каждая строка в части тела преобразуется в[Double] (последний столбец, который является альфа-значением, отбрасывается). Для красного, зеленого и синего значения я разделил их на 255, так что значение находится между 0 и 1.

Ответы на вопрос(0)

Ваш ответ на вопрос