SCNGeometry avec polygone comme primitiveType

Essayer de comprendre comment je crée un SCNGeometry avec un polygone comme primitiveType, Mon but est d'append un nœud en forme de polygone en tant qu'enfant d'un nœud de sphère, et le faire ressembler à MKPolygon pour le kit de carte, comme dans cet exemple .

MKPolygon

Mon code actuel est:

//Take an arbitrary array of vectors let vertices: [SCNVector3] = [ SCNVector3Make(-0.1304485, 0.551937, 0.8236193), SCNVector3Make(0.01393811, 0.601815, 0.7985139), SCNVector3Make(0.2971005, 0.5591929, 0.7739732), SCNVector3Make(0.4516893, 0.5150381, 0.7285002), SCNVector3Make(0.4629132, 0.4383712, 0.7704169), SCNVector3Make(0.1333823, 0.5224985, 0.8421428), SCNVector3Make(-0.1684743, 0.4694716, 0.8667254)] //Does polygon shape require indices? let indices: [Int] = [0,1,2,3,4,5,6] let vertexSource = SCNGeometrySource(vertices: vertices) let indexData = Data(bytes: indices, count: indices.count * MemoryLayout<Int>.size) //Note!!! I get comstackr error if primitiveCount is greater than 0 let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 0, bytesPerIndex: MemoryLayout<Int>.size) let geometry = SCNGeometry(sources: [vertexSource], elements: [element]) let material = SCNMaterial() material.diffuse.contents = UIColor.purple.withAlphaComponent(0.75) material.isDoubleSided = true geometry.firstMaterial = material let node = SCNNode(geometry: geometry) 

Lorsque vous utilisez SCNGeometryElement comme ceci, je reçois un nœud vide.

Vous avez des problèmes:

  1. SceneKit (et Metal) ne supporte que des entiers de 32 bits comme indices ( source ). Le type de votre tableau d'indices doit donc être [Int32] .

  2. Pour les polygones, SceneKit a besoin de deux informations: le nombre de points dans le polygone et l'indice du point dans le tableau de sumts. De la documentation d' SCNGeometryPrimitiveTypePolygon sur SCNGeometryPrimitiveTypePolygon (qui n'existe que dans Objective-C):

La propriété data de l'élément contient deux séquences de valeurs.

  • La première séquence a un nombre de valeurs égal à la valeur primitiveCount de l'élément de geometry. Chaque valeur de cette séquence spécifie le nombre de sumts dans une primitive de polygone. Par exemple, si la première séquence est [5, 3], l'élément de geometry contient un pentagone suivi d'un sortingangle.
  • Le rest des données est une séquence d'indices de vertex. Chaque input de la première séquence spécifie un nombre correspondant d'inputs dans la deuxième séquence. Par exemple, si la première séquence inclut les valeurs [5, 3], la deuxième séquence comprend cinq indices pour le pentagone, suivis de trois indices pour le sortingangle.

Vous devez changer votre tableau d'index pour:

 let indices: [Int32] = [7, /* We have a polygon with seven points */, 0,1,2,3,4,5,6 /* The seven indices for our polygon */ ] 

Ensuite, vous pouvez définir le primitiveCount à 1 (nous avons un polygone à dessiner) et besoin de changer la taille de notre tampon

 let indexData = Data(bytes: indices, count: indices.count * MemoryLayout<Int32>.size) // Now without runtime error let element = SCNGeometryElement(data: indexData, primitiveType: .polygon, primitiveCount: 1, bytesPerIndex: MemoryLayout<Int32>.size)