克隆节点时,SCNNode clone()会为场景添加更多光

时间:2017-07-21 10:18:40

标签: scenekit scnnode arkit scnlight

我正在尝试在我的ARKit代码中添加多个带有阴影的3d对象。

我像这样创建节点

  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)

}

一旦ARKIT检测到一架飞机,我就会创建一个这样的飞机:

  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

}

在飞机上,我正在添加带有阴影的树状物体。但问题是,当我一次又一次地克隆这些对象时,树下面的平面获得更多亮度我认为我添加的光节点继续为每个节点添加,尽管我试图按名称删除它。

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
}

我还尝试仅为第一个节点添加光,然后通过更新第一个光节点为其余节点添加光。但这也行不通。我希望树木添加阴影,其下方的平面保持不变。阴影也不完美有没有办法让它们变得更好?

查看屏幕截图,树木下面的平面如何逐个添加树木。

First Image

Second Image

Third Image

1 个答案:

答案 0 :(得分:3)

对于你添加的每棵树,你都要添加一盏灯,这当然会使你的飞机更亮。

坚持在场景设置中创建的一盏灯,然后更新它的约束以指向平面。添加其他节点时,您无需对闪电进行任何操作。当场景中有一个创建阴影的灯光时,这将影响您添加的每个节点。

为了使你的阴影“看起来更好” - 无论这意味着什么 - 你需要使用不同的闪电模式和光照参数。我建议在Xcode编辑器中创建一个场景,然后使用属性。

相关问题