第2章 ARKit 堤 修一/@shu223
表2.5 ARPointCloudのプロパティ一覧
プロパティ |
型 |
説明 |
points |
[vector_float3] |
各点の3次元座標 |
identifiers |
[UInt64] |
各点のID |
点群情報からIDが得られることからもわかるように、各特徴点はフレーム毎に別々のものとして抽出されるのではなく、フレームをまたがって同じ特徴点には同じIDが割り振られます。
これまでの節で、現実世界の平面を検出し、仮想オブジェクトを設置する方法を学びました。これでカメラに映る現実世界の中に、仮想のオブジェクトを「表示する」ことができるようになったわけですが、次のステップとしては、それらの仮想オブジェクトに対してユーザーが何らかの「操作」を行えるようにしたくなるのではないでしょうか。
たとえば買い物ができるARアプリであれば、商品としての仮想オブジェクトをタップで選択できるようにしたいでしょう。現実の部屋に仮想の家具を設置できるアプリであれば、その家具をドラッグして動かしたり、ピンチイン / アウトで縮小や拡大ができるようにしたくなるでしょう。
このように、ユーザーのアクションに対してAR側に何らかの応答をさせる、すなわち「インタラクション」を実現するためのARKitの機能や実装方法について解説します。
サンプルコード: 06_ARInteraction
2.7.1 ヒットテスト(当たり判定)を行う
ユーザーからの操作を受けて何らかの応答を行うには、「その操作がシーン内のどのオブジェクトに向けられているものなのか」を知ることは不可欠です。そのために「ヒットテスト」(当たり判定)を行います。
ユーザーが画面内のある位置をタップしたとします。UIが2Dであれば、デバイスのスクリーンも、描画されているUIもどちらも2次元座標で扱えるのでヒットテストのロジックは非常にシンプルです。しかし対象が3D空間である場合は、2Dのスクリーンに対する操作を3D空間に対する操作として考える必要があるため、ヒットテストの計算は2Dのときほどシンプルではありません。
本項ではこのヒットテストの実装方法について解説します。
■ARSCNViewのhitTest(_:types:)メソッドによるヒットテスト
ARKitでは3D空間に対するヒットテストを簡単に行うための仕組みが用意されています。そのうちのひとつが、ARSCNViewのhitTest(_:types:)メソッドです。第1引数に2D座標(ここではスクリーン内のタップされた座標)、第2引数には「ヒットテスト結果のタイプ」を指定します。
func hitTest(_ point: CGPoint, types: ARHitTestResult.ResultType) -> [ARHitTestResult]
「ヒットテスト結果のタイプ」はARHitTestResult.ResultType型で、表2.6に示す4タイプが定義されています。注22)