MRが楽しい

MRやVRについて学習したことを書き残す

AzureKinectをBlenderから直接実行して点群データを取り込んでみた

本日は AzureKinect と Blender の調査枠です。
この記事は 3D Sensor Advent Calendar 2019 の8日目の記事になります。
qiita.com

今回はこれまで AzureKinect と Blender について学んだ技術を利用して、AzureKinectをBlenderから直接実行して点群データを取り込んでみます。
f:id:bluebirdofoz:20191208105811j:plain

AzureKinectをBlenderから直接実行する

自作のBlenderアドオンを作成し、AzureKinect の実行と点群データの取り込みを行う UI を追加しました。
実行方法は空の Blender プロジェクトを用意して、アドオンの[Capture]ボタンをクリックするだけです。
f:id:bluebirdofoz:20191208105847j:plain

すると PC に接続されている AzureKinect が実行され、以下の通り、キャプチャ結果の点群データが Blender に自動的に取り込まれます。
f:id:bluebirdofoz:20191208105914j:plain

斜めから見ると、こんな感じです。
死角の部分は粗くなっていますが、それ以外は綺麗に点群が読み込まれています。
メートルサイズに補正しているため、サイズ感も合っています。
f:id:bluebirdofoz:20191208110012j:plain

他のソフトを立ち上げることなく、3D編集ソフトに点群データを読み込めるため、点群を編集したい場合は便利……かもです。
以下は今回利用した技術要素です。

作成アドオンのスクリプトコード

今回作成した Python スクリプトを記述します。
以下の3つのスクリプトを作成しました。

__init__.py:アドオンの情報設定やUI/関数の登録を行う。アドオンは本スクリプトから実行される。
azure_kinect_capture.py:AzureKinectの操作を行う。AzureKinectSDKのサンプルをPythonモジュール化したもの。
ply_visualizer.py:点群の読み込みや表示を行う。Point Cloud Visualizerアドオンが必要。

f:id:bluebirdofoz:20191208110147j:plain

・__init__.py

・azure_kinect_capture.py

・ply_visualizer.py

BlenderからAzureKinectを実行する方法

Blender から AzureKinect を実行する方法には以下のサンプルプログラムの Python モジュール化の技術を利用しています。
bluebirdofoz.hatenablog.com

こちらの手順で作成した pyd ファイルと参照ライブラリを Blender アドオンの一部として利用しています。
f:id:bluebirdofoz:20191208110348j:plain

アドオンのインストールとパネルの表示

pyd ファイルを参照するアドオンの作成方法とインストール手順は以下により詳しく記事にしています。
bluebirdofoz.hatenablog.com

Blender の UI にパネルを追加する方法は以下の記事の手順を利用しています。
bluebirdofoz.hatenablog.com

点群データの表示

Blender で点群データを表示するため、Point Cloud Visualizer アドオンを利用しています。
本アドオンを利用することで点群の様々な表示や編集が行えるようになります。
以下の記事でアドオンの利用方法とインストール手順を紹介しています。
bluebirdofoz.hatenablog.com

最後に

明日の 3D Sensor Advent Calendar 2019 は @UnagiHuman さんの「Realsenseと再帰性反射材で簡易モーショントラッキングを作ってみた話をします」です。
qiita.com

Pythonの自作モジュールをBlenderのアドオンとしてインストールする

本日は AzureKinectSDK の技術調査枠です。
Pythonの自作モジュール(*.pyd)をBlenderのアドオンとしてインストールする一例を記事にします。
f:id:bluebirdofoz:20191207210957j:plain

本記事では Pythonの自作モジュールとして、以前作成した AzureKinectSDK のサンプルプログラムを利用します。
本記事の実施には、以下の前回記事の作業が前提となります。
bluebirdofoz.hatenablog.com

Blenderアドオンのスクリプトの作成

前回記事で作成した kinect_capture モジュールを利用する Blender アドオンの関数を用意します。
以下の関数登録のための __init__.py と kinect_capture モジュールを実行する module.py を作成しました。

__init__.py の名前を持つスクリプトはモジュール読み込みの際、初めに実行される Python スクリプトです。
ファイル名は必ず __init__.py である必要があります。
ディレクトリに配置する module.py を読み込むため、システムパスの追加を行います。
・__init__.py

# bpyインポート
import bpy
# osインポート(ディレクトリ取得のため)
import os
# sysインポート(システムパス追加のため)
import sys

# 読み込み元のディレクトリパスを取得
addon_dirpath = os.path.dirname(__file__)
# 読み込み元のディレクトリパスをシステムパスに追加
sys.path += [addon_dirpath]

# moduleインポート(処理呼び出しのため)
import module

# bl_infoの設定
bl_info = {
  "name": "AzureCaptureAddOn",             # プラグイン名
  "description": "AzureCapture AddOn",     # 説明文
  "author": "holomon",                     # 制作者名
  "version": (1, 0, 0, 0),                 # バージョン
  "blender": (2, 80, 0),                   # 動作可能なBlenderバージョン
  "support": "TESTING",                    # サポートレベル
  "category": "3D View",                   # カテゴリ名
  "location": "",                          # 機能の位置付け
  "warning": "",                           # 注意点やバグ情報
  "wiki_url": "",                          # ドキュメントURL
  "tracker_url": ""                        # サポートサイトURL
}

# 登録関数
class AZUREPOINTCAPTURE_OT_capture(bpy.types.Operator):
    bl_label = "Azure Capture"
    bl_idname = "azure_capture.execute"
    bl_description = "Export PLY file"

    def execute(self, context):
        module.capture_execute()
        return{'FINISHED'}


# 登録対象のクラス名
regist_classes = (
    AZUREPOINTCAPTURE_OT_capture,
)


# AzureCaptureの登録
def register():
    for regist_cls in regist_classes:
        bpy.utils.register_class(regist_cls)

# AzureCaptureの解除
def unregister():
    for regist_cls in regist_classes:
        bpy.utils.unregister_class(regist_cls)

# 実行例:[AzureCaptureの登録]を実施
if __name__ == "__main__":
    register()

module.py は __init__.py から利用されるモジュール本体です。
__init__.py のインポート文に合わせてファイル名を設定します。
ディレクトリに配置する kinect_capture.cp37-win_amd64.pyd を読み込むため、システムパスの追加を行います。
・__init__.py

# bpyインポート
import bpy
# osインポート(ディレクトリ取得のため)
import os
# sysインポート(システムパス追加のため)
import sys

# 読み込み元のディレクトリパスを取得
addon_dirpath = os.path.dirname(__file__)
# 読み込み元のディレクトリパスをシステムパスに追加
sys.path += [addon_dirpath]

# kinect_captureインポート(Kinect実行のため)
import kinect_capture

# 実行関数群
def capture_execute():
    """メイン関数
    """
    # PLYファイルの出力ディレクトリを取得する
    # (.blendファイルのディレクトリに出力する)
    ply_dir = get_blend_dirpath()
    # PLYファイルの出力ディレクトリが取得できなければ処理を行わない
    # (.blendファイル未保存時に本分岐に入る)
    if ply_dir == "":
        print("save .blend Project, plase")
        return
    # AzureKinect のキャプチャ実行
    execute_azure_capture(arg_exportdir = ply_dir)
    return

def get_blend_dirpath() -> str:
    """現在のblendファイルのディレクトリパスを取得する
    
    Returns:
        str -- blendディレクトリパス(.blend未保存時は空文字を返却する)
    """
    # blendファイルのパスを取得
    filepath = bpy.data.filepath
    # blendファイルが未保存の場合は空文字が返る
    if filepath == "":
        # 戻り値にも空文字を返す
        return ""
    # blendフォイルのディレクトリパスを取得
    dirpath = os.path.dirname(filepath)
    return dirpath

def execute_azure_capture(arg_exportdir = "") -> bool:
    """AzureCaptureモジュールの実行
    
    Keyword Arguments:
        arg_exportdir {str} -- PLYファイルの出力ディレクトリ (default: {""})
    
    Returns:
        bool -- 実行成否
    """
    # キャプチャモジュールの実行
    is_result = kinect_capture.capture(arg_exportdir)
    return is_result

Blenderアドオンのインストールファイルの作成

作成した2つのスクリプトディレクトリにまとめます。
f:id:bluebirdofoz:20191207211011j:plain

更に前回記事で作成した kinect_capture モジュールの pyd ファイルとライブラリ群を同ディレクトリにコピーします。
f:id:bluebirdofoz:20191207211022j:plain

作成したディレクトリを ZIP 形式で圧縮すればアドオンのインストールファイルの完成です。
f:id:bluebirdofoz:20191207211029j:plain

Blenderへのインストール

作成したアドオンを Blender にインストールします。
Blender 2.8 を起動し、メニューから 編集 -> プリファレンス を選択します。
f:id:bluebirdofoz:20191207211037j:plain

Blenderプリファレンスダイアログが開きます。
[アドオン]タブを開き、[インストール]ボタンをクリックします。
f:id:bluebirdofoz:20191207211045j:plain

ファイル選択画面が開くので、先ほど作成した圧縮ファイルを選択して[ファイルからアドオンをインストール]を実行します。
f:id:bluebirdofoz:20191207211055j:plain

これでアドオンがインストールされました。
インストールされたアドオンは以下のディレクトリに展開されています。

C:\Users\(ユーザ名)\AppData\Roaming\Blender Foundation\Blender\(Blenderバージョン)\scripts\addons

f:id:bluebirdofoz:20191207211102j:plain

インストールしたアドオンを使うには、アドオンを有効化する必要があります。
今回のアドオンは "support" を "TESTING" にしていたので[テスト中]タブを開くと、一覧に表示されます。
アドオンのチェックボックスをチェックすると、アドオンが有効化されます。
f:id:bluebirdofoz:20191207211110j:plain

これで kinect_capture モジュールを呼び出す関数が bl_idname の azure_capture.execute の名前で登録されました。

登録関数の確認

関数が実際に登録されているか確認します。
メニューから 編集 -> オペレーターを検索 で登録関数を探してみます。
f:id:bluebirdofoz:20191207211121j:plain

bl_label で設定した Azure Capture 文字を検索します。
関数が表示されれば、登録できています。
f:id:bluebirdofoz:20191207211130j:plain

モジュールの利用

試しに以下のスクリプトを実行し、登録関数を Blender 内で呼び出してみます。

import bpy
#  kinect_capture モジュールのテスト利用
bpy.ops.azure_capture.execute()

f:id:bluebirdofoz:20191207211141j:plain

実行が成功すると、*.blend の保存ディレクトリに kinect_capture モジュールでキャプチャした *.ply ファイルが出力されます。
f:id:bluebirdofoz:20191207211150j:plain

参考ページ

自作アドオンの作成手順や作成ルールについては以下に詳しく記事にしています。こちらも参照ください。
bluebirdofoz.hatenablog.com

VisualStudioCodeでBlenderモジュールのオートコンプリートを利用する その3(fake-bpy-moduleのバージョン切り替え)

本日は環境構築枠です。
Visual Studio CodeBlenderモジュールのオートコンプリートを利用する方法を記事にします。
本記事は fake-bpy-module の対応 Blender のバージョンを切り替える手順です。
f:id:bluebirdofoz:20191206092735j:plain

以下の記事の続きです。
bluebirdofoz.hatenablog.com

fake-bpy-moduleのアンインストール

既に異なる Blender バージョンの fake-bpy-module がインストールされている場合、これをアンインストールします。
インストール済みのパッケージは以下のコマンドで確認できます。

python -m pip list

f:id:bluebirdofoz:20191206092755j:plain

パッケージをアンインストールする場合は以下のコマンドを実行します。

python -m pip uninstall fake-bpy-module-(バージョン番号)

f:id:bluebirdofoz:20191206092804j:plain

削除確認の入力を求められるので y (実行)を入力します。
f:id:bluebirdofoz:20191206092813j:plain

これで対象の fake-bpy-module をアンインストールできました。
f:id:bluebirdofoz:20191206092822j:plain

fake-bpy-moduleのインストール

後は前回の fake-bpy-module のインストール手順と同様です。
今回は Blender の 2.8 に合わせたいので fake-bpy-module-2.80 を指定して実行します。

python -m pip install -U fake-bpy-module-2.80

f:id:bluebirdofoz:20191206092830j:plain

以下の通り、Successfully installed が表示されればインストール成功です。
f:id:bluebirdofoz:20191206092838j:plain

動作確認

オートコンプリートで利用可能な関数が表示されることを確認します。
Blendre2.8 に対応した fake-bpy-module がインストールできていれば bpy.context.view_layer が確認できます。
f:id:bluebirdofoz:20191206092846j:plain

VisualStudioCodeでPythonのコメント記述の補助を行うautoDocstringを利用する

本日は VSCode の環境構築枠です。
VisualStudioCodeでPythonスクリプトのコメント記述の補助を行うautoDocstringを利用する手順を記事にします。
f:id:bluebirdofoz:20191205092340j:plain

以下の記事の続きです。
bluebirdofoz.hatenablog.com

autoDocstringとは

Python の Docstring の記述を補助を行う VSCode拡張機能です。
marketplace.visualstudio.com

Docstring は Python の関数やクラスの説明文を記述するコメント規則の一つです。
Google と NumPy の2つのスタイルがあります。
www.sphinx-doc.org

autoDocstringのインストールと利用

Visual Studio Code を起動し、[Extensions]ボタンをクリックして[autoDocstring]で検索を行います。
トップに表示される Nils Werner 氏が提供する[autoDocstring]をインストールします。
f:id:bluebirdofoz:20191205092411j:plain

早速 autoDocstring を使ってみます。
Python スクリプトを作成し、関数の下に3つのダブルクォーテーション """ の文字列を打ち込みます。
f:id:bluebirdofoz:20191205092419j:plain

この状態から Enter キーを押下すると、以下の通り、説明文と引数と戻り値のコメントフォーマットが自動生成されます。
f:id:bluebirdofoz:20191205092428j:plain

スタイルの変更

デフォルトだと Google スタイルの記法で自動生成されます。
スタイルを変更したい場合は[歯車]アイコン -> Setting を開きます。
f:id:bluebirdofoz:20191205092437j:plain

[autoDocstring]で検索をかけると[Auto Docstring: Docstring Format]の設定項目が表示されます。
プルダウンから利用したいスタイルを選択して変更します。
f:id:bluebirdofoz:20191205092446j:plain

試しに numpy スタイルを選択してコメントを自動生成してみました。
以下の通り、NumPy スタイルのコメントが生成されるようになります。
f:id:bluebirdofoz:20191205092456j:plain

Blender2.79のpythonスクリプトで3Dモデルのオブジェクトとマテリアルの結合を自動化する その2

本日は Blender2.79 の技術調査枠です。
Blender2.79 の Python スクリプトで3Dモデルのオブジェクトとマテリアルの結合を自動化します。

今回はマテリアルの結合にテクスチャベイクと頂点カラーベイクを利用してみます。
f:id:bluebirdofoz:20191204091338j:plain

前回記事の続きです。
bluebirdofoz.hatenablog.com

サンプルモデル

前回と同じく3つのオブジェクトとそれぞれに同様の3つのマテリアル設定を持つモデルをサンプルとして利用します。
f:id:bluebirdofoz:20191204091349j:plain
f:id:bluebirdofoz:20191204091402j:plain
f:id:bluebirdofoz:20191204091411j:plain

テクスチャベイクを利用した結合

オブジェクトの結合と、テクスチャベイクを利用したマテリアルの結合を行うスクリプトを用意しました。
結合したオブジェクトのUV展開を実施し、マテリアルのベースカラーを全てテクスチャに落とし込みます。

スクリプト

・ModelTextureMerge.py

実行結果

処理が完了すると、オブジェクトが1つに結合されます。
マテリアルも1つのテクスチャマテリアルに統合されます。
f:id:bluebirdofoz:20191204091501j:plain
カラーを確認するため、シェーディングを[マテリアル]に変更して環境照明を設定しています。

頂点カラーベイクを利用した結合

オブジェクトの結合と、テクスチャベイクを利用したマテリアルの結合を行うスクリプトを用意しました。
結合したオブジェクトのマテリアルのベースカラーを全て頂点カラーに焼き込みます。
頂点ごとに色を焼き込むため、色の解像度を保つには頂点の細分化が必要です。

スクリプト

・ModelVertexColorMerge.py

実行結果

処理が完了すると、オブジェクトが1つに結合されます。
マテリアルも1つの頂点カラー表示のマテリアルに統合されます。
f:id:bluebirdofoz:20191204091519j:plain
カラーを確認するため、シェーディングを[マテリアル]に変更して環境照明を設定しています。

CUIでの実行

本記事のスクリプトは以下の記事と合わせて利用すると、処理をCUIから実行することも可能です。
bluebirdofoz.hatenablog.com

Blender2.8への移植

スクリプトはベイクの処理が[Blenderレンダラー]に依存しているため、Blender2.8への移植はできません。
(ただしテクスチャベイクに関してのみレンダラーが変わるものの類似の書き換えは可能です)
Blender2.8用スクリプトにまとめた上で公開予定でしたが、本スクリプトは移植が厳しいため、Blender2.79向けのまま記事にしました。

MacOSのUnityでARKitを使ったiOSアプリをビルドする その5(iPadでの署名の検証とアプリの起動)

本日は iOS アプリの調査枠です。
MacOSのUnityでARKitを使ったiOSアプリをビルドする手順を記事にします。

今回は iPad での署名の検証とアプリの起動です。
f:id:bluebirdofoz:20191203084916j:plain
前回記事の続きです。
bluebirdofoz.hatenablog.com

アプリのインストール確認

Xcodeからアプリがインストールされると、ホーム画面にアプリが追加されます。
f:id:bluebirdofoz:20191203084928j:plain

アプリアイコンをタップすると、署名の検証を要求するダイアログが表示されます。
f:id:bluebirdofoz:20191203084938j:plain

署名の信頼

自作アプリを iPad で利用する際は、アプリの作成者の署名を信頼する必要があります。
[設定]を開きます。
f:id:bluebirdofoz:20191203084946j:plain

[一般]タブを開きます。
アプリをインストールすると、[デバイス管理]の項目が追加されているので開きます。
f:id:bluebirdofoz:20191203084955j:plain

[デバイス管理]の一覧を開くと、インストールしたアプリの署名が確認できます。
署名をタップして選択します。
f:id:bluebirdofoz:20191203085004j:plain

署名の検証ページが開きます。
[署名を信頼]をタップすると、ダイアログが開くので[信頼]をタップします。
f:id:bluebirdofoz:20191203085013j:plain

インターネットの接続

署名の検証を行う際はインターネットに接続している必要があります。
インターネット接続がない状態で署名の検証を行うと、以下のダイアログが表示されます。
f:id:bluebirdofoz:20191203085021j:plain

[Wi-Fi]タブからインターネットに接続可能な Wifi に接続します。
f:id:bluebirdofoz:20191203085029j:plain

署名の検証

インターネット接続が行える場合は、以下のダイアログが表示されます。
[検証]をタップすると、署名の検証が行われます。
f:id:bluebirdofoz:20191203085041j:plain

検証が完了すると、信頼の設定が完了します。
これで信頼した署名を持つアプリを起動できるようになります。
f:id:bluebirdofoz:20191203085049j:plain

アプリの起動

ホーム画面に戻り、アプリを起動します。
f:id:bluebirdofoz:20191203085058j:plain

カメラのアクセス許可の確認ダイアログが表示されます。
[OK]をタップします。
f:id:bluebirdofoz:20191203085105j:plain

アプリが起動すると、1m先の位置に Cube オブジェクトが表示されます。
f:id:bluebirdofoz:20191203085115j:plain

iPad を持ったまま、Cube の周りを歩き回ってみます。
現実空間の位置に Cube オブジェクトが留まり続けることを確認します。
f:id:bluebirdofoz:20191203085123j:plain

MacOSのUnityでARKitを使ったiOSアプリをビルドする その4(iPadへのインストール)

本日は iOS アプリの調査枠です。
MacOSのUnityでARKitを使ったiOSアプリをビルドする手順を記事にします。

今回は iPad へのインストールです。
前回記事の続きです。
bluebirdofoz.hatenablog.com

署名の作成

Unity ビルドで出力された *.xcodeproj ファイルを起動します。
f:id:bluebirdofoz:20191202093302j:plain

すると Xcode が起動します。
初めてアプリインストールを行う場合は、アプリの署名を作成する必要があります。
メニューから Xcode -> Preferences を選択します。
f:id:bluebirdofoz:20191202093312j:plain

ダイアログが開くので、[Accounts]タブを開きます。
[Accounts]一覧の[+]ボタンをクリックします。
f:id:bluebirdofoz:20191202093324j:plain

アカウント種別の選択ダイアログが開きます。
今回は Apple ID から証明書を作成します。
[Apple ID]を選択して[Continue]ボタンをクリックします。
f:id:bluebirdofoz:20191202093334j:plain

アカウントのサインインが求められます。
利用する Apple ID のメールアドレスとパスワードを入力し、[Next]をクリックします。
f:id:bluebirdofoz:20191202093343j:plain

一覧に Apple ID が追加されます。
ID を選択して、右下の[Manage Certificates..]ボタンをクリックします。
f:id:bluebirdofoz:20191202093357j:plain

署名の一覧画面が開くので、[+]ボタンをクリックしてプルダウンを開きます。
[Apple Development]をクリックします。
f:id:bluebirdofoz:20191202093408j:plain

すると一覧に署名が追加されます。
[Done]をクリックしてダイアログを閉じます。
f:id:bluebirdofoz:20191202093417j:plain

iPadへのインストール

iPad を開発PCにUSB接続します。
このとき、iPad 側でPCの接続の許可を求める旨のメッセージが表示されるので許可を行います。
すると、Device の一覧に iPad のデバイス名が表示されるので、これを選択します。
f:id:bluebirdofoz:20191202093427j:plain

インストール前にプロジェクトの署名設定を行います。
[Unity-iPhone]からプロジェクトを開いて[Signing & Capabilities]タブを開きます。
[Automatically manage signing]にチェックを入れます。
f:id:bluebirdofoz:20191202093437j:plain

ビルド設定が初期化される旨のダイアログが表示されます。
[Enable Automatic]を選択します。
f:id:bluebirdofoz:20191202093450j:plain

[Term]のプルダウンを開き、先ほど署名の設定を行った Apple ID の Team 名を選択します。
f:id:bluebirdofoz:20191202093500j:plain

この状態で、[インストール]ボタンをクリックするとインストールが開始されます。
接続中の iPad 側でアプリがインストールされたことを確認します。
f:id:bluebirdofoz:20191202093513j:plain

iPad でアプリを起動するには署名の検証を行う必要があります。
署名の検証が未完了だと、以下のようにアプリが起動できない旨のダイアログが表示されます。
f:id:bluebirdofoz:20191202093522j:plain

次に iPad 側の署名の検証とアプリの起動を行っていきます。
bluebirdofoz.hatenablog.com