Je suis nouveau dans le développement iOS et je suis perplexe. J'essaie de rendre un cube en utilisant SceneKit qui a une couleur différente pour chaque visage.
Voici ce que j'ai jusqu'à présent:
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
Mais j'aimerais que chaque visage ait une couleur différente. Comment je fais ça?
La boîte est composée de six éléments différents (un pour chaque côté). Vous avez peut-être également remarqué qu'un objet géométrique possède une propriété pour le premier matériau mais également une propriété pour un tableau de matériaux.
Un objet avec plusieurs éléments et plusieurs matériaux sélectionnera l'incrémentation du matériau (et de l'habillage) pour chaque élément.
Par exemple 4 éléments et 1 matériau
Element 1 2 3 4
Material 1 1 1 1
ou 4 éléments et 2 matériaux
Element 1 2 3 4
Material 1 2 1 2 // note that they are repeating
Par exemple 4 éléments et 7 matériaux
Element 1 2 3 4
Material 1 2 3 4 // (5, 6, 7) is unused
Dans le cas de la boîte, cela signifie que vous pouvez utiliser un tableau de six matériaux pour avoir un matériau unique de chaque côté de la boîte. J'en ai un exemple dans l'exemple de code pour l'un des chapitres pour mon livre de kit de scène (dans 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];
Voici une réponse 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
Pour changer le matériau avant, saisissez simplement le matériau et changez son contenu
let frontMaterial = materials[0]
frontMaterial.diffuse.contents = UIColor.white
vous thai pour l'aide rapide. j'ai utilisé le code que vous avez posé, mais je n'ai pas pu utiliser NSColor, j'ai donc essayé uicolor mais tout ce que je recevais était un cube noir, j'ai donc essayé et je l'ai fait fonctionner
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 est un jpeg d'un vert et ainsi de suite et cela le fait fonctionner maintenant.