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.
Merci beaucoup, j'ai maintenant ajouté un nœud lumineux à mon nœud plan et ça marche maintenant. – AKumar
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
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