Получить SCNGeometry из ввода-вывода модели
Я пытаюсь импортировать сетку в SCNGeometry. Я действительно хочу управлять вершинами индивидуально из процессора. Поэтому я хочу сделать это согласно следующему сообщению: https://developer.apple.com/forums/thread/91618 . Пока я импортировал его в Model I / O Framework и создал MTLBuffer.
let MDLPositionData = mesh?.vertexAttributeData(forAttributeNamed: "position", as: .float3)
let vertexBuffer1 = device.makeBuffer(bytes: MDLPositionData!.dataStart,
length: MDLPositionData!.bufferSize,
options: [.cpuCacheModeWriteCombined])
let vertexSource = SCNGeometrySource(
buffer: vertexBuffer1!,
vertexFormat: vertexFormat,
semantic: SCNGeometrySource.Semantic.vertex,
vertexCount: mesh!.vertexCount,
dataOffset: 0,
dataStride: MemoryLayout<vector_float3>.size)
SCNGeometry нуждается в индексных элементах, чтобы правильно отображать сетку. Где их взять? Я попытался использовать подсетки из Model I / O:
let submesh = mesh?.submeshes?[0]
let indexBuffer = (submesh as? MDLSubmesh)?.indexBuffer(asIndexType: .uInt32)
let indexBufferData = Data(bytes: indexBuffer!.map().bytes, count: indexBuffer!.length)
let indexElement = SCNGeometryElement(
data: indexBufferData,
primitiveType: SCNGeometryPrimitiveType.triangles,
primitiveCount: indexBuffer!.length,
bytesPerIndex: 32)
let geo = SCNGeometry(sources: [vertexSource, normalSource], elements: [indexElement])
Но это вызывает ошибку [SceneKit] Ошибка: C3DMeshElementSetPrimitives недопустимый размер индексного буфера и показывает следующую геометрию: Чайник . Кажется, что вершины неправильно соединены.
Как мне получить правильные данные индекса? Спасибо!