こんちにちはmorimori(@TatsunoriMorita)です。
前回の続きで現実世界にオブジェクトを置くことができました。
ただし現実世界のX座標、Y座標、Z座標にオブジェクトを置いているだけなので、空中に浮いた状態となっています。
今回はARKitの平面認識機能を使って、認識した平面に、重力で落下するオブジェクトを置いてみます。
オブジェクトに重力を持たせる
SCNNodeのSCNPhysicsBodyプロパティに、物理的な形状の情報を設定すれば、物理演算の対象になります。
SCNNodeには大きく分けて、GeometryとSCNPhysicsBodyという、2つの構成があります。
Geometryには、四角や丸などの3Dオブジェクトの情報を持っており、SCNPhysicsBodyには、物理的な形状や重力などの物理シュミレーションのための情報を持っています。
つまり、四角形オブジェクトを追加しているSCNNodeに対して、SCNPhysicsBodyプロパティで重力設定をして上げればいいということになります。
追加したコードは一行だけになります。
Typeをdynamicにすることで、四角形オブジェクトに重力が加わるように設定しています。
ビルドしてアプリを実行してみると、タップして生成された四角形オブジェクトが、重力の力で奈落の底まで落ちていくのが分かります。
オブジェクトに重力設定したら、奈落の底まで落ちて行く〜
— TatsunoriMorita (@king_of_morita) 2018年12月5日
次は平面検知してオブジェクトが止まるようにしよう#AR #ARKit pic.twitter.com/21pqIXpwEM
平面認識した場所にオブジェクトを置く
重力を持たせたオブジェクトは、衝突するものがなければ永遠に落下をしていきます。
ここでは、ARKitの機能で認識した平面に対してプレートを配置して、重力をで落下するオブジェクトが衝突すると、プレートオブジェクトの上で止まるように改良します。
仕組みとしては、平面認識で取得したanchorの位置と、大きさに対応したプレートオブジェクトを持ったSCNNodeを生成し、衝突判定を加えたものをフレームが更新される毎に位置とサイズを補正させます。
アプリを実行すると認識された平面に対して、緑色のプレートオブジェクトが生成され、その上に四角形オブジェクトが置けます。
現実世界で平面認識したところ(分かりやすく緑に塗ったところ)に、重力を持たせた仮装オブジェクトを置くことができたぜ!!#AR #ARKit pic.twitter.com/7vhICxabpJ
— TatsunoriMorita (@king_of_morita) 2018年12月8日
今回のコードの全文をGithubにアップしています。
まとめ
四角や丸などのオブジェクトをSCNNodeにセットし、それを画面のSceneに貼り付けているイメージになります。
今回のような物理判定は、SCNNodeのSCNPhysicsBodyプロパティでいろいろ変更できるので、使いこなせるようにしましょう。
次回は四角形オブジェクトの落下スピードを変更してみたいと思います。