ios swift scenekit scnnode

ios - SCNBox de diferente color o textura en cada cara.



swift scenekit (3)

Soy nuevo en el desarrollo de iOS y me he dejado perplejo. Estoy tratando de renderizar un cubo usando SceneKit que tiene un color diferente para cada cara.

Esto es lo que tengo hasta ahora:

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

Pero me gustaría que cada cara tenga un color diferente. ¿Cómo puedo hacer eso?


Aquí hay una respuesta 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

Para cambiar el material del frente, solo toma el material y cambia su contenido.

let frontMaterial = materials[0] frontMaterial.diffuse.contents = UIColor.white


Gracias por la ayuda rápida. Usé el código que posaste pero no pude usar NSColor, así que probé uicolor, pero todo lo que estaba obteniendo era un cubo negro, así que probé esto y lo tengo funcionando.

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 es un jpeg de un verde y así sucesivamente y eso lo tiene funcionando ahora.


La caja está compuesta de seis elementos diferentes (uno para cada lado). También puede haber notado que un objeto de geometría tiene una propiedad para el primer material, pero también una propiedad para una variedad de materiales.

Un objeto con múltiples elementos y múltiples materiales elegirá el incremento del material (y envolver) para cada elemento.

Por ejemplo 4 elementos y 1 material.

Element 1 2 3 4 Material 1 1 1 1

o 4 elementos y 2 materiales.

Element 1 2 3 4 Material 1 2 1 2 // note that they are repeating

Por ejemplo 4 elementos y 7 materiales.

Element 1 2 3 4 Material 1 2 3 4 // (5, 6, 7) is unused

En el caso de la caja, esto significa que puede usar una matriz de seis materiales para tener un material único en cada lado de la caja. Tengo un ejemplo de esto en el código de ejemplo de uno de los capítulos de mi libro de Scene Kit (en 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];