littlewing

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

Quouaternionを使って、オブジェクトの回転と位置を一致させる

2つのGameObjectツリー同時の座標系を合わせるために、親要素を動かすためのメモ

    /// <summary>
    /// Transform同時の位置と回転を合わせるために、親要素のTransformを動かす
    /// </summary>
    /// <param name="target">基準となるTransform</param>
    /// <param name="move">targetと一致させたいTransform</param>
    /// <param name="moveParent">実際に移動・回転するmoveの親となるTransform</param>
    void AdjusTransform(Transform target,Transform move,Transform moveParent)
    {
        //回転処理

        //moveのrotationが、targetのrotationと同じになるようにするための差分のクオータニオンを取得
        //差分のquotanionを取得するには、逆のクオータニオンを掛ける
        var requiredRot = target.rotation * Quaternion.Inverse(move.rotation);

        //親オブジェクトを回転させる場合は requiredRotに対して、markerParent.transform.rotationをかける
        moveParent.transform.rotation = requiredRot * moveParent.transform.rotation;

        //移動処理

        //親要素を軸に回転すると、子要素の位置は、ずれている。そのため回転実施後に位置の差分計算を行う
        var requiredPos = target.position - move.position;
        //targetとmoveの位置を合わせる
        moveParent.transform.position += requiredPos;
    }

参考

Magic Leap/mldbコマンドのヘルプ

Magic Leap Oneを起動する

  1. Light Packのボタンを三秒長押し(ピポッと音がする) ※マニュアルでは3秒だが、実際は押すだけでOK?
  2. Light PackのLEDがついたら、コントローラのホームボタン(小さいポッチ)を3秒長押し(バイブレーションとLEDが動作する)
  3. 起動に30秒くらいかかる。その間は無反応。起動すると起動サウンドが流れ、Welcome画面が表示される
  4. welcome画面にTap to Contiue.と表示されるので、コントローラのトリガーを押す

Magic Leap Oneを終了する

Case 1: ソフトウェア上での操作方法

  • 画面内のメニューからは、ホームボタンを押して、バッテリーアイコンを選択 -> PowerOffを選択 -> 画面の指示に従って、コントローラーのタッチパッドを円状にタッチする

Case 2: ハードウェアでの操作方法

  • ハードウェアでの電源OFF操作の場合は、Light Packのボタンを8秒長押し後、コントローラーのトリガーとホームボタンを3秒長押し。
  • マニュアルは上記記載だが、コントローラは勝手に電源切れる気がする

基本的な操作や、FAQ

やりたいこと 操作方法
音量の変更 Light Pack横の音量+-ボタンで操作 / ホーム画面からも可能
電池残量の確認 Light Packのホームボタンに触れる(触るだけで押さない)
→LEDの表示で電池残量がわかる。コントローラも
Light WearへのCG表示のOn/Off Light Pack横の Reality ボタンを押す。
復帰時は長押し。
表示OFFの状態の時はLight PackのLEDが白色になっている
アプリのインストール 独自のアプリはmldbコマンド(後述)。
ストアアプリは [World] というアプリからインストール。
アプリのアインストール mldbコマンド(後述)
もしくは、ホーム画面でアプリを選択して、
タッチパッドを押下
 > サブメニューからアインストール
起動中のアプリを閉じる ホーム画面でアプリを選択して、タッチパッドを押下
 > サブメニューからClose
画面に何も出てない Light Wearを外していると、自動的にSleepに入る。
再び装着すると復帰するが、眼鏡の上からなど、
軽く覗いているだけだと、近接センサーが働かない場合がある。
しっかりと装着すると復帰する
眼鏡使えるの? 眼鏡の上から正しく装着するのはほぼ無理。ノギスで計ったら、横幅114mm以内(できれば112mm)の眼鏡なら入りそうだけど、そんな眼鏡はほぼ、存在しない
専用眼鏡(レンズ)が欲しい! このブログ参照
IPアドレスが知りたい Homeボタン > Wifiアイコン > 接続中のWifiを選択 > [ i ]Advanced をクリック
USBでつないで、mldb ifconfig でもok
ネットワーク経由でデバッグしたい MLDB Over WiFi を読む。
充電しながら開発したい mldb をネットワークでつなげれば可能 ↑参照
録画したい 後述
リアルタイムで外部ディスプレイにストリーミングしたい 現状無理(19/3/27時点) 来週のバージョンアップで出来るかも
Homeボタンを押すと音はするけど、何も表示されない PCのディスプレイが目の前にあると、オクルージョンでディスプレイの後ろ側にCGが表示され、見えない事が多い。広い所をみて、再度Homeボタンを押してみる
キーボードが壁に埋まって入力できない キーボードもオクルージョンがかかるので、広い場所で操作するしかない

mldb コマンドの説明

Magic Leapでアプリのインストール操作にはmldb.exe というコマンドをコマンドプロンプトなどから利用します。場所は

{Magic Leap SDKのインストールパス}\mlsdk\v0.19.0\tools\mldb

となります。 {Magic Leap SDKのインストールパス}はデフォルトだと、

C:\Users\{ユーザ名}\MagicLeap\

となります。

このパスをWindows環境変数のPath に登録しておくと、後の操作が楽になります。

MagicLeapの録画方法

  • コントローラーで、ホームボタンを押しながら、バンプボタンを3秒ほど長押ししてください。録画が開始されます。 録画の停止も同じ操作方法です。

録画データの取り出し

# Cドライブ直下に移動(必須ではありません)
cd C:\

# 端末内のビデオをすべて取得 C:\videos\にmp4の動画がダウンロードされます。
mldb pull -D /C1/videos

# 端末内の C1/videos/ フォルダ内の一覧を取得
mldb ls  -D C1/videos

# 端末内の C1/videos/xxxx.mp4 だけをPCにコピー
mldb pull -D /C1/videos/xxxx.mp4

# Videosフォルダの動画を全部消す
$ mldb rm -D C1/videos/*.mp4

Magic Leap/mldbコマンドのヘルプ

gistにもアップした。

gist.github.com

HoloLens のUnityアプリで、カメラアクセスの許可がされているか確認する。

Vuforiaなどでカメラ機能を利用する際に、ユーザーが許可を与えなかったり、 OSバージョンアップ時に許可設定が吹っ飛んでしまった場合、そのまま続行すると例外でアプリがクラッシュしてしまいます。

そこで、カメラアクセスの許可が無いときに分岐する方法。

Application.HasUserAuthorizationは、WebPlayerだけみたいで、UWPではゴミ。

gist.github.com

カメラアクセスの許可は、設定アプリを利用して Settings > Privacy > Camera > アプリ一覧から ON/OFF できます。

参考

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#に移植しただけですが。

PSVR用収納ハードケース

PSVR用収納ハードケース

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