こんちにちはmorimori(@TatsunoriMorita)です。
前回はXcodeにデフォルトで登録されている、ARアプリ開発用のテンプレートを作成して、そこに書かれているコードを見ていきました。今回はその続きで、画面のタップ位置から現実世界の座標を取得してみます。
作業内容
1.StoryboardにTapGestureRecognizerを追加して、画面をタップした際に呼ぼれるメソッドを登録する。
2.1で登録したメソッドの中で、ARSCNViewのhitTest(_:types:)を使用して、
現実世界のオブジェクト、またはARAnchorを検索して現実空間の座標を取得する。
https://developer.apple.com/documentation/arkit/arscnview/2875544-hittest
3.タップした現実世界の座標にオブジェクトを置く。
1.TapGestureRecognizerの追加
storyboardでTap Gesture Recognizerを検索してUIViewcontroller にドラッグアンドドロップして追加します。
メソッド名は何でもいいですが、ここではtapとしました。
2.現実世界の座標を取得
タップした位置の現実世界の座標を取得して、ログ表示するコードを追加しました。
hitTestメソッドのtypesで取得方法を変更できるようですが、良くわかりませんw
(アンカーに依存せずに座標を取得する場合はfeaturePoint、平面のアンカーと交差する点を取得したい場合はexistingPlaneUsingExtentを使用するようです。)
カメラから出る赤外線?がタップした直線上にあるオブジェクトやARアンカーを配列で返すため、ここでは配列の要素の先頭にある値を取り出して使用しています。
アプリを実行して、画面をタップすると現実座標がログに表示されました。
3.タップした現実世界の座標にオブジェクトを置いてみる
2.でタップした現実世界の座標が取得できたので、その座標を使用してオブジェクトを置くコードを追加しました。
また、デフォルトで表示されるshipのオブジェクトは表示しないように変更しました。
アプリを起動するとタップした場所に四角形のオブジェクトが置けます!
https://twitter.com/king_of_morita/status/1068751497054187521
まとめ
現実世界の情報が使えるようになると、ARでできる幅が広がりますね。
今のままだと、空中にオブジェクトを置いているだけなので、次は床の平面を認識して、落下するオブジェクトが床の平面に衝突して置けるようにしたいと思います。