LoginSignup
10
6

More than 5 years have passed since last update.

FirstVRで遊ぶ チュートリアル編

Last updated at Posted at 2018-10-27

はじめに FirstVRとは

FirstVRとは、H2L社さんが開発・販売されている筋変位を使ったコントローラ付属のVRデバイスです。
腕に専用のデバイスを装着し、筋肉の動きを測定することで手や腕の動きをコントローラ入力にしてしまおうという結構画期的なデバイスです。

現在、VRで指や腕の動きを取ろうとするとナックルコントローラや大掛かりなモーションキャプチャースーツが必要でした。
このFirstVRなら腕に専用のセンサを巻くだけで指の動きが取れるようになるため、VRゲーム実況などに応用できるのではないかと思います。

今回はこのFirstVRを手に入れたので、チュートリアルをやって動かしてみました。

動かすまでの流れ

1.ファームウェアアップデートする

まずはFirstVRのファームウェアアップデートをやります。
やり方は公式サイトで解説されています。
なお、ファームウェアアップデートはiOSからやったほうが楽です

iOS
専用アプリをインストールして

iOS
firmwareの項目を選び、コントローラとペアリングしたあとにアップデートを押せば終わりです。

なお、Androidからのファームウェアアップデートはトライして挫折しました。
(Androidでのやり方の説明なのに、iOSを使って解説されており差異がある部分でわからなくなる。)

2. Unity SDKダウンロードする

FIRST VR Developer Centerという開発者向けサイトからSDKをダウンロードします。
ダウンロードにはアカウント登録が必要です。

image.png

3. Unityプロジェクトにインポートする

今回はせっかくなので、この記事執筆時点で最新版の「Unity 2018.3.0b7」でプロジェクトを作成しました。

SDKのインポートですが、zipを解凍すると「Assets」と「ProjectSettings」がそのまま出てくるので、これをUnityProjectにD&Dします。
image.png

そうするとPlayerSettingsも当然上書きされるので、SDK導入後にお好みで調整してください。

image.png
(.NET 4.Xにだけ切り替えた)

4. ビルドして実機転送する

FirstVRはEditor上でのデバッグに対応していません。
そのため、動作確認にはiOS/Android向けにビルドして実機で確認する必要があります。

とりあえず、何も考えずにサンプルシーンだけ含めてビルドしてみます。
今回はAndroid(Galaxy S8)で動作確認してみます。

image.png

そしてビルドが終わり、実機で動作確認しようとすると、アプリが落ちました。

image.png

5. そのままでは動かないので修正する

強制終了してアプリが立ち上がらないので、Debugビルドして、Android Device Monitorで何が起きているのか確認します。

f1.png

Didn't find class com.unity3d.player.UnityPlayerProxyActivity 的なエラーが起きています。
そもそも、com.unity3d.player.UnityPlayerProxyActivityは、かなり昔(Unity 5系)あたりで非推奨となったActivityで、Unity 2018.1の時点で削除されています。
(Unity 2018.1.0b13 リリースノート)

ということで、FirstVR SDK付属のAndroidManifestファイルが古いのが原因なのでこれを修正します。

AndroidManifestの修正

Assets\Plugins\Android\AndroidManifest.xml を書き換えます。

変更前(20-44行目)
    <application
        android:theme="@style/UnityThemeSelector"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true">
        <activity android:name="com.unity3d.player.UnityPlayerProxyActivity"
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.unity3d.player.UnityPlayerActivity"
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
        </activity>
        <activity android:name="com.unity3d.player.UnityPlayerNativeActivity"
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <meta-data android:name="android.app.lib_name" android:value="unity" />
            <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
             <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
        </activity>
    </application>
変更後
  <application
        android:theme="@style/UnityThemeSelector"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name"
        android:debuggable="true">
        <activity android:name="com.unity3d.player.UnityPlayerActivity" 
                  android:label="@string/app_name"
                  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

これでビルドすると、無事に起動するようになります。

image.png

追記:FirstVRの方とコンタクトを取り、SDKの方を修正してもらえることになりました。

6. 実機で動作確認

まず、コントローラを腕に装着します。
image.png

その後、コントローラとAndroid端末を接続するのですが、注意点があります。ペアリングは必要なく、コントローラを起動して端末に近づければ接続されます。
クイックスタートガイドの下の方に詳しく書いてあるので良く読みましょう。

Q3. FirstVRコントローラと使用しているスマートフォンが接続されません。
A3. 以下点をご確認いただきますようお願い申し上げます。ご確認の上、ご不明点がございまいしたらお問い合わせ窓口までご連絡をお願い致します。

[コントローラ接続の確認点]
1.お使いの端末がiPhone6S以降またはAndroid6.0以降である。
2.お使いの端末のBluetoothがver. 4.2である。
3.コントローラとスマートフォンはペアリングの必要はございません。スマートフォンのBluetoothをオンにする→コントローラの電源を点ける→アプリを立ち上げる→コントローラをスマートフォンに近づける→接続完了します。

[Androidをお使いの方へ]
AndroidでFirstVR Bluetooth接続できない場合の対処法
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「設定」→「位置情報」→メニュー(縦3つのドット)→「スキャン」からBluetoothのスキャンをオフにする
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

「位置情報のBluethoothをOFFにする」がポイントかも。

また、端末とコントローラの接続はBLEを用いているとのことです。
そのため、端末のアンテナ部分とコントローラの距離を可能な限り近づけることが接続を安定させるコツだそうです。
(電波強度を用いて端末間の距離を計測し、ペアリングするか判断している模様。)

動作の様子

image.png

サンプルアプリで取れるパラメータ

  • 腕の角度
  • 腕の加速度(絶対値)
  • 腕の速度(絶対値)
  • 腕全体の方角(起動時を正面として、腕が身体の正面、上、下、右、左、後ろのどこに回り込んだか)
  • 腕の状態(腕の面がどこを向いているか)
  • 腕の動き(スワイプ、シェイク)
  • 各筋変位センサのパラメータ

まとめ

  • ファームウェアアップデートはiOSからやったほうが圧倒的に簡単
  • アプリとコントローラの接続はコツが必要
  • UnityEditor上で動作確認できず、実機ビルドが必要。

動作確認のたびに実機ビルドは流石に厳しいので、UnityEditor上でデバッグできるようになるのを期待。

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6