2014-12-16 23 views
14

Jestem nowy w rozwoju iOS i mam się zakłopotany. Próbuję renderować moduł przy użyciu SceneKit, który ma inny kolor dla każdej twarzy.SCNBox inny kolor lub tekstura na każdej twarzy

To, co mam do tej pory:

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 

Ale chciałbym każdą twarz mieć inny kolor. Jak mogę to zrobić?

Odpowiedz

18

Pudełko składa się z sześciu różnych elementów (po jednym dla każdej strony). Można również zauważyć, że obiekt geometrii ma jedną właściwość dla materiału , ale także właściwość dla tablicy materiałów.

Obiekt z wieloma elementami i wieloma materiałami wybierze przyrost materiału (i zawinięcia) dla każdego elementu.

przykładzie 4 elementów i materiałów 1

Element 1 2 3 4 
Material 1 1 1 1 

lub 4 elementów i 2 Materiały

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

przykładzie 4 elementy i 7 Materiały

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

W obudowa tego mea ns, że możesz użyć szeregu sześciu materiałów, aby mieć unikalny materiał po każdej stronie pudełka. Mam tego przykład w the sample code for one of the chapters dla mojej sceny książki Kit (w 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]; 
+4

Ładnie zrobione, sir! Warto zwrócić uwagę na jedną dodatkową rzecz: dzięki wielu geometriom można stwierdzić, ile materiałów obsługuje, wyszukując jego "geometryElementCount". To nie działa dla 'SCNBox', chociaż ... automatycznie odtwarza swój zestaw elementów geometrii w zależności od tego, ile materiałów przypiszesz (w ten sposób nie potrzeba sześciu wywołań drawów do renderowania, jeśli nie ma sześciu materiałów). – rickster

+0

dziękuję źle daj to, co postanowiłeś – may19c19

+0

Po której stronie jest (z przodu, z prawej, z tyłu, z lewej strony, z góry, z dołu)? –

2

thai ciebie dla szybkiej pomocy. użyłem kod stwarzane ale nie był w stanie wykorzystać NSColor więc próbowałem uicolor ale ja trafiałem był czarny sześcian więc próbowałem to i mam to działa

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 jest jpeg z zielonym i tak i to działa teraz.

4

Oto odpowiedź 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 

Aby zmienić materiał przedni prostu chwycić materiał i zmienić jego treść

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