ぬるぽ

ゆるくプログラミングなどを語っていくブログ

ARKit入門 その4

f:id:nooootion:20181215091323p:plain

 

 

こんちにちはmorimori(@TatsunoriMorita)です。

  

前回の続きで現実世界にオブジェクトを置くことができました。

ただし現実世界のX座標、Y座標、Z座標にオブジェクトを置いているだけなので、空中に浮いた状態となっています。

www.nullnullpon.com

今回はARKitの平面認識機能を使って、認識した平面に、重力で落下するオブジェクトを置いてみます。

 

 

オブジェクトに重力を持たせる

SCNNodeSCNPhysicsBodyプロパティに、物理的な形状の情報を設定すれば、物理演算の対象になります。

SCNNodeには大きく分けて、GeometrySCNPhysicsBodyという、2つの構成があります。

Geometryには、四角や丸などの3Dオブジェクトの情報を持っており、SCNPhysicsBodyには、物理的な形状や重力などの物理シュミレーションのための情報を持っています。

つまり、四角形オブジェクトを追加しているSCNNodeに対して、SCNPhysicsBodyプロパティで重力設定をして上げればいいということになります。

f:id:nooootion:20181215090331p:plain



追加したコードは一行だけになります。

Typedynamicにすることで、四角形オブジェクトに重力が加わるように設定しています。

f:id:nooootion:20181215090406p:plain

 

 

ビルドしてアプリを実行してみると、タップして生成された四角形オブジェクトが、重力の力で奈落の底まで落ちていくのが分かります。

 

 

平面認識した場所にオブジェクトを置く

重力を持たせたオブジェクトは、衝突するものがなければ永遠に落下をしていきます。

ここでは、ARKitの機能で認識した平面に対してプレートを配置して、重力をで落下するオブジェクトが衝突すると、プレートオブジェクトの上で止まるように改良します。

仕組みとしては、平面認識で取得したanchorの位置と、大きさに対応したプレートオブジェクトを持ったSCNNodeを生成し、衝突判定を加えたものをフレームが更新される毎に位置とサイズを補正させます。

f:id:nooootion:20181215090748p:plain


  

アプリを実行すると認識された平面に対して、緑色のプレートオブジェクトが生成され、その上に四角形オブジェクトが置けます。

 

 

今回のコードの全文をGithubにアップしています。

github.com

 

まとめ

四角や丸などのオブジェクトをSCNNodeにセットし、それを画面のSceneに貼り付けているイメージになります。

今回のような物理判定は、SCNNodeSCNPhysicsBodyプロパティでいろいろ変更できるので、使いこなせるようにしましょう。

次回は四角形オブジェクトの落下スピードを変更してみたいと思います。