Tech Sketch Bucket of Technical Chips by TIS Inc.

マーカーをタップすると3Dアバターがしゃべって動くARアプリ 4

Pocket

動画のような「マーカーをタップすると3Dアバターがしゃべって動くARアプリ」について、


第一回 では環境準備について、 第二回 ではAndARの改造ポイントについて、そして 第三回 では改造したAndARを用いた具体的なアプリケーションの実装のうちActivity部分について解説してきました。

最終回の今回は、具体的なアプリケーションの実装のうちアバターの基底となるPlayerBase、及び具体的なアバターを定義するクラスについて解説します。

なおソースコードや設定ファイルの全ては解説していません。実際に動くコードは、Github上に公開された下記リポジトリを参考にしてください。

https://github.com/tech-sketch/AR_Speaker


PlayerBase

では、各アバターの基底となる PlayerBase を見ていきましょう。この抽象クラスは、上記のActivityから呼び出される下記3つの処理を担当しています。

  1. WaveFront形式の3Dモデルファイルを読み込み、ARToolkitが認識できる3Dモデル(edu.dhbw.andobjviewer.graphics.Model3D)を構築して返す
  2. SoundPoolへ音声をロードし、「このsoundIdの登録が完了したよ」という通知へ対処する
  3. 「XXという名前のマーカーがタップされたよ」という通知へ対処する
  4. アニメーション処理(animate)を行う抽象メソッドを定義する

Model3Dを返す

Wavefront形式のオブジェクトモデルは/assets以下に配置されており、また具体的なファイル名は、具象クラスがmodelFileに格納しているという前提です。

実際の処理内容は下記となりますが、

  1. /assets以下から、指定されたファイル名のファイルを読み込む
  2. ObjParserを用い、Wavefront形式のファイルからedu.dhbw.andobjviewer.models.Modelオブジェクトを生成する
  3. Modelオブジェクト、対応するマーカーファイル名などを指定し、edu.dhbw.andobjviewer.graphics.Model3Dオブジェクトを生成して返す

今回は各アバターに独自のアニメーションを行わせるために、Model3Dへanimateというメソッドでフックを掛けています。
Model3Dをインスタンス化するためにはこのanimateの中身を実装しなければなりませんが、その処理をさらに「自分自身のanimateメソッド」へ委譲しなおしています。
(このあたり、少しヘンタイな処理実装ですね)

SoundPoolへ音声をロードする

音声データはres/raw以下へ格納され、リソースIDが自動的に割り振られている前提です。

SoundPoolへ音声データを登録した際に、soundIdが得られます。これをアバターのインスタンス変数へ格納しておくことで、「このsoundIdの登録が完了したよ」という通知が来た際に「自分の音声データのことか?」が判断できます。
自分の音声データが登録された場合に、loadedフラグをtrueにします。

マーカーのタップへ対応する

「XXという名前のマーカーがタップされたよ」という通知へ対処する処理です。

自分のマーカーファイル名は知っていますので、自分のマーカーがタップされた場合に音声を再生(sp.play)しdoAnimateフラグをtrueにします。

アニメーション処理の抽象メソッドを定義する

今回の実装では、具体的なアニメーション処理は全て具象クラスに実装する形を取っています。そのため、animateメソッドは抽象メソッドにしています。
ただしアバターを一律に拡大・縮小するなど、全てのアバターで共通する処理を行わせる場合、このメソッドに具体的な実装を書いても良いかもしれません。

具体的なアバタークラス(Elaine)

最後に、具体的なアバタークラスの実装を確認しましょう。
この具象クラスには、以下の処理を実装しています。

  1. Wavefront形式の3Dモデルファイル名とマーカーファイル名、及び音声データのリソースIDを定義する
  2. 具体的なアニメーション処理を行う

3Dモデルファイル名、パターンファイル名、音声データのリソースIDを定義する

/assets以下に配置したWavefront形式の3Dモデルファイル名とマーカーファイル名、及び/res/raw以下に配置した音声ファイルのリソースIDを定義します。

これらのファイルや音声データを変更することで、任意のマーカーパターンに対して任意の3Dオブジェクトを重畳し、任意の音声データを再生させることができます。

具体的なアニメーション処理を行う

アニメーション処理も、任意に実装してください。
今回の実装では、「doAnimateフラグが立っている場合、マーカー上でアバターがROTATE秒をかけて一回転する」というアニメーションが行われます。

最後に

第一回第二回第三回 、そして今回と、4回に渡って「マーカーをタップすると3Dアバターがしゃべって動くARアプリ」について解説してきました。
ここでご紹介したアイデアを上手く使い、インタラクティブで楽しいARアプリを作っていただければ幸いです。

エンジニア採用中!私たちと一緒に働いてみませんか?