littlewing

人間とコンピューターとメディアの接点をデザインするために考えたこと

HoloLens のUnityアプリで、UWP AppPackageビルド後のバージョンを取得する

UnityのApplication.versionだと、PlayerSettingsのバージョンになってしまう。

AppPackage作成時のインクリメントに対応するには別の方法で取得しないといけない。

そう、こんな感じで

#if !UNITY_EDITOR && UNITY_WSA
using Windows.ApplicationModel;
#endif


private static string GetVersionInfo()
{
#if !UNITY_EDITOR && UNITY_WSA
    Package package = Package.Current;
    PackageId packageId = package.Id;
    PackageVersion version = packageId.Version;

    return string.Format("{0}.{1}.{2}.{3}", version.Major, version.Minor, version.Build, version.Revision);
#else
    return Application.version;
#endif

}

Unityで4つの点から球の中心と半径を求める(内包or面する場合)

空間上で複数の座標から球の中心と半径を求める必要があったので調べてみた。

球を特定するには最低4つの点が必要。

その1.全ての点が球の表面(外接)となる球を求める

f:id:pigshape:20180916143921p:plain

センサー値から回転軸を求める場合に使えるかも。(というかその為に考えた)

gist.github.com


その2.すべての点を内包する最小の球を求める

内包する場合は、一部の点は球の内側に存在する場合がある。

f:id:pigshape:20180916144327p:plain

gist.github.com


両方とも自力では難しかったので、元ネタのコードをUnity/C#に移植しただけですが。

Oculus GO アプリで、マイクのパーミッションが出ないようにする

UnityでOculus Go アプリを開発していたら、マイクを利用していないのに起動時にマイク利用許可のパーミッションが表示される。

そのままでOculusの審査に出したら、リジェクトされてしまった。

OverView: The app must request the minimum number of permissions required to function.

Result: Your app is asking for excessive user permissions or using user permissions inappropriately. -Access Microphone Please remove all unnecessary permissions.

microphoneを利用する処理は書いていないし、 Assets/Plugins/Android/AndroidManifest.xml

<uses-feature android:name="android.hardware.microphone" android:required="false" />

追記しても変化無し。


apk内のManifestがどうなっているか調べてみる。

Unityで作成したAndroidアプリにおいて、最終的なmanifestの内容は、ソースコードの中身などから生成されるらしいので、 apk内のManifestがどうなっているのか調べてみる。

Android SDKに含まれている aaptというコマンドで調べられるらしい。

aapt.exe は

C/Users/{Username}/AppData/Local/Android/Sdk/build-tools/28.0.1/

にあった。

実行してみると

$ ./aapt.exe d permissions hogehoge.apk AndroidManifest.xml

package: jp.hoge.hoge
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='android.permission.RECORD_AUDIO'

となり、RECORD_AUDIOが付与されてしまっている。

調べてみると、フォーラムにも同様の症状が。

結果的に、以下の対応をして解決。

  1. 以下6個のファイルを削除
    • Assets/Oculus/Platform/Scripts/IMicrophone.cs
    • Assets/Oculus/Platform/Scripts/LivestreamingMicrophoneStatus.cs
    • Assets/Oculus/Platform/Scripts/MicrophoneInput.cs
    • Assets/Oculus/Platform/Scripts/MicrophoneInputNative.cs
    • Assets/Oculus/LipSync/Scripts/OVRLipSyncMicInput.cs
    • Assets/Oculus/VoiceMod/Scripts/Helpers/OVRMicInput.cs
  2. CAPI.csでエラーが出るので、該当箇所(Livestreamingなんちゃら) をコメントアウト
  3. 再ビルド

Oculus Goのストア申請に役に立ったリンク集

Unreal Engine関連リンク

自分メモ。 いかん。全部忘れてる。

Unity開発者向けUnrealEngineガイド

Hololens Template for Unreal Engine 4

HoloLensでXbox One用のゲームパッド2-その後

以前、HoloLensでXbox One S のゲームパッドを使う方法を書きましたが、 その時の課題の解決方法のがひとまずわかりました。

元記事はこちら

littlewing.hatenablog.com

この記事ではUnityのInputManagerを利用してキーを取得する方法を試したのですが、 XboxコントローラーのDPadと右スティックの入力が取得できませんでした。

その後の調べで、Windows.Gaming.Inputを利用してコードを書いた場合は、両方とも取得できました。ただし、Editor上では動きません。 まとめると

取得方法 HoloLens(UWP)で
DPad・右スティックが
使えるか?
Unity Editor上で
取得できるか?
UnityのInputManager 使えない 動く
Windows.Gaming.Input 使える 動かない

こんな感じ

調べた範囲での話です。

【Unity 2018.2の新機能】デスクトップのUWPアプリからHolographic Remotingを呼び出す。(サンプルコード付き)

f:id:pigshape:20180609210102p:plain

Unity 2018.2の新機能である、 「Windows 10PC用のUWPアプリからHolographic Remoting を呼び出す」 を試して、無事に動作させる事ができました。

個人的にずっと待っていた機能です。

PCの高速な処理能力と 64bitのライブラリを利用したHoloLensアプリケーションの開発が可能となりました。

けどUWPです。

元のUnityのブログはこちら blogs.unity3d.com

Holographic Remotingについてはこちら。 (古い記事ですが、この一年でそんなに変化無いです)

littlewing.hatenablog.com

何ができるのか?

  • PC上でアプリの実行・レンダリングを行い、その内容をHoloLensで表示します。
  • 当然、HoloLensの動き・向きに追随して映像は変化します。
  • これまでも、UnityEditorの機能としては存在していたのですが、主にデバッグ用途だったのですが、これがビルド済みアプリからも呼び出せるようになりました。
  • 64bitビルドで動くので、アプリケーションはx86ではなく、64bit用として開発できます。(これが地味にうれしい)
  • PCとHoloを連携させたアプリが作りやすくなりそう。

動作デモ動画と解説

PC上のUWPアプリとしてCubeが回転しているだけのサンプルアプリを動かします。 左上にIPアドレス入力欄とConnect/Disconnectのボタンがついています。

f:id:pigshape:20180609204839p:plain

HoloLensではHolographic Remoting Playerを起動し、 PCアプリケーションにそのIPを入力して「Connect」を押すと、HoloLens上にCubeが回転する映像が表示されます。 「Disconnect」でHoloLensへの映像出力は停止します。

動いている様子を動画で撮影しました。

youtu.be


開発環境とサンプルコード

Unity Blogにあるように、Unity2018.2.b7を利用しました。

BuildSettingsに「Enable Mixed Reality Remoting」というcheckboxが追加されています。

f:id:pigshape:20180609205459p:plain

そしてHoloLensで動くようなSceneを作成します。 今回はMRTKは使わず、

  • Cameraの位置は(0,0,0)。背景黒・Near Clip 0.1
  • 1.5メートル先に scale0.2のCubeを設置。Constant Forceで回転

という簡単なシーンを作成しました。

その後、空のGameObjectを作成し、以下のRemoteExample.csを作成してattachします。

gist.github.com

で、上の図にあるようなUWP用のBuildSettingsでビルドしてVusialStudioのソリューションを生成します。

このコードはUnityのDocumentにあったコードを少しいじっただけです。

これを64bitアプリケーションとして「ローカルコンピューター」で実行しました。 f:id:pigshape:20180609211246p:plain

ハマったこと

最初動かなくて、困ったのですが、 以下の対応をしていたら動くようになりました。 実際の原因がはっきりわかってないのが情けないですが、、、

  1. PCにHoloLensのエミュレーターが入っていなかったのでインストールしました。

    • Unityブログのそのような記載があったため、
    • VSでの実行時に、Microsoft.Perception.Simulation.DLLが64bitじゃないという警告が出ていたから。(結局これは消えませんでした)
    • HoloLensのエミュレーターのインストール・再起動後、Unityのtoolbar のWindowのメニュー構成が変わりました。Holographic EmulationがXRの中に。気のせい? f:id:pigshape:20180609212158p:plain
  2. PlayerSettingsのCapabilitySettingsに全部チェックを入れた。ガバガバですみません。(どれが有効だったのか、今の所わかってません。)


動作の安定性は Unity Editor上のHolographic Emulationと同じくらいかな。

また、今までもそうでしたが、音声周りやカメラ周りの挙動は異なります。

Known Limitations Speech (PhraseRecognizer) isn’t currently supported via Holographic Remoting and instead intercepts speech from the Editor-hosted machine.

PhotoCapture can be performed during Holographic Simulation, but since the capture works via a local camera (such as a webcam), you won’t be able to retrieve a matrix with TryGetProjectionMatrix or TryGetCameraToWorldMatrix.

During Remoting, all audio on the hosted PC (not just that from the app) will redirect to the device. (Unity blogより引用)

ただ、今までのUnity Editor上でのRemoting はUWPではなく、Windows StandAloneのコードが動いていたのですが、UWPビルド後なので、当然UWPのコードが動きます。ここは違いがありますね。


終わりに

待ちに待った機能です。やったー

PCの高速GPU処理や64bitライブラリの恩恵を受けられるアプリケーションをいろいろ試してみたいと思います。


M5GOのfirmwareをM5Stack用に書き換える(+戻し方)

M5Stack の別バージョンであるM5GOが届いたので遊んでみました。

ただ、そのままの状態だとネット上のM5Stack関連リソースがそのまま使えなかったり、 なんとなく怪しい挙動が多かったので、FirmwareをM5Stack用に切り替えたり、 M5GOの最新版のfirmwareを入れてみたのでその手順をメモ。

firmwareの書き換え方がわかると、リセットしたい時や バージョンアップにも自分で対応できるので安心です。

基本Windows10の話です。

f:id:pigshape:20180521150250p:plain


事前準備

  1. USBドライバのインストール

    • M5GOをPCにUSB接続しただけでは正常にドライバが入らなかったので、M5StackのサイトからUSBドライバをインストールしました。
    • m5stack.comのページ上部のDownloadメニューからダウンロードできます。
    • f:id:pigshape:20180521151028p:plain
  2. Espressif Flash Download Toolsのダウンロード

    • firmwareの書き込みには、Espressif Flash Download Toolsを利用しました。
    • ここからダウンロードできます。Espressif Flash Download Tools
    • 解凍して、ESPFlashDownloadTool_v3.6.4.exeを起動し、ESP32 DownloadTool を選択します。

M5Stackのfirmwareを入れる

M5GOにM5Stackを入れる場合は、githubからM5stack用のfirmwareを入手します。

今回は、ここから、m5cloud-20180516-v0.4.0.binを入手しました。

M5Cloud/firmwares at master · m5stack/M5Cloud · GitHub

ダウンロード出来たら、Espressif Flash Download Toolsに以下のように登録します。 f:id:pigshape:20180521151950p:plain

COMポートはCOM3になっていますが、環境によりますのでWindows のデバイスマネージャで調べて適宜変更してください。

そして、M5GOをUSBでPCに接続し、最初にERASEをして完了してから STARTを押してFirmwareを書き換えます。

これで環境。M5Cloudが使えるようになります。

M5GOのfirmwareに戻す

M5GOのfirmwareも同様に github上にあります。M5GOの場合は、イメージファイルも同時に書き込む必要がありました。

ここから、最新版の M5GO/firmware at master · m5stack/M5GO · GitHub

  • firmware.bin
  • spiffs_image.img

をダウンロードして それぞれ書き込み位置を@0x1000 @0x1b000としてアップロードします。

f:id:pigshape:20180521145934p:plain

これで元の状態に戻りました。


試しにM5Cloud上からmicropythonを使ってデジタル時計を組み込んでみた。

github上のサンプルだと中国時間になってしまうので、JSTに変更しただけ

Digital Clock on M5stack JST

gist.github.com


Lego Crazy Action Contraptions

Lego Crazy Action Contraptions