2017-09-27 4 views
1

ARKit에 관한 모든 Apple 가이드를 읽었으며 WWDC video을 보았습니다.이 ARKit의 좌표 공간 이해

  • 장치
  • 의 3D 장면
  • 가 서로 연결

    1. 실제 세계 :하지만에 바인드있는 좌표계를 어떻게 이해할 수 없습니다.

      나는 예를 SCNPlane A의 객체를 추가 할 수 있습니다

      let stripe = SCNPlane(width: 0.005, height: 0.1) 
      let stripeNode = SCNNode(geometry: stripe) 
      scene.rootNode.addChildNode(stripeNode) 
      

      이 관계없이 장치가 그 순간에 중심되는 방법, 수직 방향됩니다 흰색 줄무늬를 생산하지 않습니다. 그것은 좌표계가 어떻게 든 중력에 묶여 있음을 의미합니다! 하지만 프레임 당 upAxisattribute of the SCNScene을 인쇄하려고하면 iPhone을 어떻게 회전하든 상관 없습니다. 또한 stripeNode.worldTransform을 인쇄하려고 시도했지만 변경되지 않았습니다.

      ARKit 좌표의 이해를 돕습니다.

    답변

    10

    기본적으로 ARKit의 세계 좌표계는 ARKit이 기기 주변의 실제 세계를 이해 한 것을 기반으로합니다. (그리고 네, 그것은, oriented to gravity 장치의 동작 감지 하드웨어 덕분입니다.) 기본적으로 또한

    , 당신이 ARKit 세션에서 SceneKit 내용을 표시 할 수 ARSCNView를 사용할 때이 장면의 rootNode가 ARKit 세계에 일치의 좌표계 좌표계. 즉, 장면 공간의 "위로"는 실제 공간에서 "위로"와 항상 동일합니다. 즉, 장치를 아무리 움직여도 상관 없습니다.

    은 제외 : 당신이 upAxis을 발견 scene attributes API는 그들이 생각하지 않습니다. 이는 파일에서로드 된 장면의 고유 설정입니다. 누군가가 3D 저작 도구로 설계된 DAE 파일을 보냅니다.이 도구는 Z 축이 "위로"를 의미하므로 Attribute는 SceneKit에게 SceneKit의 Y-up 좌표 시스템 규칙에 맞게 해당 파일의 데이터를 회전 시키도록 지시합니다. 당신은 세계 공간 일부 SceneKit 노드 상대의 최대 축 찾으려면

    worldUp 또는 simdWorldUp 속성은 당신이 원하는 것입니다. 그러나이 값은과 관련하여 입니다. 세계 공간 자체가 가리키는 방향을 묻는 API는 없습니다. 왜냐하면 그것은 다른 것과 관련된 방향을 의미하기 때문입니다. 세계 공간은 모든 것이 상대적인 "절대적"좌표 시스템입니다. 그래서 당신은 definition에 의지해야합니다.

    이 좌표 시스템의 일치에 대한 중요한 점은 SceneKit을 실 공간에 매우 쉽게 넣을 수 있다는 것입니다. 코드에서 명시 적으로 위치를 지정하지 않았기 때문에 0, 0, 0에 흰색 줄무늬가 표시됩니다. ARKit 세션에서 세션을 시작할 때 0, 0, 0은 장치의 위치이므로 ... 해당 코드를 실행 한 다음 뒤로 물러서서 white stripe을 볼 수 있어야합니다.세계는 고정되어 , 그리고 내 장치/카메라 이동 : 간단히 말해서


    는 ARKit에 대한 좌표 시스템 모델이있다.

    즉, 장치의 현재 위치/방향에 관련된 작업을 수행하려면 카메라 공간으로 변환해야합니다. view.pointOfView는 당신에게 SceneKit 카메라 노드를 제공합니다, 그래서 당신이 할 수있는 ...

    • 해당 노드에 자식 노드를 추가, 그들은 "연결"있을 수 있습니다 :

      당신이 SceneKit와 함께 작업하는 경우, 그것은 쉽게 (예 : HUD 요소 또는 Minecraft를 만드는 경우 Pickaxe)

    • 장면의 다른 콘텐츠를 카메라와 상호 작용하도록 카메라 노드를 constraint의 대상으로 사용하십시오 당신이 그것을 옮길 때 (예를 들어, 게임 캐릭터가 카메라를 보도록)
    • 카메라 노드의 변환 (또는 다양한 장면의 다른 콘텐츠를 배치하기 위해 변형 부분에 액세스하기위한 편리한 속성). node.position = view.pointOfView.simdWorldFront + float3(0, 0, -0.5)은 현재 카메라가있는 위치의 50cm 앞에있는 노드를 드롭합니다)