Я пытаюсь создать пользовательский геометрический объект в SceneKit, который должен быть плоскостью с произвольной формой. Я поставляю контуры фигуры и хочу заполнить ее изнутри.
До сих пор я использовал этот код:
extension SCNGeometry {
static func polygonPlane(vertices: [SCNVector3]) -> SCNGeometry {
var indices: [Int32] = [Int32(vertices.count)]
var index: Int32 = 0
for _ in vertices {
indices.append(index)
index += 1
}
let vertexSource = SCNGeometrySource(vertices: vertices)
let textureCoords : [CGPoint] = [] // Fix to map textures to the polygon plane...
let textureCoordsSource = SCNGeometrySource(textureCoordinates: textureCoords)
let indexData = Data(bytes: indices, count: indices.count * MemoryLayout<Int32>.size)
let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 1, bytesPerIndex: MemoryLayout<Int32>.size)
let geometry = SCNGeometry(sources: [vertexSource, textureCoordsSource], elements: [element])
let imageMaterial = SCNMaterial()
imageMaterial.diffuse.contents = UIImage(named: "texture.jpg")
let scaleX = (Float(1)).rounded()
let scaleY = (Float(1)).rounded()
imageMaterial.diffuse.contentsTransform = SCNMatrix4MakeScale(scaleX, scaleY, 0)
imageMaterial.isDoubleSided = true
geometry.firstMaterial = imageMaterial
return geometry
}
}
Это работает достаточно хорошо при создании более простых форм многоугольников, но не работает должным образом, когда форма становится более сложной и узкой в разных местах. Я также не знаю ни одного способа создания координат текстуры для применения пользовательской текстуры с этим подходом.
Я думаю, мне нужно использовать какой-то алгоритм полигональной триангуляции , чтобы разбить фигуру на треугольники, а затем использовать правильный SCNGeometryPrimitiveType , например .triangles
или .triangleStrip
. Возможно, это также позволило бы мне сделать UV-отображение для координат текстуры, однако я не уверен, как это будет работать на данный момент.
Алгоритм триангуляции многоугольника должен уметь обрабатывать трехмерные координаты, поскольку созданная двумерная геометрия должна существовать в трехмерном мире (вы должны иметь возможность создавать наклонные плоскости многоугольника и т. Д.). Я не смог найти какие-либо алгоритмы триангуляции 3D полигонов, уже реализованные в Swift.
чтобы были понятны координаты текстуры; Текстура, которая будет использоваться, является повторяющейся текстурой, такой как эта: