第2章 ARKit 堤 修一/@shu223


 可視化のための処理が入っているため一見複雑に見えるかもしれません。しかし「2点間の距離計算」に関する本質的な実装だけを見ると、とてもシンプルになっています。

画面タップ位置についてヒットテストを行い、結果の3次元座標を「始点」とする

画面タップ位置についてヒットテストを行い、結果の3次元座標を「終点」とする

始点・終点の2点間の距離を計算する

 たったこれだけです。「ARSCNViewのhitTest(_:types:)メソッドによるヒットテスト」でのヒットテストと違う点は、hitTestメソッドのtypes引数に.existingPlaneUsingExtentではなく、.existingPlaneを指定している点です。認識した平面のextent範囲よりも広い範囲で計測できるようにするためです。

 ちなみに3次元座標を表すSCNVector3型の計算をシンプルに記述するために、サンプルでは次のようにextensionおよび演算子を定義しています。

extension SCNVector3 {
    func length() -> Float {
        return sqrtf(x * x + y * y + z * z)
    }
}
func - (left: SCNVector3, right: SCNVector3) -> SCNVector3 {
    return SCNVector3Make(left.x - right.x, left.y - right.y, left.z - right.z)
}

 サンプルの実行画面を図2.14に示します。

図2.14 ARKitを利用した距離の計測結果

 ARKitによる2点間の距離の推定結果は「0.35m」と出ています。計測対象であるMacbook Pro(15-inch,2016)の横幅は、公式情報によると「34.93cm」とのことですので、正確に計測できていることが分かります。

iOS 11 Programming

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