第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
ARSCNViewのdelegateプロパティに値をセットしておくことで、
sceneView.delegate = self
次に示すタイミングでARSCNViewDelegateの各メソッドが呼ばれるようになります。
■新しいアンカーに対応するノードがシーンに追加された
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor)