2016-12-28 5 views
0

J'ai un projet SceneKit avec deux objets dans la vue de la scène. Le premier objet est un plan créé via SCNPlane. Le deuxième objet est une simple boîte créée dans Blender. En code, je configure l'éclairage ambiant et omnidirectionnel. Il effets d'éclairage fonctionnent pour le plan: enter image description hereSceneKit importé COLLADA Boîte non « Lit »

Mais, quand j'ajoute la boîte au-dessus du plan, les effets d'éclairage fonctionnent sur le plan, mais pas la boîte importés du fichier COLLADA: enter image description here

I soupçonne que le problème a à voir avec les normales, mais je ne suis pas sûr. Est-ce que quelqu'un qui importe DAE via SceneKit a vécu cela? Le code de configuration pour l'éclairage et des objets est la suivante:

private func setupAmbientLight() { 

    // setup ambient light source 
    let ambientLightNode = SCNNode() 
    ambientLightNode.light = SCNLight() 
    ambientLightNode.light!.type = SCNLight.LightType.ambient 
    ambientLightNode.light!.color = NSColor(white: 0.35, alpha: 1.0).cgColor 

    // add to scene 
    guard let scene = sceneView.scene else { 

     return 
    } 
    scene.rootNode.addChildNode(ambientLightNode) 
} 

private func setupOmniDirectionalLight() { 

    // initialize noe 
    let omniLightNode = SCNNode() 
    // assign light 
    omniLightNode.light = SCNLight() 
    // set type 
    omniLightNode.light!.type = SCNLight.LightType.omni 
    // color and position 
    omniLightNode.light!.color = NSColor(white: 0.56, alpha: 1.0).cgColor 
    omniLightNode.position = SCNVector3Make(0.0, 2000.0, 0.0) 

    // add to scene 
    guard let scene = sceneView.scene else { 

     return 
    } 
    scene.rootNode.addChildNode(omniLightNode) 
} 

private func setupPlane() { 

    // create plane geometry with size and material properties 
    let myPlane = SCNPlane(width: planeSideLength, height: planeSideLength) 
    myPlane.firstMaterial!.diffuse.contents = NSColor.orange.cgColor 
    myPlane.firstMaterial!.specular.contents = NSColor.white.cgColor 

    // intialize node 
    let planeNode = SCNNode() 
    // assign plane geometry to the node 
    planeNode.geometry = myPlane 

    // rotate -90.0 about the x-axis 
    let rotMat = SCNMatrix4MakeRotation(-CGFloat(M_PI/2.0), 1.0, 0.0, 0.0) 
    planeNode.transform = rotMat 
    planeNode.position = SCNVector3Make(0.0, 0.0, 0.0) 

    // setup the node's physics body property 
    planeNode.physicsBody = SCNPhysicsBody(type: .static, shape: SCNPhysicsShape(geometry: myPlane, options: nil)) 
    planeNode.physicsBody!.categoryBitMask = PhysicsMask3DOF.plane.rawValue 

    // add to scene 
    guard let scene = sceneView.scene else { 

     return 
    } 

    scene.rootNode.addChildNode(planeNode) 
} 

private func setupRobot() { 

    guard let mainScene = sceneView.scene else { 

     return 
    } 

    let bundle = Bundle.main 

    guard let url = bundle.url(forResource: "robot.scnassets/test_cube", withExtension: "dae") else { 

     return 
    } 

    var cubeScene: SCNScene? 

    do { 

     try cubeScene = SCNScene.init(url: url, options: nil) 
    } 
    catch { 

     return 
    } 

    guard let cubeNode = cubeScene!.rootNode.childNode(withName: "Cube", recursively: true) else { 

     return 
    } 

    cubeNode.removeFromParentNode() 
    cubeNode.scale = SCNVector3Make(2000.0, 2000.0, 2000.0) 
    cubeNode.geometry!.firstMaterial!.diffuse.contents = NSColor.blue.cgColor 
    cubeNode.geometry!.firstMaterial!.specular.contents = NSColor.white.cgColor 

    mainScene.rootNode.addChildNode(cubeNode) 
} 

Mise à jour:

Je commentais le code pour importer la boîte de DAE et le code à la place ajouté pour créer la boîte via SCNBox et les effets de lumière apparaissent pour travailler: enter image description here

Répondre

0

Duh, la boîte est [2000 x 2000 x 2000] et son nœud est la position à (0, 0, 0). La position du nœud source omnidirectionnel est (0, 2000, 0). Juste nécessaire pour déplacer la source de lumière vers le haut. Ce qui pose alors la question de savoir pourquoi la boîte correctement allumée lorsque j'ai créé la boîte avec les mêmes dimensions via la fonction SCNBox au lieu d'importer à partir du fichier DAE

+0

Votre cube fichier '.dae' ont une source de lumière? Vous pouvez vérifier cela dans l'éditeur de scène Xcode. –

+0

@dmsurti, oui il y avait un, mais je voulais seulement l'objet et d'utiliser la source de lumière dans la scène principale, qui est pas celui dans le fichier DAE. – xBACP

+0

Je suppose que cela https://developer.apple.com/reference/scenekit/scnscenerenderer/1523812-autoenablesdefaultlighting peut l'expliquer, qui dit que 'Si la valeur de cette propriété est false (par défaut), la seule source de lumière SceneKit utilise pour le rendu une scène sont celles contenues dans le graphe de la scène ». Et votre scénographie a une lumière provenant du fichier 'cube.dae'. –