2017-09-27 32 views
1

ARKitについてのAppleのガイドをすべて読んで、WWDC videoを見ました。しかし、私は、バインドされている座標系でください方法を理解することはできません。ARKitの座標空間を理解する

  1. 現実世界
  2. デバイス
  3. 3Dシーン

はお互いに接続します。

私はたとえばSCNPlaneのために、オブジェクトを追加することができます。

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軸は「上向き」を意味し、属性はSceneKitにそのファイル内のデータを回転させてSceneKitのY-up座標システムの慣習に合うように指示します。

あなたはワールド空間にはいくつかのSceneKitノードの相対的なアップ軸を見つけたい場合は、worldUpまたはsimdWorldUpプロパティが何をしたいです。しかし、それらはに比べてです。世界空間自体がどの方向を指しているのかを尋ねるAPIはありません。なぜなら、それは他のものと相対的な方向を意味するからです。そして、世界空間は他のすべてが相対的な "絶対的な"座標系です。だからあなたはdefinitionに頼る必要があります。

この座標系のマッチングに関する素晴らしい点は、SceneKitのものを実際の空間に非常に簡単に配置できることです。コードでは、明示的に位置を指定していないため、0, 0, 0に白い縞模様が表示されます。 ARKitセッションでは、セッションを開始したときのデバイスの位置は0, 0, 0です。そのコードを実行してから、ステップを逆戻りしてwhite stripeを確認できるはずです。要するに


、ARKitの座標系モデルがこれです:世界は固定されており、その中のデバイス/カメラが移動。

これは、デバイスの現在の位置/向きに関連して何かしたい場合は、カメラスペースに変換する必要があることを意味します。

あなたはSceneKitで作業している場合、それは簡単です:あなたは...

  • は、そのノードに子ノードを追加することができ、それらは「添付」滞在されますのでview.pointOfViewは、あなたにSceneKitカメラノードを与えます(例えば、HUD要素、またはMinecraftを作成する場合はピックアックス)
  • カメラノードをconstraintのターゲットとして使用して、シーン内の他のコンテンツをカメラと相互作用させますあなたがそれを動かすと(例えば、ゲームキャラクターにカメラを見せるように)
  • カメラノードの変換シーンの他のコンテンツを配置するために、トランスフォームの一部にアクセスするための便利なプロパティ)。 node.position = view.pointOfView.simdWorldFront + float3(0, 0, -0.5)は、現在のカメラの位置の50cm前のノードを落とす)
関連する問題