Я пытался создать собственный многоугольник SCNGeometry из набора позиций SCNVector3 со следующим кодом:
private func polygonGeometry (vertices: [SCNVector3]) -> SCNGeometry {
var indices: [Int32] = [Int32(vertices.count)]
indices.append(contentsOf: generateIndices(max: vertices.count))
let vertexSource = SCNGeometrySource(vertices: vertices )
let indexData = Data(bytes: indices,
count: indices.count * MemoryLayout<Int32>.size)
let element = SCNGeometryElement(data: indexData,
primitiveType: .polygon,
primitiveCount: 1,
bytesPerIndex: MemoryLayout<Int32>.size)
return SCNGeometry(sources: [vertexSource], elements: [element])
}
С помощью этого вспомогательного метода для создания правильного количества индексов:
private func generateIndices(max maxIndexValue: Int) -> [Int32]{
var counter: Int = 0
var output: [Int32] = []
while counter < maxIndexValue {
output.append(Int32(counter))
counter += 1
}
return output
}
Код отлично работает для некоторых полигонов.Тем не менее, иногда я получаю следующую ошибку в консоли при попытке создать пользовательскую геометрию, и программа вылетает.
[MTLDebugDevice validateNewBufferArgs:options:]:467: failed assertion Cannot create buffer of zero length.
Кто-нибудь знает, почему это происходит?Есть ли недостатки в коде?
[РЕДАКТИРОВАТЬ]: Я полагаю, что проблема возникает, когда первая и последняя позиции имеют одинаковые значения x, y, z.Просто удалите последнюю позицию из массива позиций, и полигон должен отобразиться так, как ожидается!