Получить 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 недопустимый размер индексного буфера и показывает следующую геометрию: Чайник . Кажется, что вершины неправильно соединены.

Как мне получить правильные данные индекса? Спасибо!

0 ответов

Другие вопросы по тегам