littlewing

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

MagicLeap用にUnity Native Pluginをビルドする(libjpeg-turbo)

Unity で作成したMagicLeapアプリでturbojpegライブラリを利用したくて、試行錯誤したのでメモ。

概要

背景

  • MagicLeapでNativePluginを利用するにはAArch64(ARM 64bit)でビルドした共有ライブラリ(.so)が必要となります。
  • Third-Partyライブラリにおいてビルド済みバイナリが配流されていることはほぼないので、自分でビルドする必要があります。
  • Android用として配布されているバイナリがそのまま使えることもあるが、ダメな場合もある(その辺よくわからない)

環境の説明

  1. Windows 10
  2. Unity 2019.1.14f
  3. MagicLeap SDK 0.21
  4. CMake 3.15.3
  5. make-3.81
  6. nasm-2.14.02 ※これはlibjpeg-turboが必要とするものなので、通常はいらないかも。
  7. libjpeg-turbo (実施時点では2.0.3 masterブランチ)
  8. WSLのUbuntu 18.4 LTS ※最後に確認に使ってるけど無くても良い

ビルド手順

  • 環境は以下を想定.
名前 実際のパス(例)
{MLSDK_DIR} C:\User\hoge\MagicLeap\mlsdk\0.21.0\
{libjpeg-turbo_DIR} C:\GitHub\libjpeg-turbo\
  • MINGW64 とコマンドを使い分けてるのでパス表記は適宜読み替えてください。

1. 「環境の説明」の内容を諸々インストールして準備する

  • CMake とMakeはパスを環境変数に登録しておくと便利

2. magicleap.toolchain.cmake を作成する。

$ cd  {MLSDK_DIR}

$ ./mabu -t lumin --create-cmake-toolchain magicleap.toolchain.cmake

mabu: Generated a cmake toolchain file to magicleap.toolchain.cmake.
This toolchain is entirely independent of mabu, but, depends on the current SDK location;
override the MLSDK cmake variable as needed.
mabu: Example usage:
        del CMakeCache.txt
        cmake -G"Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=magicleap.toolchain.cmake [-DMLSDK=...] ...

3. CMakeの実行

  • クローンしたリポジトリ配下に Build フォルダ(任意)を作成して、その中でCMakeを実行
#Buildフォルダを作成/移動
$ cd  {libjpeg-turbo_DIR}
$ mkdir Build
$ cd Build

#Cmake実行
$ cmake -G"Unix Makefiles"   \
-DCMAKE_TOOLCHAIN_FILE="{MLSDK_DIR}magicleap.toolchain.cmake"\
 "{libjpeg-turbo_DIR}"

4. CMakeCache.txt の調整

  • これは通常必要ないかもですが、CMakeが生成した、CMakeCache.txtを一部編集しました。(必要ないと思います)
//Build static libraries
ENABLE_STATIC:BOOL=OFF  //静的ライブラリの生成をOFFに

//Generate a fatal error if SIMD extensions are not available for
// this platform (default is to fall back to a non-SIMD build)
REQUIRE_SIMD:BOOL=OFF //SIMD extensionsをOFFに

5. Makeの実行

BuildフォルダにてMakeを実行する

C:\GitHub\libjpeg-turbo\builds\ARM64-lumin>make
-- CMAKE_BUILD_TYPE = Release
-- VERSION = 2.0.3, BUILD = 20191016
-- 64-bit build (arm64)
-- CMAKE_INSTALL_PREFIX = /opt/libjpeg-turbo
-- CMAKE_INSTALL_BINDIR = bin (/opt/libjpeg-turbo/bin)
-- CMAKE_INSTALL_DATAROOTDIR =  (/opt/libjpeg-turbo)
-- CMAKE_INSTALL_DOCDIR = doc (/opt/libjpeg-turbo/doc)
-- CMAKE_INSTALL_INCLUDEDIR = include (/opt/libjpeg-turbo/include)
-- CMAKE_INSTALL_LIBDIR = lib64 (/opt/libjpeg-turbo/lib64)
-- CMAKE_INSTALL_MANDIR = man (/opt/libjpeg-turbo/man)
-- Shared libraries enabled (ENABLE_SHARED = 1)
-- Static libraries disabled (ENABLE_STATIC = 0)
-- 12-bit JPEG support disabled (WITH_12BIT = 0)
-- Arithmetic decoding support enabled (WITH_ARITH_DEC = 1)
-- Arithmetic encoding support enabled (WITH_ARITH_ENC = 1)
-- TurboJPEG API library enabled (WITH_TURBOJPEG = 1)
-- TurboJPEG Java wrapper disabled (WITH_JAVA = 0)
-- In-memory source/destination managers enabled (WITH_MEM_SRCDST = 1)
-- Emulating libjpeg API/ABI v6.2 (WITH_JPEG7 = 0, WITH_JPEG8 = 0)
-- libjpeg API shared library version = 62.3.0
-- Compiler flags =  -O3 -DNDEBUG
-- Linker flags = -Wl,--start-group -Bdynamic -lc -lm -lc++_shared -landroid_support -Wl,--end-group --sysroot=C:/Users/hayas/MagicLeap/mlsdk/v0.21.0/lumin -pie -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--build-id -LC:/Users/hayas/MagicLeap/mlsdk/v0.21.0/lumin/stl/libc++/lib
-- Compiler supports pointers to undefined structures.
-- INLINE = __inline__ __attribute__((always_inline)) (FORCE_INLINE = 1)
-- Linker supports GNU-style version scripts
-- CMAKE_EXECUTABLE_SUFFIX =
-- CMAKE_ASM_FLAGS =   -O3 -DNDEBUG
-- GAS is working properly
-- SIMD extensions: arm64 (WITH_SIMD = 1)
-- FLOATTEST = 64bit
-- RPM architecture = aarch64, DEB architecture = arm64
-- Configuring done
-- Generating done
-- Build files have been written to: C:/GitHub/libjpeg-turbo/builds/ARM64-lumin
Scanning dependencies of target simd

6. 生成されたライブラリをUnityにコピー

Buildフォルダに libturbojpeg.soが生成されていると思います。 これをUnityのPlugins フォルダにコピーしてLumin向けの設定にします。 f:id:pigshape:20191016125016p:plain

尚、Androidもそうですが、C#呼び出す時、ライブラリの名称からlibは省略するので注意。 あと、この辺のC#からの呼び出し方法の記載は省略します。

    [DllImport("turbojpeg")]   //libturbojpegじゃないので注意!!
    public static extern IntPtr tjInitDecompress();

何度かライブラリを生成して入れ替えてmpkをビルドしていたら、mpk内の.soファイルが入れ替わってないときがあった。 同じmpkファイルに対して、ビルドする場合は注意。消した方が良いかも

7.プラットフォームの確認

  • ちゃんと、目的としたプラットフォーム向けに、ライブラリが作成されているかは readelf コマンドで確認できます。Windowsで使えるのか知らないですが WSLでインストールしたUbuntu18.4で実行できます。

特に、Class ,OS/ABI, Machine: がどうなっているか確認してください。

  • 以下のようになっていればOK。Machineが x86 とかだとダメです。
littlewing@:ARM64-lumin$ readelf -h libturbojpeg.so
ELF Header:
  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF64
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           AArch64
  Version:                           0x1
  Entry point address:               0x2c30
  Start of program headers:          64 (bytes into file)
  Start of section headers:          368824 (bytes into file)
  Flags:                             0x0
  Size of this header:               64 (bytes)
  Size of program headers:           56 (bytes)
  Number of program headers:         5
  Size of section headers:           64 (bytes)
  Number of section headers:         25
  Section header string table index: 22
  • ちなみに、32bit-ARMのAndroid版だと、以下のようになります。
littlewing@:armeabi-v7a$ readelf -h libjpegturbo.so
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              DYN (Shared object file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x0
  Start of program headers:          52 (bytes into file)
  Start of section headers:          176736 (bytes into file)
  Flags:                             0x5000200, Version5 EABI, soft-float ABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         9
  Size of section headers:           40 (bytes)
  Number of section headers:         27
  Section header string table index: 26

所感

  • 最初Ubuntu上にAndroidNDKとか入れて、Android64bit版を作成してそれを使ってやろうとしたけど、だめで、 結局あきらめて、Windows上でやったらうまくいきました。
  • こうやって書くと、簡単そうだけど、ここまでが大変だった。。
  • こういうことするなら、Macのが楽だな。※MagicLeapSDKはWin/Mac用しかなくてLinux/Ubuntu用が無い

[おまけ] magicleap.toolchain.cmakeの中身はこんな感じだった。

  • magicleap.toolchain.cmake
set(LUMIN TRUE)

set(MLSDK "C:/Users/hoge/MagicLeap/mlsdk/v0.21.0" CACHE PATH "Path to Lumin SDK")

# canonicalize
string(REPLACE "\\" "/" LUMIN_SDK "${MLSDK}")

set(LUMIN_SDK_SYSROOT "${LUMIN_SDK}/lumin/")

set(CMAKE_SYSTEM_NAME    Linux)
set(CMAKE_SYSTEM_VERSION 1)

SET(TOOL_OS_SUFFIX "")
IF(CMAKE_HOST_WIN32)
  SET(TOOL_OS_SUFFIX ".cmd")
ENDIF()

set(CMAKE_SYSTEM_PROCESSOR "aarch64")
set(CMAKE_SYSROOT          "${LUMIN_SDK_SYSROOT}")

set(CMAKE_MAKE_PROGRAM     "${LUMIN_SDK}/tools/mabu/tools/mingw/msys/1.0/bin/make" CACHE PATH "make executable" FORCE)
set(CMAKE_C_COMPILER       "${LUMIN_SDK}/tools/toolchains/bin/aarch64-linux-android-clang${TOOL_OS_SUFFIX}"  CACHE PATH "C compiler" FORCE)
set(CMAKE_CXX_COMPILER     "${LUMIN_SDK}/tools/toolchains/bin/aarch64-linux-android-clang++${TOOL_OS_SUFFIX}" CACHE PATH "C++ compiler" FORCE)
set(CMAKE_AR               "${LUMIN_SDK}/tools/toolchains/bin/aarch64-linux-android-gcc-ar.exe" CACHE PATH "C/C++ archiver" FORCE)

# Configure the behaviour of the find commands
set(CMAKE_PROGRAM_PATH "${LUMIN_SDK}/tools/toolchains/bin")
set(CMAKE_FIND_ROOT_PATH "${LUMIN_SDK}/lumin/")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_CXX_FLAGS "--sysroot=${LUMIN_SDK}/lumin -march=armv8-a -mcpu=cortex-a57+crypto -fPIE -nostdinc++ -I${LUMIN_SDK}/lumin/stl/libc++/include" CACHE INTERNAL "" FORCE)
set(CMAKE_EXE_LINKER_FLAGS "-Wl,--start-group -Bdynamic -lc -lm -lc++_shared -landroid_support -Wl,--end-group --sysroot=${LUMIN_SDK}/lumin -pie -Wl,--gc-sections -Wl,-z,nocopyreloc -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--build-id -L${LUMIN_SDK}/lumin/stl/libc++/lib" CACHE INTERNAL "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--start-group -Bdynamic -lc -lm -lc++_shared -landroid_support -Wl,--end-group --sysroot=${LUMIN_SDK}/lumin -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--build-id -L${LUMIN_SDK}/lumin/stl/libc++/lib" CACHE INTERNAL "" FORCE)
set(CMAKE_STATIC_LINKER_FLAGS "" CACHE INTERNAL "" FORCE)
set(CMAKE_LIBRARY_PATH "${LUMIN_SDK}/lumin/stl/libc++/lib" CACHE INTERNAL "" FORCE)

include_directories(SYSTEM )

参考

逆引きMeshLab

MeshLabの使い方をすぐ忘れるのでメモ

モデルの操作

操作内容 操作方法
モデルのインポート Ctrl +I
モデルの回転 ドラッグ
モデルの移動 Ctrl+ドラッグ or 中ボタンドラッグ
モデルの拡大縮小 Shift+ドラッグorマウスホイール
パースの強弱 Shift+マウスホイール
光源の移動 Ctrl+Shif+ドラッグ
Near Clipの変更 Ctrl+ドラッグ
視点の中心を移動 ダブルクリック
視点のリセット Ctrl+H

ウインドウ操作

操作内容 操作方法
レイヤーパネル On/Off Ctrl +L
全画面表示 Alt +Enter
Quick ヘルプの表示 F1

メッシュ編集

Filter

スキャンデータをきれいにする

操作内容 操作方法
孤立したMeshを除去 Filters > Cleaning and Repairing > Remove Isolated Pieces (Diameter)
形状を保ったままメッシュの数を減らす Filters > [Remeshing, Simplification and Reconstruction]-[Simplification: Quadric Edge Collapse Decimation] を実行 詳細

MeshLabで点群データ処理


コマンドラインで利用する

  • ply から daeへ変換
meshlabserver -i input.ply -o output.dae
  • 変換時には含めるデータをオプションで指定可能
meshlabserver -i input.ply -o output.dae -m vc #頂点カラー付きで出力

 [-m <opt>]  the name of the file where to write the current mesh of the MeshLab document.
 If -m is specified  the specified mesh attributes will be saved in the output file. the param <opt> can be a
 space separated list of the following attributes:
     vc -> vertex colors,  vf -> vertex flags,
     vq -> vertex quality, vn-> vertex normals,
     vt -> vertex texture coords,
     fc -> face colors,  ff -> face flags,
     fq -> face quality, fn-> face normals,
     wc -> wedge colors, wn-> wedge normals,
     wt -> wedge texture coords
  • Windowsのバッチで連続して処理する(事前に作成したフィルター処理 filter.mlx をかける)
set PATH=%PATH%;C:\Program Files\VCG\MeshLab

  for %%V in (*.ply) do (
    meshlabserver -i %%V -o %%~nV.obj  -s filter.mlx
  )
  pause
  • コマンドのヘルプ全文
C:\Program Files\VCG\MeshLab>meshlabserver

Usage:
meshlabserver [logargs] [args]
  where logargs can be:
    -d filename             dump on a text file a list of all the
                            filtering functions
    -l filename             log of the filters is ouput on a file
  where args can be:
    -p filename             meshlab project (.mlp) to be loaded
    -w filename [-x]        output meshlab project (.mlp) to be saved.
                            If -x flag is specified a 3D model meshfile.ext
                            contained in the input project will be overwritten,
                            otherwise it will be saved in the same directory of
                            input mesh as a new file called meshfile_out.ext.
                            All the mesh attributes will be exported in the
                            saved files
    -i filename             mesh that has to be loaded
    -o filename [-m <opt>]  the name of the file where to write the current mesh
                            of the MeshLab document.
                            If -m is specified  the specified mesh attributes will
                            be saved in the output file. the param <opt> can be a
                            space separated list of the following attributes:
                                vc -> vertex colors,  vf -> vertex flags,
                                vq -> vertex quality, vn-> vertex normals,
                                vt -> vertex texture coords,
                                fc -> face colors,  ff -> face flags,
                                fq -> face quality, fn-> face normals,
                                wc -> wedge colors, wn-> wedge normals,
                                wt -> wedge texture coords
    -s filename                   the script to be applied

   Examples:

    'meshlabserver -i input.obj -o output.ply -m vc fq wt -s meshclean.mlx'
           the script contained in file 'meshclean.mlx' will be applied to the
           mesh contained into 'input.obj'. The vertex coordinates and the
           per-vertex-color, the per-face-quality and the per-wedge-texture
           attributes will be saved into the output.ply file

    'meshlabserver -i input0.obj -i input1.ply -w outproj.mlp -x -s meshclean.mlx'
           the script file meshclean.mlx will be applied to the document
           composed by input0.obj and input1.ply meshes.
           The mesh input1.ply will become the current mesh of the document
           (e.g. the mesh to which the filters operating on a single model will
           be applied). A new output project outproj.mlp file will be generated
           (containing references to the input0.obj an input1.ply).
           The files input0.obj and input1.ply will be overwritten.

    'meshlabserver -l logfile.txt -p proj.mlp -i input.obj -w outproj.mlp -s meshclean.mlx'
           the mesh file input.obj will be added to the meshes referred by the
           loaded meshlab project file proj.mlp. The mesh input.obj will become
           the current mesh of the document, the script file meshclean.mlx will
           be applied to the meshes contained into the resulting document.
           the project file outproj.mlp will be generated
           A 3D model meshfile.ext contained in the input project proj.mlp will
           be saved in a new file called meshfile_out.ext
           (if you want to overwrite the original files use the -v flag after
           the outproject filename) all the attributes of the meshes will be
           saved into the output files; the log info will be saved into the
           file logfile.txt.

   Notes:
   There can be multiple meshes loaded and the order they are listed matters because
   filters that use meshes as parameters choose the mesh based on the order.
   The format of the output mesh is guessed by the used extension.
   Script is optional and must be in the xml format saved by MeshLab.

参考

MeshLabのスクリプトについてのメモ: メモブログ

MeshLab

MeshLabの使い方

MeshLab の基本的な操作 - XSim

Magic Leap Remote を Wifi経由で利用する

すぐ、忘れちゃうのでメモ。 充電しながら開発するにはWifi経由で接続したい。

USBでつないだ状態で以下を実行

$ mldb wifi status
.....  IpAddr=192.168.1.31 .....

$ mldb tcpip -p 5555
restarting in TCP mode port: 5555

$ mldb connect 192.168.1.31 
connected to 192.168.1.31:5555

# 確認
$ mldb devices
List of devices attached
192.168.1.31:5555       device

# USBに戻す
$ mldb usb

関連

Azure Kinect のキャリブレーションデータを取得する

Azure KinectOpenCVを組み合わせたくて、カメラの歪みパラメータ(Distortion Coefficients/Intrinsic Parameters)を取得した。

マーカーボードを使って自分でやらなくても、デバイスから値が取得できる。(便利)

azure-kinect-sensor-sdkに パラメータ取得のためのサンプルがあるのでそれを実行。

SDKのビルドはここが参考になった。(Visual Studio 2017でCmakeList.txtを読み込んでビルドするだけ)

ビルドすると、calibration_info.exeが生成される。 AzureKinectを接続して実行すると以下のように出力される。

C:\GitHub\Azure-Kinect-Sensor-SDK\build\Win-x64-Release-Ninja\bin>calibration_info.exe  > out.txt
Found 1 connected devices:

===== Device 0: {DeviceID:XXXXXX} =====
resolution width: 640
resolution height: 576
principal point x: 309.301086
principal point y: 330.656738
focal length x: 505.119751
focal length y: 505.163605
radial distortion coefficients:
k1: 3.063722
k2: 1.988396
k3: 0.102371
k4: 3.397454
k5: 2.984188
k6: 0.544097
center of distortion in Z=1 plane, x: 0.000000
center of distortion in Z=1 plane, y: 0.000000
tangential distortion coefficient x: -0.000098
tangential distortion coefficient y: 0.000048
metric radius: 0.000000

ただし、このデフォルト状態だと、K4A_DEPTH_MODE_NFOV_UNBINNEDの Depthカメラのキャリブレーション情報となる.

RGBカメラの値を取得したい場合は

auto calib = calibration.depth_camera_calibration;

auto calib = calibration.color_camera_calibration;

変えるなど調整が必要

1080pのRGBカメラの場合は

Found 1 connected devices:

===== Device 0: {DeviceID:XXXXXX} =====
resolution width: 1920
resolution height: 1080
principal point x: 968.939209
principal point y: 558.608459
focal length x: 899.693420
focal length y: 899.449646
radial distortion coefficients:
k1: 0.678679
k2: -2.779486
k3: 1.569404
k4: 0.554819
k5: -2.610379
k6: 1.500811
center of distortion in Z=1 plane, x: 0.000000
center of distortion in Z=1 plane, y: 0.000000
tangential distortion coefficient x: 0.000476
tangential distortion coefficient y: 0.000104
metric radius: 0.000000

720pのRGBカメラの場合は

Found 1 connected devices:

===== Device 0: {DeviceID:XXXXXX} =====
resolution width: 1280
resolution height: 720
principal point x: 645.792786
principal point y: 372.238983
focal length x: 599.795593
focal length y: 599.633118
radial distortion coefficients:
k1: 0.678679
k2: -2.779486
k3: 1.569404
k4: 0.554819
k5: -2.610379
k6: 1.500811
center of distortion in Z=1 plane, x: 0.000000
center of distortion in Z=1 plane, y: 0.000000
tangential distortion coefficient x: 0.000476
tangential distortion coefficient y: 0.000104
metric radius: 0.000000

となった。

関連

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/9/18更新)Device StreamでUSBもしくはWifi経由でストリーミング可能
現状無理(19/3/27時点) 来週のバージョンアップで出来るかも
Homeボタンを押すと音はするけど、何も表示されない PCのディスプレイが目の前にあると、オクルージョンでディスプレイの後ろ側にCGが表示され、見えない事が多い。広い所をみて、再度Homeボタンを押してみる
キーボードが壁に埋まって入力できない キーボードもオクルージョンがかかるので、広い場所で操作するしかない
バイスをリセットする バイス上で Settings.> ID選択 >下の方にある"Take me to Factory Reset"を選択

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


# 自分用メモ MINGW64でやると、Userフォルダにしか書き出せなかった。

 mldb pull  -D C1/videos/ML_20190920_11.52.33.mp4 "C:\\Users\\mynage\\rec.mp4"

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

gistにもアップした。

gist.github.com


HoloLensとMagicLeapの用語の対比

機能 HoloLens MagicLeap
空間への座標固定 World Anchor (空間アンカー) Persistent Coordinate Frames (PCF)

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

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

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

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

gist.github.com

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

参考