То, что здесь происходит, лучше всего объяснить на простом примере.
Вот плоскость, которая состоит из двух треугольников:
let vertices: [SCNVector3] = [
SCNVector3(-1, 1, 0),
SCNVector3( 1, 1, 0),
SCNVector3( 1, -1, 0),
SCNVector3(-1, -1, 0)
]
let indices: [UInt16] = [
0, 3, 1,
1, 3, 2
]
var colors: [SCNVector3] = vertices.map { _ in SCNVector3(1, 1, 1) }
Теперь, когда вы назначаете красный цвет только одной из записей в массиве colors
, вы получаете такой результат:
![enter image description here](https://i.stack.imgur.com/kzUxu.png)
Это имеет смысл, потому что вы назначаете цвет одной вершине, а не всему лицу.
Красный цвет должен быть назначен каждому индексу лица (0, 3, 1)
, чтобы убедиться, что все лицо красное:
colors[0] = SCNVector3(1, 0, 0)
colors[3] = SCNVector3(1, 0, 0)
colors[1] = SCNVector3(1, 0, 0)
Что приводит к:
![enter image description here](https://i.stack.imgur.com/fQN2B.png)
Имеется красно-белый градиент, поскольку цвета интерполируются между вершинами. Вершины, которые теперь имеют красный цвет, также принадлежат второй грани, которая также имеет вершину белого цвета. Если вы хотите добиться этого результата:
![enter image description here](https://i.stack.imgur.com/eHwJz.png)
Тогда вам нужно будет продублировать вершины, общие для граней:
let vertices: [SCNVector3] = [
SCNVector3(-1, 1, 0),
SCNVector3(-1, -1, 0),
SCNVector3( 1, 1, 0),
SCNVector3( 1, 1, 0),
SCNVector3(-1, -1, 0),
SCNVector3( 1, -1, 0)
]
let indices: [UInt16] = [
0, 1, 2,
3, 4, 5
]
colors[0] = SCNVector3(1, 0, 0)
colors[1] = SCNVector3(1, 0, 0)
colors[2] = SCNVector3(1, 0, 0)