前回は平面検出後に、平面上の位置を指定せずに3Dモデルを置きました。

今回はARSCNViewのhitTestメソッドを利用して検出した平面上の任意箇所をタップで指定して、3Dモデルを置いてみます。

※平面検出は前回の記事参照
https://techpartner.jp/blog/plain-detection-and-3d-object

ARSCNViewのhitTestについて

ARSCNViewに用意されているhitTestメソッドを利用する事で、現実世界に配置されたARアンカーの位置を取得する事が可能です。
第1引数で検知する2D座標軸、第2引数で検出タイプを指定します。

  • パラメータ
    • 第1引数はCGPoint(2D座標軸)
    • 第2引数はARHitTestResult.ResultType(検出タイプ)
  • 戻り値:
    • ARHitTestResult型の配列。※結果はカメラから近い順にソートされます
      • .worldTransform: simd_float4x4型 (4×4の変換行列)

※参考
https://developer.apple.com/documentation/arkit/arscnview/2875544-hittest

ARHitTestResult.ResultType(検出タイプ)

第2引数に指定するARHitTestResult.ResultTypeの種類は下記の通りです。

  • featurePoint (特徴点)
    • 平面に限らず最も近い検出した特徴点の位置を返す
  • estimatedHorizontalPlane (推定の水平面)
    • 推定した水平面の位置を返す。検出時間は短いメリットはあるが、あくまで推定なので精度が高くない。
  • estimatedVerticalPlane (推定の垂直の平面)
    • 推定した垂直面の位置を返す。検出時間は短いメリットはあるが、あくまで推定なので精度が高くない。
  • existingPlane (検出した平面 + 平面サイズを考慮しない)
    • 検出した平面の位置を返す。平面サイズを考慮しない為、検出した平面の延長線上であれば、現実世界で平面でなくとも対象となる。
  • existingPlaneUsingExtent (検出した平面 + 平面サイズを考慮する)
    • 検出した平面の位置を返す。平面サイズを考慮するので、現実世界の平面のみ対象にできる。
  • existingPlaneUsingGeometry (検出したジオメトリ + 平面サイズとカタチを考慮する)
    • 検出したジオメトリを対象とする

今回は、existingPlaneUsingExtentを使用する。

※参考
https://developer.apple.com/documentation/arkit/arhittestresult/resulttype

hitTest(_:types:)を平面検出コードに組み込む

実行!

黒ビールが飲みたくなってきました…。

※本記事はプロダクト実装を前提とした内容でないので、コードの利用は自己責任でお願いします!