目次
このブログの目次
ブログ説明のページ
プログラミング関係
PCL
HTC Vive
雑談
久しぶりの投稿 part.2
お久しぶりです。
長らく更新できておりませんでした。すみません。
大学院を卒業し、ソフトウェアエンジニアとして
モバイルアプリの設計開発の業務をしています。
VRからは離れてしまいましたが
これまで通り最先端の技術にはどんどん触れていきたいと思っていますので、また自分のペースで更新していければなと思っています。
HMDなしでViveトラッカーを使いたい
はじめに
Viveトラッカーを使って様々な場面で位置トラッキングをしたい。
でも、HMDは使いたくない。そんなときのお話。
(研究の過程で調べたことをまとめた感じ)
使用したもの
HTC Vive(Viveトラッカー)
SteamVR
参考にしたページ
SteamVR Tracking without an HMD | Triad Semi Help Center
手順
- SteamVRなどHTCViveのセットアップに必要なものをインストール
- SteamVRの設定を変更する
- 設定ファイルの場所:C:\Program Files (x86)\Steam\steamapps\common\SteamVR\resources\settings\default.vrsettings
- requireHmd を false にする
- activateMultipleDriversをtrueにする
- Viveトラッカー同梱のドングルをPCに接続する
- SteamVRを再起動
位置の取得
OpenVR APIを使用
C#の場合は以下を参考
Initializing OpenVR manually in C# :: SteamVR Developer Hardware General Discussions
以下のコードで、トラッキングされているデバイスの位置を取得できる(allPosesに結果が格納される)
vrSystem.GetDeviceToAbsoluteTrackingPose(ETrackingUniverseOrigin.TrackingUniverseStanding, 0, allPoses);
トラッキングの状態を取得することもできる(allPoses[deviceID].eTrackingResult)
結果は以下のEnum
public ETrackingResult
{
Uninitialized=1,
Calibrating_InProgress=100,
Calibrating_OutOfRange=101,(トラッキング範囲外)
Running_OK=200,(トラッキングされている)
Running_OutOfRange=201,
}
Pythonの場合は以下を参考(pyopenvrを使用)
注意点とか
ドングルの使用を忘れない
HMD使用時は、HMDに2個分のドングルが内蔵されているため、接続ができるが
Viveトラッカー単体の使用の際にはその個数分のドングルが必要
Viveトラッカー単体で位置トラッキングできると
ロボットとかドローンとかいろんなものの位置トラッキングに使えて夢が広がります
C#でViveトラッカーの位置や情報を取得するコードを書いたので
UnityでHTC Vive対応のコンテンツを開発 その1
はじめに
Unityで、HTC Vive対応のコンテンツを開発する方法について、
メモ程度に書いていこうと思います。
使用したもの
HTC Vive
Unity 5.5.3
SteamVR Plugin 1.2.1
参考にしたページ
Unity+HTC Vive開発メモ - フレームシンセシス
準備
- Unityをインストール
- 新規プロジェクトを作成する。
-
SteamVR PluginをAsset Storeからダウンロードし、インポートする。
推奨設定に変更させようとするウィンドウが出るので、左下の「Accept All」をクリックする。
- 自動追加されるカメラを削除し、SteamVR/Prefabs/[CameraRig]プレハブをシーン内に設置する。
- 同様に、[Status]プレハブ、[SteamVR]プレハブも設置する。
これでシーンを再生すれば、HTC Viveと接続されてコンテンツがHMDで再生されるはずです。
コントローラの取得
コントローラの位置
[CameraRig]の下に、Controller (left)とController (right)というゲームオブジェクトがあり、
このtransformを利用することで、位置が取得できます。
コントローラの入力
Unity+HTC Vive開発メモ - フレームシンセシス
こちらのサイトには以下のようなサンプルプログラムが掲載されています。
using UnityEngine;
public class ControllerExample : MonoBehaviour
{
void Update()
{
SteamVR_TrackedObject trackedObject = GetComponent<SteamVR_TrackedObject>();
var device = SteamVR_Controller.Input((int) trackedObject.index);
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Trigger)) {
Debug.Log("トリガーを浅く引いた");
}
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger)) {
Debug.Log("トリガーを深く引いた");
}
if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Trigger)) {
Debug.Log("トリガーを離した");
}
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Touchpad)) {
Debug.Log("タッチパッドをクリックした");
}
if (device.GetPress(SteamVR_Controller.ButtonMask.Touchpad)) {
Debug.Log("タッチパッドをクリックしている");
}
if (device.GetPressUp(SteamVR_Controller.ButtonMask.Touchpad)) {
Debug.Log("タッチパッドをクリックして離した");
}
if (device.GetTouchDown(SteamVR_Controller.ButtonMask.Touchpad)) {
Debug.Log("タッチパッドに触った");
}
if (device.GetTouchUp(SteamVR_Controller.ButtonMask.Touchpad)) {
Debug.Log("タッチパッドを離した");
}
if (device.GetPressDown(SteamVR_Controller.ButtonMask.ApplicationMenu)) {
Debug.Log("メニューボタンをクリックした");
}
if (device.GetPressDown(SteamVR_Controller.ButtonMask.Grip)) {
Debug.Log("グリップボタンをクリックした");
}
if (device.GetTouch(SteamVR_Controller.ButtonMask.Trigger)) {
//Debug.Log("トリガーを浅く引いている");
}
if (device.GetPress(SteamVR_Controller.ButtonMask.Trigger)) {
//Debug.Log("トリガーを深く引いている");
}
if (device.GetTouch(SteamVR_Controller.ButtonMask.Touchpad)) {
//Debug.Log("タッチパッドに触っている");
}
}
}
このようなスクリプトを書いて、Controller (left)とController (right)にアタッチすれば、入力が取得できるようです。
個人的には、deviceを取得する部分のコードを書くのがめんどくさいので、
以下のような拡張メソッドを作って使用しています。(SteamVR_TrackedObjectの代わりにSteamVR_TrackedControllerを使用しています。)
public static SteamVR_Controller.Device GetDevice(this SteamVR_TrackedController self)
{
return SteamVR_Controller.Input((int)self.controllerIndex);
}
また、クリックなどの入力は、イベントを使用して以下のようにも書くことが出来ます。
private void SetControllerEventExample()
{
trackedController.TriggerClicked += new ClickedEventHandler(DoTriggerClicked);
trackedController.TriggerUnclicked += new ClickedEventHandler(DoTriggerUnClicked);
trackedController.MenuButtonClicked += new ClickedEventHandler(DoMenuButtonClicked);
}
public void DoTriggerClicked(object sender, ClickedEventArgs e)
{
Debug.Log("トリガーを引いた");
}
public void DoTriggerUnClicked(object sender, ClickedEventArgs e)
{
Debug.Log("トリガーを離した");
}
public void DoMenuButtonClicked(object sender, ClickedEventArgs e)
{
Debug.Log("メニューボタンをクリックした");
}
とりあえず今回はこのへんで
次回はコントローラからRayを出す話とかですかね
VTKを自分でビルド
上のブログの続きです
はじめに
前回のブログでも書いたのですが、PCLにVTKがうまく連携されなかったので、バージョンを下げてみて自分でビルドしてみた
参考は前回同様このサイト
Point Cloud Library 1.8.0 has been officially released | Summary?Blog
各依存ライブラリについての導入方法も書いてあります
導入方法
ダウンロード
VTK - The Visualization Toolkit
ここから、自分の使いたいバージョンのVTKをダウンロードしてくる
今回わたしは、6.3を使用します
ZIPファイルをダウンロードしてきたら展開します
CMakeを使うので、ソリューションファイルの出力先となる「build」フォルダを作成しておきます
CMake
- Where is the source code:ソースコードの入力先(展開したフォルダ)
- Where is build the binaries: ソリューションファイルの出力先(先程作成したbuildフォルダ)
というように指定します
次に、[Configure]を押してターゲットとなるVisual Studioを選択します
自分の使いたいバージョンのVisual Studioを選択しましょう
ちゃんと64bitの人は、Win 64と書かれてる項目を選択しましょう(わたしはここで選択ミスしてはまった笑)
Configureが終わって、画面が真っ赤になったら各種設定をします
たくさん項目がありますが、確認すべきところだけ押さえれば大丈夫でしょう
チェックを外す項目
- BUILD_SHAREED_LIBS
- BUILD_TESTING
項目を編集するところ
- CMAKE_CONFIGURATION_TYPES Debug;Release
- CMAKE_INSTALL_PREFIX C:\Program Files\VTK (or C:\Program Files (x86)\VTK) :これがインストール先となる
追加する項目
Name: | CMAKE_DEBUG_POSTFIX |
Type: | STRING |
Value: | -gd |
Description: |
ここまで確認が終わったら、[Generate]を押してソリューションファイルを作成しましょう
ビルド
最後にVisual Studioを管理者権限で起動してVTKのソリューションファイルを開きます
ALL_BUILDを選択しビルドした後、INSTALLを選択し、INSTALLのみをビルド
特に問題がなければこれでVTKのインストールが完了します
パスの設定
あと、最後の最後にパスの設定をします
これで完了です、お疲れ様でした
おわりに
このブログについてはこちら
PCLの導入
はじめに
センサ使って空間をスキャンして、取得した点群を処理して…みたいなことをしたいなーって思ったのでとりあえずPCLの導入
PCLとは
詳しい説明は省きますが、誰でもフリーで使用できる、点群の様々な処理が包括されているライブラリです
公式サイト ⇒ PCL - Point Cloud Library (PCL)
公式で配布されているインストーラはバージョンが古く、Visual Studio2015での使用に対応してません
2016年6月現在PCLの最新バージョンは1.8.0で、それを使用したインストーラを作成してくださっている方がいらっしゃるので、
そちらを有り難く使わせていただきましょう
(2018.12.11 追記:バージョンの更新に伴い、リンクが切れていたので、トップページのリンクに変更した)
導入方法
自分の環境に対応したAll-in-one Installerをダウンロードしてインストール
ただこれだけです、簡単ですね
しかしここからが大変
プロジェクトを作成する際にPCL関連のファイルを参照させなければなりません
ここらへんの設定はCMakeというものを使って行います
ダウンロードはこちらから ⇒ CMake
基本的な、PCLを使用したプロジェクトに対するCMakeLists.txtの書き方は以下の通り
基本的な、PCLを使用したプロジェクトに対するCMakeLists.txtの書き方
とりあえずはこんな感じで導入できます、できるはずです、、、、
(どうしてVTKの連携ができないんだろう)
おわりに
このブログについてはこちら
追記
2016.07.16
再度構築し直してみたら、特に問題なく構築できたので
わざわざ以下のことをする必要はないかもしれません
2016.07.02
VTKの連携できない問題は、VTKのバージョンを7.0から6.3に下げて、自分でビルドすることで、とりあえず解決できました
ビルド方法については後日別ブログで書きます