key blog

VR,AR系の開発を行っているエンジニアです。ほとんど自分の備忘録です。

Android 内蔵ストレージのルートディレクトリのパスを取得

Androidアプリで端末内のファイルにアクセスする為にのお話。

Unityで定義されているApplication.dataPathやStreamingAssetsフォルダを使用してもよいが、

”ユーザーに自分で用意したファイルをスマホに入れてもらう”という事を要求する場合わかりやすい階層のほうが良いかと思い方法を調べました。

あと固定値でも良いかと思ったのですが、端末かAndroidのバージョン依存なのかで変わっちゃうみたいなので。
("/storage/emulated/0/"とか"/sdcard0/"とか)

方法は下記の通り。

#if !UNITY_EDITOR && UNITY_ANDROID
        using (AndroidJavaClass env = new AndroidJavaClass("android.os.Environment"))
        {
            using (AndroidJavaObject storageDir = environment.CallStatic<AndroidJavaObject>("getExternalStorageDirectory"))
            {
                _StorageDir = storageDir.Call<string>("getCanonicalPath");
            }
        }
#endif


要はJavaのクラス・関数でそのようなものが用意されているので、それを使うだけです。

(HTC VIVE)ルームセットアップの切替

流行りのHTC VIVEを使って色デモを行う際、

デモ部屋毎に簡単にルームセットアップを切り替えられないものかと思い調べてみたら、

下記ファイルにルームセットアップ情報が保存されているのがわかった。

"C:\Program Files (x86)\Steam\config\chaperone_info.vrchap

 

なので、このファイルを部屋ごとに保存、置き換えをしてあげると、

ちゃんとそれぞれのルームセットアップ情報が適用される。

 

その他にも、例えば同一ルームスケール内で複数のVIVEを使用してVR空間を共有するコンテンツなどでは、

それぞれのPCで同じ"chaperone_info.vrchap"ファイルを持っておくと座標系が一致して便利です。

 

右手座標系⇔左手座標系 座標変換

右手座標系⇔左手座標系の座標変換をするお話

f:id:k-key:20160818140851j:plain

あんまり手番はないかもしれませんが、右手座標系のソフトウェア(例えばMotionBuilderなど)で取得できる位置・姿勢情報を

左手座標系(例えばUnityなど)に適用したい時の変換方法です。

 

■位置

右手(X, Y Z) → 左手(-X, Y, Z)

■姿勢(Quaternion)

右手(X, Y, Z, W) → 左手(-X, Y, Z, -W

(当然ながら左手から右手への変換も同じです)

 

単純なのですが、ネット検索でバシッと出てこなかったので忘れないうちに。

Unity 動画再生

ベタですがUnityで動画を再生する必要があり、

Unity標準機能であるMovieTextureではいまいちだったのでいろいろ調べました。

 

欲しい要素は下記の通り。

・高速

・早・遅送りができる

(ちなみにMovieTextureで早・遅送りしたい場合は、

 シーンにAudio Sourceを追加しVideoの音声をAudio Clipとします。

 そのAudio SourceのPitchを増減することで動画の再生スピードも変わります....

   どういうこっちゃ...)

 

まずネットでよく見かけたのが、AVPro Windows Media

https://www.assetstore.unity3d.com/jp/#!/content/2546

高速で非常に惜しかったのですが、早・遅送りができない...

 

次にMedia Foundationというキーワードで見つけたのが、あたりでした!

MPMP - Multi Platform Media Player

https://www.assetstore.unity3d.com/jp/#!/content/53391

$175と少々高額ですが、Free Trialバージョンもあります

 

高速且つ早・遅送りも可能で要件を満たしています。

更にAndorid/iOS対応、動画ファイルをUnityにインポートする(=エンコードしている為かすんごい時間がかかる)必要が無いというオマケつき。

 

しかも使い方も簡単です。

 

1.適当なGameObjectに"MPMP" Scriptを付与します。

f:id:k-key:20160813204553p:plain

 

2.videoPathに動画ファイルへのパスを記述します。

 動画ファイルがStreamingAssets内の場合、相対パスで記述可。

 その他の場所にある場合はフルパスを記述すれば大丈夫。

 (何れの場合も拡張子まで入力するのをわすれずに)

 

3.videoMaterialに動画の画をレンダリングするマテリアルを指定

 

4."AutoPlay" "Looping"などのオプションはご利用シーンに合わせて変更

 

5.プロジェクトを実行して、"Load"ボタン(→"Play"ボタン:AutoPlayがFalseの場合)を押下すると再生されます。

 各ボタンをスクリプトで実行するには、

 monoflow.MPMP.Load(), monoflow.MPMP.Play()など。

-- 以上、ちょうかんたん♪

 

Androidでも試してみたのですが、元気に再生しますw

Androidでの注意点は、私が所持している端末(Xperia Z4, Galaxy  S6)のせいかもしれませんがOpenGL ES2.0じゃないと上手くレンダリングしてくれませんでした。

(マニュアルには3.0 or 2.0との記載がある)

 

草々