littlewing

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

逆引き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で点群データ処理

参考

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ボタンを押してみる
キーボードが壁に埋まって入力できない キーボードもオクルージョンがかかるので、広い場所で操作するしかない

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 できます。

参考

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

}