Unityで利用する c++ のDLLを作成する。(Visual Studio 2017)
基本的に、以下のページにある手順で進めればNative Plugin を作成できるのですが 解説が、VS2013ベースになっているので、Visuai Studio 2017で実施した場合に ハマッた部分を、忘れないうちにスクショ付きでまとめました。
部分的にしか解説してないので、全体は以下のページを参照してください。
- Visual Studio Community 2017
- Unity 2017.3.0f3
- Windows 10 Fall creator update
でやりました。
DLLビルド用のVSプロジェクトの準備
- 既存のソリューションに、DLL作成用のプロジェクトを追加する場合はこんな感じでスタート
2018/8/17追記 VS2017 update 3 ではこの部分がまた変更になっています。 * Visual Studio 2017 Update 3 以降で Win32 プロジェクトが作成できなくなった時の対処法 - Qiita
DLLを作るのですが、この画面では、「c++ のWin32コンソールアプリケーション」を選択。
次に表示されるこの画面で「アプリケーション設定」をクリックして、DLLを選択します。 シンボルのエクスポートも忘れないように。
Unityに出力するなら「SDLのチェック」は外さないといけないらしいです。
で、コードを書く。ここは省略します。
exe形式で実行テスト
同一ソリューション内で、テストのためのexe用プロジェクトを作成したのであれば、 「参照の追加」を行うのが、手っ取り早いです。
ただし、既存の外部DLLやlibを使う場合はこれではダメです。 そのような場合は、以下の3つを設定します。
リンカ >全般>追加のライブラリディレクトリ libフォルダを指定
リンカ >入力 >追加の依存ファイル libファイルを指定
作成したDLLをUnity上で実行する
Unityからは
[DllImport("sample-opencv-dll")] private static extern int CountUp();
Debug.Log(CountUp()); Debug.Log(CountUp()); Debug.Log(CountUp());
のような感じで呼びだすことができます。 「DllImport」にファイル名を書くときは拡張子 (.dll)を含めるとエラーになるので含めません。
libで追加ライブラリを指定した場合は、そのdllもPlugins内に配置しておかないと、
Plugins: Failed to load 'Assets/Plugins/x86_64/xxxxxxxx.dll' with error '指定されたモジュールが見つかりません。 '.
という警告や
DllNotFoundException: Failure has occurred while loading a type.
という例外エラーが発生するので、関連DLLの配置もお忘れなく。
おまけ 既存DLL ( or lib ) の中身を解析する方法
スタートメニューから[開発者コマンド プロンプト for VS2015]を起動する
- DLLのインターフェースを確認する
cd (DLLの場所) dumpbin /exports xxxxx.dll
- dllが32bitか64bitか確認する。
dumpbin /HEADERS xxxxx.dll | findstr machine
Visual Studio 2017のみでdumpbin を使う。(追記2018.12.28)
[開発者コマンド プロンプト for VS2015]は、Visual Studio 2017 のみインストールしていると、スタートメニューに表示されない。
利用するにはコマンドから起動する必要がある。
Win +R を押して
cmd /k "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\tools\VsDevCmd.bat"
で起動できる。 ちなみに、dumpbin.exe自体は
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\dumpbin.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x86\dumpbin.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x64\dumpbin.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX86\x86\dumpbin.exe
この辺りにある。
参考: If you have Visual Studio 2017 installed then you can use dumpbin to dump the PE... | Hacker News
Unity 2017.3 で TouchScreenKeyboard が使えない
Unity 2017.3を利用してHoloLensアプリを開発する際に、キーボードが使えなくて困ったのでメモ。
D3DのHoloLensアプリケーションではキー入力が使えないのですが、 Unity 2017.2までは、 Build TypeをXAMLにして、TouchScreenKeyboardを利用すれば、自動的にXAML画面が呼び出されて文字入力を行うことができました。
具体的には以下のコードをGameObjectにアタッチすると、startが呼び出された時点で、本来はキー入力画面が表示されます。
public class InputTest : MonoBehaviour { TouchScreenKeyboard keyboard; public static string keyboardText = "Input any"; // Use this for initialization void Start() { Debug.Log("start keyboard"); if (keyboard == null) keyboard = new TouchScreenKeyboard(keyboardText, TouchScreenKeyboardType.Default, false, false, false, false, "sample prompting text that goes above the textbox"); else keyboard.active = true; } }
しかし、これが、Unity 2017.3では動かない。アプリが落ちてしまいます。特に例外も発生しない。
Unity version | Result |
---|---|
Unity 2017.4.3f1 | not working new 18/05/30 |
Unity 2017.3.1p4 | not working new 18/05/30 |
Unity 2017.3.0b10 | not working |
Unity 2017.3.0b10 | not working |
Unity 2017.3.0f3 | not working |
Unity 2017.2.0b11 | working |
Unity 5.6.3f1 | working |
Unity 2017.2とUnity 2017.3でBuild出力されたC#プロジェクト内の、MainPage.xaml.csを比較してみたところ、
appCallbacks.SetKeyboardTriggerControl(this);
の記述が、Unity 2017.3では削られていました。
//Unity 2017.2.0b11で出力した、MainPage.xaml.cs抜粋 appCallbacks.RenderingStarted += () => { RemoveSplashScreen(); }; #if UNITY_UWP if (Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent("Windows.Phone.PhoneContract", 1)) isPhone = true; #endif //ここから、4行がUnity2017.3では無い。 #if !UNITY_WP_8_1 appCallbacks.SetKeyboardTriggerControl(this); #else isPhone = true; #endif //ここまで appCallbacks.SetSwapChainPanel(GetSwapChainPanel()); appCallbacks.SetCoreWindowEvents(Window.Current.CoreWindow); appCallbacks.InitializeD3DXAML();
そこで、2017.3側で SetKeyboardTriggerControlを追加しようとしたところ、そんなメソッドは無いと怒られます。
Documentには載ってるのに・・
あきらめて、自前でXAML Page作ります。
xaml切り替えは @d_yamaさんの解説記事がわかりやすいです。
HoloLens+Arucoを触ってみた
こちらのリポジトリの「HoloLensArucoTracking」を触ってみた https://github.com/KeyMaster-/HoloLensArucoTracking/
- Editor用とHoloLens用のSceneがある。
- 使い方はReadme見れば大体わかる
- Unity 5.6.3とUnity 2017.3.b10でHoloLens実機ビルドできた。
注意点
特定のIDに反応させたい
- MainCameraについている、MarkerObjectPlacer.csがONの状態だと、どのマーカーにも 反応してCubeが表示される。
- 特定のIDを利用したい場合は、TrackedObjectExampleを利用する。
マーカーIDを指定しても反応してくれない
- READMEにも書いてあるが、ArucoのマーカーIDがOpenCVのものと、本家(このコードはこっち)で異なる。 そのためAruco Marker Generatorなどで、マーカーを作成した場合はIDが異なるので注意。 どのIDが反応しているかを調べるには、先ほど書いたメインカメラについている、MarkerObjectPlacer.csのonDetectionRun()部分で
for (int i = 0; i < ArucoTracking.marker_count; i++) { PoseData pose = trackingRunner.poseDict[ArucoTracking.ids[i]]; Debug.Log("ID is " + ArucoTracking.ids[i]); //★この行を追加 quadInstances[i].transform.localPosition = pose.pos; quadInstances[i].transform.localRotation = pose.rot; }
などとしてやれば調べることができる。 OpenCVのMarkerID:1はこのコードではID:256として反応した。
マーカーの位置がずれる
MainCameraについているArucoRunner.csに、マーカーの実寸サイズをちゃんと指定してやる必要がある。
一辺、36mmのマーカーなら、Inspector上でMarker Size 0.036と指定してやる。
その他のAruco関連ライブラリ
MarkerBased AR Example
ちなみに、Arucoを動かすことができるAssetがAssetStoreにもある。
こちらも試していましたが、カメラキャリブレーションがそのままでは、ガバガバなので、 ちゃんと使うには自前で調整が必要そうです。
HoloLensでのARマーカー(ArUco)、現状ではカメラのフレームレートの低さとシャッタ速度が設定できなくてロバスト性が低く、本来の位置トラッキング性能と比べると体験としては著しく質が下がりますね…。これをそのまま使う予定は今の所無いのですが。
— あるしおうね (@AmadeusSVX) 2017年5月5日
aruco-unity
Unity上でのカメラキャリブレーションに関しては、こちらのプロジェクトにはキャリブレーション用のシーンがありました。
参考ドキュメント
Unity EventをInspector上で登録できるようにする
説明用にメモ
public なUnityEventを作成すると、Inspector上で、イベント内容を登録できるようになる
using UnityEngine; using UnityEngine.Events; public class Hoge: MonoBehaviour{ public UnityEvent onInitialized; }
このイベントはどこかで初期化しておく必要がある。
void Start(){ if (onInitialized == null) onInitialized = new UnityEvent (); }
イベントの呼び出しはInvokeを利用する
//イベントを発火する if (onInitialized != null) onInitialized.Invoke ();
Hologram Stability (ホログラムの安定性) の日本語訳
1年ぶりとなりますが、HoloLens / Windows Mixed Realityのドキュメントの中から「Hologram Stability」を自分の勉強のために翻訳(意訳)しました。
元のドキュメントはこちらです。
以前からあったドキュメントですが、Immersive HMDに関する記述もあるので、内容は最近更新されているかもしれません。 2017/11/11現在の内容を基に作成しています。
コードとかUnityの知識に関しては記述されておらず、アプリ設計段階で必読の基本的な動作原理とFPSの維持がなぜ重要か?の話となります。
注意事項として、 Color sequential displayのハードウェアの仕組みと、輻輳角などの眼に関する前提知識がそれほど無いため、 そのあたりの翻訳の正確性が低い可能性があります。是非、原文も参照してください。
あと、ホログラム警察の方、ごめんなさい。多少変えていますが、原文を尊重して記述しています。 ホログラムは3Dオブジェクトと読み替えてください。
目次
ホログラムの安定性
- ホログラム安定性にかかわる用語
- Accuracy (正確性)
- Jitter (ジッター/ゆらぎ)
- Judder (ジャダー /振動)
- Drift(ドリフト/ずれ)
- Jumpness (ジャンプ)
- Swim (およぐ)
- Color separation(色分離)
- フレームレート
- ホログラムを配置する距離
- 安定化平面
- 色分離
- 関連ドキュメント
HoloLens のDevicePortal API(REST)にPHPでアクセスする
8/20追記 後で気づいたのですが、以下の記事はDevicePortalのSSLをOffにした状態で試したものです。デフォルトのSSL ONの状態ではそのまま動かないのでご注意ください。Tokenの管理が別途必要です。時間が出来たら記事にします。
録画機能の実行のためにDevicePortal APIを使ってみました。
APIの公式ドキュメント(英語版)はこちら
はまったのは、ドキュメントをみると、POSTメソッドのAPIでもパラメータはGETで渡す必要があります。
あと、日本語版の公式ドキュメントと英語版で若干違ったので、英語版を見た方が良いかも。
続きを読むMRDesignLabsメモ(1)
MRDesignLabs_Unityを触りながら、だらだらとメモ。
続きを読む