2017-03-29 11 views
0

Dans SceneKit, je construis un nœud constitué de lignes pour dessiner les axes XYZ au centre de la scène, comme dans Cinema4D.SceneKit évite l'éclairage sur un nœud spécifique

cinema4D

Je voudrais que ces 3 nœuds de ne pas participer à l'éclairage global et être visible même si la lumière est sombre/inexistant/trop forte. Dans l'image ci-dessous, vous pouvez voir que l'axe Z apparaît trop fortement et ne peut pas être vu.

my software

Y at-il un moyen d'arrêter un nœud participant à l'éclairage de la scène, comme avec des masques de catégorie pour la physique?

Dans ce cas, comment le nœud serait-il éclairci pour qu'il apparaisse de toute façon?

Répondre

4

SCNLight possède une propriété categoryBitMask. Cela vous permet de choisir les nœuds affectés par la lumière (bien que cela soit ignoré pour les lumières ambiantes). Vous pouvez avoir 2 catégories de sources lumineuses, une pour votre scène principale et une autre qui n'affecte que vos lignes.

Voici un exemple simple avec 2 noeuds, chacun éclairé avec une lumière de couleur différente:

struct LightType { 
    static let light1:Int = 0x1 << 1 
    static let light2:Int = 0x1 << 2 
} 

class GameViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let scene = SCNScene(named: "art.scnassets/scene.scn")! 

     let lightNode1 = SCNNode() 
     lightNode1.light = SCNLight() 
     lightNode1.light!.type = .omni 
     lightNode1.light!.color = UIColor.yellow 
     lightNode1.position = SCNVector3(x: 0, y: 10, z: 10) 
     lightNode1.light!.categoryBitMask = LightType.light1 
     scene.rootNode.addChildNode(lightNode1) 

     let lightNode2 = SCNNode() 
     lightNode2.light = SCNLight() 
     lightNode2.light!.type = .omni 
     lightNode2.light!.color = UIColor.red 
     lightNode2.position = SCNVector3(x: 0, y: 10, z: 10) 
     lightNode2.light!.categoryBitMask = LightType.light2 
     scene.rootNode.addChildNode(lightNode2) 

     let sphere1 = scene.rootNode.childNode(withName: "sphere1", recursively: true)! 
     sphere1.categoryBitMask = LightType.light1 
     let sphere2 = scene.rootNode.childNode(withName: "sphere2", recursively: true)! 
     sphere2.categoryBitMask = LightType.light2 

     let scnView = self.view as! SCNView 
     scnView.scene = scene 
    } 
} 

enter image description here

+0

Merci, je vais creuser dès maintenant! Auriez-vous un morceau de code? :-) –

+0

@ BenoîtLahoz J'ai ajouté un exemple rapide. –

+0

Merci beaucoup! C'est exactement ce que je cherchais! –