2017-02-10 3 views
2

내 전 question에서 SCNNode를 복제하는 것이 여러 객체를로드하는 문제를 해결하는 방법이라고 생각합니다. 그러나, 나는 틀린 무엇인가 깨달았다.SceneKit에서 SCNNode 부모 - 자식 관계?

나는

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 축에 영향을 x 축에 있지만, 사실 번역 화살표 (의 열이 같은 것이, 복제 노드의 좌표계 것 같다 않았다 변경됨) 및 모든 하위 오브젝트가 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를 수정하고 y 값이 0이되도록 & z 값을 유지하십시오. 부모 노드가 회전을 적용하면 회전도 자식 노드에 적용됩니다.