Установить цвет произвольной геометрии в SceneKit

Я успешно построил и отобразил произвольную геометрию (куб) в SceneKit из этого поста.

Пользовательская геометрия

Теперь я хочу установить цвет каждого лица на другой цвет. Я нашел этот пост, который должен это сделать

Для каждого цвета вершины

К сожалению, я не могу установить цвет грани куба на определенный цвет. Например, если я установлю цвет всех вершин на SCNVector3(x:1,y:0,z:0), я ожидаю, что все грани будут красными, но вместо этого все они будут зелеными. При установке цвета SCNVector3(x:0,y:1,z:0) лица становятся черными. Вот соответствующий код

let colors = [SCNVector3](count:vertices.count, repeatedValue:SCNVector3(x:1, y:0, z:0))

let colorData = NSData(bytes: colors, length: sizeof(SCNVector3) * colors.count)
let colorSource = SCNGeometrySource(data: colorData, semantic: SCNGeometrySourceSemanticColor, vectorCount: colors.count, floatComponents: true, componentsPerVector: 3, bytesPerComponent: sizeof(Float), dataOffset: 0, dataStride: sizeof(SCNVector3))

let geometry = SCNGeometry(sources: [colorSource, vertexSource, normalSource], elements: [element])

// Create a node and assign our custom geometry
let node = SCNNode()

let material = SCNMaterial()
material.diffuse.contents = NSColor.whiteColor()
geometry.materials = [material]

node.geometry = geometry

Кто-нибудь знает, почему не работает?


person Epsilon    schedule 14.12.2018    source источник


Ответы (1)


Вы должны создать материал для каждой грани с другим цветом.

Например:

let material1 = SCNMaterial()
material1.diffuse.contents = NSColor.whiteColor()
let material2 = SCNMaterial()
material2.diffuse.contents = NSColor.greenColor()
let material3 = SCNMaterial()
material3.diffuse.contents = NSColor.redColor()
let material4 = SCNMaterial()
material4.diffuse.contents = NSColor.blackColor()
let material5 = SCNMaterial()
material5.diffuse.contents = NSColor.blueColor()
let material6 = SCNMaterial()
material6.diffuse.contents = NSColor.whiteColor()

geometry.materials = [material1,material2,material3,material4,material5,material6]
person Stefan    schedule 16.12.2018
comment
Это будет работать для геометрий с относительно небольшим количеством граней, таких как куб. Я хотел бы построить что-то гораздо более сложное с тысячами вершин, и мне нужно установить цвет каждой вершины. - person Epsilon; 21.12.2018