SCNBox отличается цветом или текстурой на каждой грани
Я новичок в разработке iOS, и у меня все в порядке. Я пытаюсь сделать куб, используя SceneKit, который имеет другой цвет для каждого лица.
Это то, что у меня есть до сих пор:
func sceneSetup() {
// 1
let scene = SCNScene()
// 2
let BoxGeometry = SCNBox(width: 0.9, height: 0.9, length: 0.9, chamferRadius: 0.0)
BoxGeometry.firstMaterial?.diffuse.contents = UIColor.redColor()
let cube = SCNNode(geometry: BoxGeometry)
cube.position = SCNVector3(x: 0, y: 0, z: -1)
scene.rootNode.addChildNode(cube)
// 3
sceneView.scene = scene
sceneView.autoenablesDefaultLighting = true
sceneView.allowsCameraControl = true
Но я бы хотел, чтобы у каждого лица был другой цвет. Как это сделать?
Ответы
Ответ 1
Коробка состоит из шести разных элементов (по одному для каждой стороны). Вы также заметили, что объект геометрии имеет одно свойство для первого материала, но также свойство для массива материалов.
Объект с несколькими элементами и несколькими материалами будет выбирать приращение материала (и обертки) для каждого элемента.
Например, 4 элемента и 1 материал
Element 1 2 3 4
Material 1 1 1 1
или 4 элемента и 2 материала
Element 1 2 3 4
Material 1 2 1 2 // note that they are repeating
Например, 4 элемента и 7 материалов
Element 1 2 3 4
Material 1 2 3 4 // (5, 6, 7) is unused
В случае с ящиком это означает, что вы можете использовать массив из шести материалов, чтобы иметь уникальный материал на каждой стороне коробки. У меня есть пример этого в пример кода для одной из глав для моей книги Scene Kit (в Objective-C):
// Each side of the box has its own color
// --------------------------------------
// All have the same diffuse and ambient colors to show the
// effect of the ambient light, even with these materials.
SCNMaterial *greenMaterial = [SCNMaterial material];
greenMaterial.diffuse.contents = [NSColor greenColor];
greenMaterial.locksAmbientWithDiffuse = YES;
SCNMaterial *redMaterial = [SCNMaterial material];
redMaterial.diffuse.contents = [NSColor redColor];
redMaterial.locksAmbientWithDiffuse = YES;
SCNMaterial *blueMaterial = [SCNMaterial material];
blueMaterial.diffuse.contents = [NSColor blueColor];
blueMaterial.locksAmbientWithDiffuse = YES;
SCNMaterial *yellowMaterial = [SCNMaterial material];
yellowMaterial.diffuse.contents = [NSColor yellowColor];
yellowMaterial.locksAmbientWithDiffuse = YES;
SCNMaterial *purpleMaterial = [SCNMaterial material];
purpleMaterial.diffuse.contents = [NSColor purpleColor];
purpleMaterial.locksAmbientWithDiffuse = YES;
SCNMaterial *magentaMaterial = [SCNMaterial material];
magentaMaterial.diffuse.contents = [NSColor magentaColor];
magentaMaterial.locksAmbientWithDiffuse = YES;
box.materials = @[greenMaterial, redMaterial, blueMaterial,
yellowMaterial, purpleMaterial, magentaMaterial];
Ответ 2
Здесь ответ Swift 4.
let colors = [UIColor.green, // front
UIColor.red, // right
UIColor.blue, // back
UIColor.yellow, // left
UIColor.purple, // top
UIColor.gray] // bottom
let sideMaterials = colors.map { color -> SCNMaterial in
let material = SCNMaterial()
material.diffuse.contents = color
material.locksAmbientWithDiffuse = true
return material
}
materials = sideMaterials
Чтобы изменить передний материал, просто возьмите материал и измените его содержимое.
let frontMaterial = materials[0]
frontMaterial.diffuse.contents = UIColor.white
Ответ 3
Ты за быструю помощь. я использовал код, который вы задали, но не смог использовать NSColor, поэтому я попытался использовать uicolor, но все, что я получал, было черным кубом, поэтому я попробовал это, и я получил его работу
let BoxGeometry = SCNBox(width: 0.95, height: 0.95, length: 0.95, chamferRadius: 0.0)
let greenMaterial = SCNMaterial()
greenMaterial.diffuse.contents = UIImage(named: "g")
greenMaterial.locksAmbientWithDiffuse = true;
let redMaterial = SCNMaterial()
redMaterial.diffuse.contents = UIImage(named: "r")
redMaterial.locksAmbientWithDiffuse = true;
let blueMaterial = SCNMaterial()
blueMaterial.diffuse.contents = UIImage(named: "b")
blueMaterial.locksAmbientWithDiffuse = true;
let yellowMaterial = SCNMaterial()
yellowMaterial.diffuse.contents = UIImage(named: "y")
yellowMaterial.locksAmbientWithDiffuse = true;
let purpleMaterial = SCNMaterial()
purpleMaterial.diffuse.contents = UIImage(named: "p")
purpleMaterial.locksAmbientWithDiffuse = true;
let WhiteMaterial = SCNMaterial()
WhiteMaterial.diffuse.contents = UIImage(named: "w")
WhiteMaterial.locksAmbientWithDiffuse = true;
BoxGeometry.materials = [greenMaterial, redMaterial, blueMaterial,
yellowMaterial, purpleMaterial, WhiteMaterial];
g - это зеленый цвет и т.д., и теперь он работает.