2017-02-10 6 views
2

От моего прежнего question, я считаю, что клонирование SCNNode - это способ решить проблему загрузки нескольких объектов. Однако я понял, что что-то не так.SCNNode отношения родитель-ребенок в 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) 

Я ожидаю, что есть ряд стрелок, отображающая, но на самом деле есть столбец стрелок (Транслейтинг в оси х, но на самом деле, влияющих на оси Y, кажется, система координат клонированного узла имеет было изменено), а все дочерние объекты вращаются на 180 градусов. Зачем?

Перед тем, как Карл Сигискар сказал мне использовать SCNReferenceNode, я не уверен, как его использовать и достигнет моей цели?

Update:

Я пытался 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 и сохраните y &. Значение z будет равно нулю. Если родительский узел применяет вращение, вращение будет также применяться к дочерним узлам.