web-dev-qa-db-fra.com

SCNBox couleur ou texture différente sur chaque face

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?

23
may19c19

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];
23
David Rönnqvist

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
14
David

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.

4
may19c19