Edited at

GCPとARKitのマルチプレイ機能でコエカタマリン/ほんやくこんにゃくを作ってみた


はじめに

こんにちは、drama(@1901drama)です!

今回はARKitのマルチプレイ機能を実装したアプリを作ったので、簡単に紹介します。

※記載間違い等あれば教えてください。


出来たもの

色んな人とコミュニケーションをとるのにARを使うと面白そう!という考えから、

ドラえもんに出てくる「コエカタマリン」と「ほんやくこんにゃく」を合わせたようなアプリを作りました。


 ・発言した言葉をオブジェクトとして可視化

 ・衝突判定(オブジェクトは、壁・床・言葉にぶつかると爆発します。)

 ・英語 ⇔ 日本語の翻訳

 ・他のユーザーとオブジェクトを共有できるマルチプレイモード ※精度が安定しないので改善中

↓奥の端末から手間の端末に、

 日本語で「こんばんは」「明日は晴れです」と言ったものを翻訳して飛ばしてます。

パブリッククラウド(GCP)も使ったので、処理をざっくり図にまとめました。

尚、翻訳機能には「 Google Translate API in Swift 」を利用させて頂きました。超簡単!


難しかった点

もし同じように初心者から始める人向けに、開発で特にはまった点を書いておきます。

空間共有

自分の端末だけであれば、ARkitがある程度よしなに場所を管理してくれるのですが、

他の人と共有するとなると、共通の基準=原点が必要になります。

今回は、共有するときの始めに原点を相手に送信し、その後に配置するオブジェクトは、原点からの差分で割り出した座標を都度共有するという方法をとってます。(参考リンク内のパターンC)

難しかったのは送信方法でしたが、そもそも座標の考えについてまだ深く理解出来ていないので、もう少し勉強必要です。かつ、共有精度が不安定なので現在、改善中。


参考: ARKitで空間共有して端末間通信する方法22選


衝突判定

全く知らなかったのですが「衝突は各オブジェクトにマスク値を与えて判定している」そうです。

3Dデザインを全くしたことがなかったので、驚きの実装方法でした。

同じゲームや空間の中でも、

「0001(1)の属性をもつオブジェクト」と「0010(2)の属性をもつオブジェクト」は、住む世界(桁)が違う為、衝突しないということです。※例はやや適当ですが...


参考: SceneKitにおける物体衝突検知を理解する



まとめ

ARKitよりもSCNノードに苦戦することが多いので、3Dデザインやエフェクトに詳しくなりたいです。

また、GCPは普段から使っているようなAPIが充実してるうえに、簡単に導入出来るのが素晴らしいです。

ここまで読んで頂きありがとうございました!

今回のアプリはリリース済みですので、宜しければ感想聞かせてください!

VOICE (@AppStore) ※随時アップデートしていきます。