2017-07-21 2 views
0

J'essaie d'ajouter plusieurs objets 3D avec des ombres dans mon code ARKit.SCNNode clone() ajoute plus de lumière à la scène lorsque les nœuds sont clonés

Je crée noeud comme celui-ci

func loadNodaA() 
{ 

    isObjectCoordinatesAtCentre = false 

    let scaleFactor = 0.005 

    let dragonScene = SCNScene(named:"art.scnassets/Lowpoly_tree_sample.dae")! 

    let queenNode = dragonScene.rootNode.childNode(withName: "Tree_lp_11", recursively: true) 

    let geometry : SCNGeometry = (queenNode?.geometry)! 

    geometry.materials = [self.CreateMaterialWithName("streakedmetal")]; 

    nodeA = dragonScene.rootNode 
    nodeA.position = SCNVector3Zero 
    nodeA.scale = SCNVector3(x: Float(scaleFactor), y: Float(scaleFactor), z: Float(scaleFactor)) 
    nodeA.position = SCNVector3Make(0,0,0) 

} 

Et une fois que Arkit détecte un plan, je crée un plan comme celui-ci:

func createPlaneNode(anchor: ARPlaneAnchor) -> SCNNode { 

    let floatwidth = anchor.extent.x 
    let floatlength = anchor.extent.z 
    let floatPlaneHeight : Float = 0.001 

    let planeGeometry = SCNBox(width: CGFloat(floatwidth), height: CGFloat(floatPlaneHeight), length: CGFloat(floatlength), chamferRadius:0) 

    planesGeometries[anchor.identifier] = planeGeometry 

    let planeNode = SCNNode(geometry: planeGeometry) 

    let transparentMaterial : SCNMaterial = SCNMaterial() 
    //transparentMaterial.diffuse.contents = UIImage.init(named: "art.scnassets/GridtextureGrayLines.png") 

    transparentMaterial.diffuse.contents = UIImage.init(named: "art.scnassets/sunmica.png") 

     //planeGeometry.materials = [transparentMaterial, transparentMaterial, transparentMaterial, transparentMaterial,self.CreateMaterialWithName("redbricks"), transparentMaterial]; 
    //planeGeometry.materials = [transparentMaterial] 

    planeGeometry.firstMaterial = transparentMaterial 

    transparentMaterial.diffuse.contentsTransform = SCNMatrix4MakeScale(2,2, 0) 

    planeNode.geometry?.firstMaterial?.diffuse.wrapS = .repeat 
    planeNode.geometry?.firstMaterial?.diffuse.wrapT = .repeat 
    planeNode.position = SCNVector3Make(0, -(floatPlaneHeight/2), 0) 

    planeNode.physicsBody = SCNPhysicsBody(type: .kinematic, shape: SCNPhysicsShape(geometry: planeGeometry, options: nil)) 

    //planeNode.castsShadow = true 


    self.setTextureScale(plane: planeNode, planeGeometry: planeGeometry) 

    return planeNode 

} 

Et sur le robinet de l'avion, je suis d'ajouter des objets d'arbre avec des ombres à lui. Mais le problème est quand je clone ces objets encore et encore, l'avion au-dessous des arbres obtient plus de luminosité je pense que le noeud léger que j'ajoute continue à ajouter pour chaque noeud bien que j'essaye de le supprimer par son nom.

func insertGeometry(_ anchor : ARHitTestResult) { 



    let h = CGFloat(selectedNode.boundingBox.max.y - selectedNode.boundingBox.min.y) 



    var insertionYOffset: Float = Float(h)/2.0; 

    if isObjectCoordinatesAtCentre == false 
    { 
     insertionYOffset = 0 
    } 



    let hitPointPosition = SCNVector3Make(
     anchor.worldTransform.columns.3.x, 
     anchor.worldTransform.columns.3.y + insertionYOffset, 
     anchor.worldTransform.columns.3.z 
    ); 

    var nodeClone = SCNNode.init() 

    if CurrentNodeChoise == 1 
    { 
     //This means draw tree 
     nodeClone = nodeA.clone() 
    } 

    nodeClone.position = hitPointPosition 
    sceneView.scene.rootNode.addChildNode(nodeClone) 



    guard let spotlightNode : SCNNode = (sceneView.scene.rootNode.childNode(withName: "LightForShadows", recursively: true)) else { 


     let spot = SCNLight() 
     spot.type = .spot 
     spot.castsShadow = true 
     spot.color = UIColor.darkGray 
     spot.shadowMode = .forward 
     spot.intensity = 2000 
     spot.shadowRadius = 5; 
     spot.shadowSampleCount = 20; 
     spot.shadowMapSize = CGSize(width: 4000, height: 4000) 
     spot.orthographicScale=50; 
     spot.zNear=1; 
     spot.zFar=1000; 
     spot.name = "myLight" 
     let spotNode = SCNNode() 
     spotNode.light = spot 
     spotNode.position = SCNVector3(x:4, y: 6, z: 0)    
     let lookAt = SCNLookAtConstraint.init(target: nodeClone) 
     constraintsArray.append(lookAt) 
     spotNode.constraints = constraintsArray    
     spotNode.name = "LightForShadows"   
     sceneView.scene.rootNode.addChildNode(spotNode) 

     return 
    } 

    let lookAt = SCNLookAtConstraint.init(target: nodeClone) 

    constraintsArray.append(lookAt) 

    spotlightNode.constraints = constraintsArray 
} 

J'ai essayé aussi ajouter de la lumière au premier noeud ne puis pour le repos des noeuds en mettant à jour que le premier noeud de lumière. Mais cela ne fonctionne pas non plus. Je veux ajouter des arbres avec des ombres avec un plan en dessous qui reste le même. Aussi, les ombres ne sont pas parfaites y at-il un moyen de les améliorer?

Voir les captures d'écran comment le plan sous les arbres change lors de l'ajout d'arbres un par un.

First Image

Second Image

Third Image

Répondre

2

Pour chaque arbre que vous ajoutez vous ajoutez une lumière, bien sûr qui rend votre plus lumineux d'avion.

Stick avec une lumière que vous créez dans votre scène mise en place et juste mettre à jour sa contrainte de pointer sur l'avion. Vous n'avez rien à faire avec l'éclair lorsque vous ajoutez d'autres nœuds. Lorsque votre scène a une lumière qui crée des ombres, cela affecte tous les nœuds que vous ajoutez. Pour rendre vos ombres "plus belles" - quoi que cela signifie - vous devez jouer avec les différents modes de foudre et les différents paramètres de lumière. Je vous recommande de créer une scène dans l'éditeur Xcode et de jouer avec les propriétés.

+0

Merci beaucoup, j'ai maintenant ajouté un nœud lumineux à mon nœud plan et ça marche maintenant. – AKumar

+0

Encore une question: Dans le cas où j'utilise une image de grille transparente avec juste des lignes, je ne peux pas voir les ombres. Comme vous pouvez le voir dans la première image avec les ombres planes brunes sont visibles mais quand je swith avec la grille transpaent, les ombres deviennent invisibles. – AKumar

+0

Si vous rendez l'avion pratiquement invisible, il n'y a rien où SceneKit peut rendre les ombres. Consultez [SceneKit: Nouveautés de la WWDC 17] (https://developer.apple.com/videos/play/wwdc2017/604/?time=2569) pour voir une solution de contournement. – orangenkopf