"そこ"から這い上がるブログ

プログラミングと電子工作が趣味でそこら辺のことを備忘録的に書きつつ這い上がっていこうといったブログ。そこ這い。

PCLでBilateralFilterを使う

最近はRealsenseとPCLを使っています。
そちらにかかりっきりで、Panoramazzleが……

備忘録としてPCLについてをちょこちょこまとめていきたいと思います。

深度カメラではブレの多い点群データをきれいにする方法としてBilateralFilterを使ってみます。

#include <pcl/filters/fast_bilateral_omp.h>
void BilateralFilter(
	const pcl::PointCloud<PointType>::ConstPtr &srcCloud,
	const float &sigmaR,
	const float &sigmaS,
	pcl::PointCloud<PointType>::Ptr &dstCloud )
{
	pcl::FastBilateralFilterOMP<PointType> bf;
	bf.setInputCloud( srcCloud );
	bf.setSigmaR( sigmaR );
	bf.setSigmaS( sigmaS );
	bf.applyFilter( *dstCloud );
}

フィルターをかける前
f:id:knasa:20180717151452j:plain
かけた後
f:id:knasa:20180717151449j:plain
パラメーターはσR = 0.05, σS = 15.0
ぱっと見あんまりわからないですが、切り替えながら見ると
シュッとした感じになります。

手法はいくつかあるようで、fastが付くつかない、OpenMPを使う使わないがあるようですが、
ひとまずfast+OpenMP

スマホのジャイロでカメラを回転させる方法

Unity+Androidスマホのジャイロに合わせてカメラを回転させたかったので色々調べてました。

Unityでスマホのジャイロ情報は

Input.gyro.attitude

で取得できます。
これをそのままCameraのtransform.rotationに入れると変な感じになりました。
やりたかったのは横持ちの時の回転なのですが、どうやら縦持ちの回転の様子。
ジャイロ機能とコンパスで見渡し操作【UUJ】
こちらのサイトを参考にQuaternionをかけることで横持ち用に

transform.rotation = Quaternion.Euler(0, 0, -180) * Input.gyro.attitude * Quaternion.Euler(0, 0, 180);

これで横持ち回転になりますが。机に置いたときに正面を向く感じになります。
横に持った時に前を向いたら正面になって欲しい……ので

transform.rotation = Quaternion.Euler(0, 0, -180) * Quaternion.Euler(-90, 0, 0) * Input.gyro.attitude * Quaternion.Euler(0, 0, 180);

こう

これで求めていた回転にできましたー

おいおいリセットかけられるようにしたりとか、起動時の向きを正面にするとかいれますかね。
カメラにアタッチすれば即ジャイロ回転になるコードを置いておきます。
スマホ横もちの時のカメラ回転をジャイロでできるようにするスクリプト。

Visual Studio 2017でプロパティシートを作成する

Visual Studioのプロパティ設定は面倒なので、環境変数をでまとめてみたりしてはいたのですが、結局それも面倒なのでプロパティシートでまとめちゃいます。

一度プロパティシートをつくっていしまえば、同じライブラリを使うプロジェクトは、そのプロパティシートをインポートするだけで一発設定。

やり方
  1. [表示]>[その他のウィンドウ]>[プロパティマネージャー]からプロパティマネージャーウィンドウを開きます。

    f:id:knasa:20180412204444p:plain

  2. 自分の使うビルド構成(例えば[Release|x64])のフォルダを右クリックして[新しいプロジェクトプロパティシートの追加]を選ぶ
    f:id:knasa:20180412204727p:plain
  3. 適当な名前を付け追加。追加したプロパティシートをダブルクリック(もしくは右クリックからプロパティを選択)するとプロパティページが開かれるので設定する。

    以上でプロパティシートの作成は終わり

  4. プロパティシートを読み込む際は、2.の時に[既存のプロパティシートの追加]を選び、先ほどのプロパティシートを選びます。作成したプロパティシートはデフォルトではプロジェクトファイルと同じ階層に保存されています。

これでプロパティを使いまわすことができるようになりました。
ただ、自分がそうだったのですが、設定したプロパティシートよりも新たにプロジェクトで設定したプロパティが優先されてしまうようで、プロパティシートの設定が反映されていないことがありました。
そのようなときはプロジェクトのプロパティの設定を[親またはプロジェクトの規定値から継承]とすることで反映させることができます(%(AdditionalIncludeDirectories)の追加と同等)。

xR Tech Tokyo#9 に出展してきました!

ご無沙汰しております。
ちょっと遅いんですが、先日xR Tech Tokyoにて現在開発中のVRゲーム「Panoramazzle」の展示を行ってきましたー

xR Tech自体はVR Techの時から参加させていただいてるのですが、出展者側として参加するのは今回が初めてでした。
感想としては出展してかなりよかったなと、意見を頂けたり、この日を〆切とすることで何とか遊んでいただける状態まで持ってこれたことだったり、何よりも多くの人に自分の作ったものを体験してもらえるのは嬉しいことですよね。

出展は終わりましたが、開発はむしろ始まったばっかりなのでリリース目指して開発を進めていきます。

ひとまず今日はこの辺りで、別のネタもあるのでそれと並行して進めつつ……そうですねブログも書いていきたいです。


そもそもこれは備忘録目的だったのだからやったことをまとめていけばいいはずなんですよね、未来の自分のためにも……ということを日々思いつつ最近はOneNote使ってます()。いいですよねOneNote、アカウントで連携されるので家でも外でも同じの見れますしおすし……

 

オリジナルのSphereを作りたくて苦労した話

以前頂点数を変えられるPlaneを作りましたが、今回はSphereを作りました。
どうやって作ったかなどは、ひとまず置いといて(気が向いたら更新します)

頂点法線ベクトル(mesh.normals)の設定で悩んだのでメモします。

OriginalSphereを作るまでのざっくりとした流れは

・Mesh.verticesを設定

・(Mesh.uvを設定)
・Mesh.trianglesを設定

・Mesh.normalsを設定

という感じになりますが、今回てこずったのはMesh.RecalculateNormals()を呼ぶタイミングです。

上手くいった手順は
1.Mesh.trianglesを設定
2.Mesh.RecalculateNormals()
3.Mesh.normalsを設定
この123の順序でやればうまくいきました。RecalculateNormalsを呼ぶ前にnormalsにアクセスするとnormalsを正しく設定できませんでした。ちなみに頂点法線は球の中心から各頂点に向かってのベクトルです。

f:id:knasa:20180203060431j:plain

上の写真は123順番を変えながら作成したものになります。
灰色になっているものはnormalsが空です。また、Mesh.Recalculateをしただけだと接続部分がおかしくなってしまいました。左上はnormalsの設定はしていないけどRecalculateNormalsを呼ぶ前にMesh.normalsにアクセスしています。

勝手な考察としては先にMesh.RecalculateをしておかないとMesh.normals配列が作成されないんじゃないかなと。

そもそも頂点の設定の仕方なども原因に含まれているかもしれないので一概には言えないですが、trianglesを設定したらすぐRecalculateNormalsをするのがよさそうです。

今年初記事

もう1月も3分の2が終わってしまったのに初記事です。
実は前に一瞬だけ記事書いていたけど、あまりにも情報が間違っていたので流石に消しました。
まぁこの記事も特に何か書くわけではなく、このままでは1月何も書いてないなーとなってしまって書いただけになります。

現在卒論に追われていまして……それが落ち着いたらいくつかネタがあるのでまとめていこうかなと、本来備忘録なので書くのが遅くなったら意味ない気もしますが……まぁまとめることで理解が深まるということで。

それでは、今年もこのサイトが誰かの役に立ったらいいなと思いつつ、書いていきたいなと思います。よろしくお願いします。

Unity2017.1から2017.2への移行(一例)

Vuforiaを2017.1で使おうとしたらなーんかうまく動かなかったので、何とか移行したことを備忘録としてまとめてみます。おそらく環境によってはそもそもVuforiaが動かないなんてこと自体発生しなそうなので、あくまで一例ということで……

元環境
Unity 2017.1.0p4
MRTK v1.2017.1.0

移行環境
Unity 2017.2.0f3
MRTK v1.2017.2.0

 

準備
Unityのインストールをします。
このときインストール先のフォルダの名前を”Unity”のままにしていると元々入っているUnityを上書きしてしまうので、フォルダ名を変えておきます。今回は"Unity20172"としました。

 

移行
・まずはプロジェクトのバックアップ
・入っていたVuforia関連のファイルを削除
―――ここから2017.2―――
・プロジェクトを開く、ここで500をこえるエラー
・とりあえずMRTKのunitypackageを入れる。大体は同じものなので、違う部分の更新をする感じ(全チェックでinstall)←やっぱよくなかった追記参照
・Unity再起動。ここでエラーが数個に減る。
・どうやらエラーが出ているのはAssets/HoloToolkit/Input/Scripts/InputSources/EditorHandsInput.csの様、これはMRTK v1.2017.2.0には含まれていないスクリプトだったので削除。エラーが出てないだけで他にも余計なスクリプトが大量に含まれていそうだけども目をつぶります。
・ここでひとまずエラーは消えたのでビルド。UnityはできてもUWPの方のビルドで失敗する。どうやらビルド先のフォルダ名を”UWP”にしているのに”App”をビルドしようとしている……そもそもこれはAppだったりUWPだったりフォルダ名を付けている自分が悪い……とりあえずAppもUWPもフォルダを消して再度ビルド
・ビルド成功いぇー

 

完全に環境依存がある感じの流れですが、こんな感じで移行ができました。
そもそも先にMRTKを消しておくべきだったなと思いました。まる。

 

追記
Vuforiaが上手く動きませんでした……Webカメラは起動しているのにGameビューが真っ暗なまま……
原因はVuforiaのバージョンにありました。
もともと前のVuforiaを入れていたプロジェクトだったためVuforiaのバージョンが6.2になっていました。(それを避けるためにVuforia関連のファイルは消したつもりでしたが、Unityエディタからの検索では見れない部分にあったようです)

Migrate Unity Project from Vuforia 6.2 to 6.5を参考に今度こそVuforia関連のファイルを削除
これでバージョンアップにも成功し、無事Vuforia起動。ふぃー

f:id:knasa:20171126155132p:plain

更に追記
MRTK公式にバージョンアップするときは前のMRTKは消してから入れようって書いてあったし、案の状前のMRTKが残ってたことでエラーが出たので、先に古いMRTKは消してから新しいのをインポートしましょう。