2017-02-10 102 views
2

从我以前的question,我相信克隆SCNNode是解决加载多个对象的问题的方法。但是,我意识到有什么问题。SCKNNode在SceneKit中的父子关系?

我不喜欢的东西

arrow = scnScene.rootNode.childNode(withName: "arrow", recursively:true) 
arrow.rotation = SCNVector4(0, 0, 1, M_PI_2) 
arrow.position = SCNVector3(x: 0, y: 0, z: -3); 
let sign = SCNNode() 
for i in 0..<10{ 
    let node = arrow.clone() 
    node.position = SCNVector3(i+1,0,0) 
    sign.addChildNode(node) 
} 
arrow.addChildNode(sign) 

我希望有显示了一排箭,但实际上有箭头(在x轴但实际上翻译影响y轴的一列,似乎克隆节点的坐标系统被改变)显示和所有的子对象旋转180度。为什么?

在Karl Sigiscar告诉我使用SCNReferenceNode之前,我不确定该如何使用它,它是否会实现我的目标?

更新:

我试图SCNReferenceNode这样的:

let scnScene = SCNScene() 

    if let filePath = Bundle.main.path(forResource: "arrowsign", ofType: "dae", inDirectory: "art.scnassets") { 
     // ReferenceNode path -> ReferenceNode URL 
     let referenceURL = NSURL(fileURLWithPath: filePath) 


     if #available(iOS 9.0, *) { 
      arrow = SCNReferenceNode(url: referenceURL as URL!)! 
      arrow.load() 
      arrow.rotation = SCNVector4(0, 0, 1, -M_PI_2) 
      arrow.position = SCNVector3(0,0,-5) 

      // Create reference node 
      for i in 0..<10{ 
       let referenceNode : SCNReferenceNode = SCNReferenceNode(url: referenceURL as URL)! 
       referenceNode.load() 
       referenceNode.position = SCNVector3(i+1, 0, 0); 
       arrow.addChildNode(referenceNode) 
      } 
     } 
    } 
    scnScene.rootNode.addChildNode(arrow) 

我不旋转的子节点,但他们自动旋转(-M_PI_2度),当我运行它。我在x轴上进行了翻译,但实际上有一列箭头显示,而不是一排箭头。这是孩子父母节点的功能吗?

回答

1

使用SCNReferenceNode后,我想出了如果将节点添加到另一个节点作为子节点,则该子节点将设置为父节点的位置。例如,位置(3,4,5)中有一个父节点,那么它的所有子节点将首先位于(3,4,5)中(稍后可以修改)。所以如果你想要一排箭头,只需修改子节点的x并保持z值等于零。 如果父节点应用旋转,则旋转也将应用于子节点。