第2章 ARKit 堤 修一/@shu223


 ARAnchorは、そのアンカーを一意に決めるUUID型のidentifierプロパティと、

var identifier: UUID { get }

3D空間における位置と回転(向き)を決めるmatrix_float4x4型(4x4の変換行列)のtransformプロパティを持ちます。

var transform: matrix_float4x4 { get }

ARPlaneAnchor

 ARPlaneAnchorは、ARAnchorのサブクラスです。コンフィギュレーションで平面検出を指定してARのセッションを開始している場合、各デリゲートメソッドで得られる「アンカー」は、平面の位置・向きを特定するためのARPlaneAnchor型で届きます。

func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
    // 平面検出時はARPlaneAnchor型のアンカーが得られる
    guard let planeAnchors = anchors as? [ARPlaneAnchor] else {return}

 ARPlaneAnchorは、平面を表すための中心位置を示すcenterプロパティと、

var center: vector_float3 { get }

大きさ(幅・奥行き)を示すextentプロパティを持ちます。

var extent: vector_float3 { get }

 extentは3次元ベクトルのvector_float3型となっていますが、平面のアンカーは必ず2次元ですので、大きさはx,zだけで決まり、yの値は常にゼロとなっています。

 なお、ARPlaneAnchorは平面のアラインメントを示すalignmentプロパティも持ちますが、

var alignment: ARPlaneAnchor.Alignment { get }

その型であるARPlaneAnchor.Alignmentには現状ではhorizontalしか定義されていないので、将来的にさまざまなアラインメントがサポートされるまで用途はなさそうです。

2.3.3 平面検出に関するイベントをフックする - ARSCNViewDelegate

 ARSCNViewでは、ARセッションでアンカーが追加・更新・削除される際、そのアンカーに対応するノード(SCNNode)も追加・更新・削除されます。そのイベントをハンドリングするためにARSCNViewDelegateプロトコルが用意されています。

 ARSCNViewDelegateプロトコルへの準拠を宣言しておき、

class ViewController: UIViewController, ARSCNViewDelegate

ARSCNViewdelegateプロパティに値をセットしておくことで、

sceneView.delegate = self

次に示すタイミングでARSCNViewDelegateの各メソッドが呼ばれるようになります。

新しいアンカーに対応するノードがシーンに追加された

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)

iOS 11 Programming

  • 著者:堤 修一,吉田 悠一,池田 翔,坂田 晃一,加藤 尋樹,川邉 雄介,岸川 克己,所 友太,永野 哲久,
  • 製本版,電子版
  • 続きを読む