Создание собственной геометрии с триангуляцией многоугольника и применение координат текстуры в SceneKit - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь создать пользовательский геометрический объект в 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.

чтобы были понятны координаты текстуры; Текстура, которая будет использоваться, является повторяющейся текстурой, такой как эта:

repeating texture

1 Ответ

1 голос
/ 07 мая 2019

Для сложных случаев SCNShape более подходит, так как использует более сложную триангуляцию (Делоне). Простой SCNGeometryElement типа SCNGeometryPrimitiveTypePolygon создаст треугольный веер.

...