使用多边形三角剖分创建自定义几何并在SceneKit中应用纹理坐标

时间:2019-05-06 16:39:58

标签: swift 3d textures scenekit triangulation

我正在尝试在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
    }
}

这在制作更简单的多边形形状时相当有效,但是在形状变得更复杂且在不同位置变窄时,则无法按预期工作。我也不知道要使用这种方法来应用自定义纹理的任何方法来创建纹理坐标。

我认为我需要利用某种polygon triangulation算法将形状分解为三角形,然后使用正确的SCNGeometryPrimitiveType,例如.triangles.triangleStrip 。这可能还允许我对纹理坐标进行UV映射,但是我不确定目前如何工作。

多边形三角剖分算法需要能够处理3D坐标,因为创建的2D几何图形应该存在于3D世界中(您应该能够创建倾斜的多边形平面等)。我还无法找到任何已在Swift中实现的3D多边形三角剖分算法。

要清晰的显示纹理坐标;将要使用的纹理是重复的纹理,例如:

repeating texture

1 个答案:

答案 0 :(得分:1)

对于复杂的情况,SCNShape更适用,因为它使用了更精细的三角剖分(Delaunay)。 类型为SCNGeometryElement的简单SCNGeometryPrimitiveTypePolygon会产生一个三角形风扇。