openFrameworksからのUnity入門

僕は普段、なにか表示系のものを作るときはopenFrameworksを使っているのだけど、今回3Dでグリグリや!という案件があったのでUnityを利用した。ということでoF経験者がUnityに入門する時のノウハウをまとめておく。Unityのバージョンは5.6.1f1、oFはv0.9.8。

Unityの強みと弱み

Unityはゲームエンジンで、ゲームエンジンなので状態や遷移の管理に優れており、3Dオブジェクトの扱いが簡単、強力なGUIによってパラメータの変更がラク、標準で物理演算エンジンが組み込まれているが、一方でテクスチャになにかを描いたりする機能はない。oFとの比較で強みと弱みをまとめると以下のような感じだ。

強み

  • シーン、アニメーションなどの状態管理が優れている
    • ゲームエンジンなのでそのへんのサポートが豊富
    • 特にアニメーションはコード無しでかなり高度なことが出来て大変助かった
  • 強力なエディタのGUI
    • コードに書いたパラメータをごく僅かな手間でGUIのエディタ側から調整可能(oFで言うならofxGUIが簡単に使える感覚だと思う)
  • 強力なGUIライブラリ
    • ゲーム内で使うGUIの方ですね。これもまた強力
  • シェーダーの扱いがoFよりも簡単
    • 使って当たり前のUnity、微妙に手間なoFって感じ
  • 3Dオブジェクトとカメラの扱い
    • 各種3DCGソフトからデータを持ってきて扱うのが簡単
    • カメラもGUIで簡単に扱える
  • 標準で組み込まれた物理演算エンジン
    • ほぼなにも考えずに物理演算を実現できる
  • C#による楽ちんな開発
    • C++、大変なんです
  • 完全なオブジェクト指向
    • コードはそれぞれのオブジェクトに紐付ける形で実装していくため完全なオブジェクト指向になる
    • 紐付けたオブジェクトの管理はUnity側。oFで同様のことをしようとするちょっと手間
  • パーティクルが便利
    • オブジェクトに対するエフェクトはパーティクルを使うことでほぼGUIのみでいい感じに実装出来た
  • 充実したリファレンス
    • しかも使いやすい

弱み

  • プロジェクトが壊れてエディタが起動できなくなることがしばしば起きる
    • まぁoFでも起こるけど、頻度はUnityのほうが多い印象
    • git管理は必須
  • エディタがよく落ちる
    • 諦めてこまめにセーブした
  • GUIで簡単にいじれる故にプロジェクトを開くと何某かを変更してたりする
  • テクスチャに描画するのは弱いというかほぼ想定外
    • 豊富なメソッドがあるoFと比較すると貧弱というか無い
    • 簡単な図形もペイントソフトなどで制作する必要があるのはちょっと手間
    • テクスチャの描画に関しては他のソフトに任してテクスチャを投げよう
  • メッシュをいじるのもoFのほうがやりやすい印象
  • OSCがちょっとむずい
    • これについては後述する
  • macでマルチディスプレイ時に主ディスプレイ以外のマウスイベント取得が不可能
    • 他アプリでマウスイベントを取得 -> OSC -> UnityのイベントシステムのInputModuleをいじって実現。別記事で紹介する

OSCの罠

UnityOSCを使うわけだけど、その辺に転がってるコード使うと罠にはまる。参考になるのはこのQiitaの記事だけ。oFとの罠も書いてある。OSC使うときはまず、ここを参考にコードを書こう。
UnityOSCではまる - Qiita

書籍

f:id:miso_engine:20170710150440j:plain
Unity自体の書籍としては、入門書は『Unity5の教科書』を利用した。この入門書で一通りの3Dゲームが作れるようになり、Unityの主要な機能を知ることが出来た。『Unity ゲームエフェクト入門』ではパーティクルを利用したゲームエフェクトの作り方がレシピ集として載っており、とても便利だった。

Tips

  • 回転をTransform.eulerAnglesに代入してやろうとすると360度以上の回転は失敗という罠がある
    • そもそもリファレンスにTransform.Rotateを使えとは書いてあるのでごめんなさいだけど
    • 角度でやるよりも4元数(=Quaternion)使うほうが定石感あった
  • 滑らかな移動や回転をしたいときにMathfやVector3にいい感じのメソッドが用意されている
  • RaycastHitが他のオブジェクトから0.51以上離さないとTexcoordがVector2.zero
  • UIのButtonはイケるイケナイの状態が3つある
    • ゲームオブジェクトのActiveSelf、Button自体のenableとinteractableの3つ

実際Unityどうよ

今回のプロジェクト3Dをグリグリ、物理演算使って動かしたいだったのでUnityピッタリだった。oFだけでやるよりも工数削減出来たと思う。目論見外のメリットとしてはアニメーションの実装と管理が圧倒的に楽というのがあった。今後派手なヤツはすべてUnityで実装すると思う。テクスチャの生成に関してはoFと組み合わせて使ったのでまぁ適材適所感が強い。oFとUnityの連携は今回はファイルでファイルのパスを投げるだけの簡易的なものにしたが、もっと高度なやり方もあるので、今後探っていきたい。

人との距離をセンサで検知する

センサによって人を検知する方法は山ほどあるが、条件によってどのセンサを使うかは大きく変わってくる。今回は人がいるいないや動き以外に人との距離もセンシングしたいという条件で、センサを選定した。

人を検知するセンサの種類

  • 赤外線センサ
  • レーザーセンサ
  • カメラ
  • 3次元センサ(ex. Kinect, Xtion)
  • 超音波センサ
  • 焦電センサ

ざっと上げてこんなところである。今回は小規模なシステムにしたかったので、カメラと3次元センサは外した。また、超音波センサは音波を反射しやすい硬いものでないと正確な距離が出ないので選定から外し、焦電センサは人の動きがあるかどうかを見ているため、距離が分からないので外した。

試したセンサと結果

f:id:miso_engine:20170424182218j:plain

Pololuのレーザーは一番値がキチンと出て良いのだけど、いかんせん短い。あとの2つはセンシング範囲によって選びましょう。3つともセンサからまっすぐにしか反応しない。

余談

センサ試すとき、写真のように固定出来る治具を簡単にレーザーカットして、ゴム足つけたら開発すごくラクになったのでオススメです。

VL53L0X Time-of-Flight 距離センサモジュール

VL53L0X Time-of-Flight 距離センサモジュール

Mac対応コンピュータビジョン向けカメラ

先日の仕事で、Webカメラの性能だと微妙だなって感じがあったので、コンピュータビジョン向けカメラを検討し、導入してみたので共有。
使ってみた感想的にはWebカメラで足りるならWebカメラ使ったほうが気軽でいいね、といったところ。もちろんコンピュータビジョン向けのカメラにもメリットはあるのだが、気軽に、という感じではないのだ。

ロジクール c920r

前も紹介したがWebカメラ界最高峰。720Pで30fps出せる。こいつを使ってみてダメなときにコンピュータビジョン向けカメラを検討するべき。

Logicool ロジクール HD プロ ウェブカム c920r

Logicool ロジクール HD プロ ウェブカム c920r

コンピュータビジョン向けカメラとは

720Pで60fpsはUSB2.0だと厳しく、USB3かEthernetなんかが必要になってくる。気軽に使いたいのでUSB3対応のものにしようとしたところ、まさにUSB3Visionという規格が存在した。EthernetにはGigE Visionという規格が存在する。

また、Webカメラと違ってレンズとセンサが別だ。マウントとしてはCマウント、CSマウント、Sマウントなど。これらは監視カメラのレンズとしても使われているので、比較的簡単に手に入る。今回はCSマウントのモデルにした。CマウントとCSマウントは、Cマウントを小型化したものがCSマウントで、CSマウントのカメラにはCマウントをつけることが可能だが、その逆は不可能。詳しくは下記で。
第1回 Cマウントレンズと、CSマウントレンズ 編

USB3 Visionカメラの大手

  • Basler
  • IDS
  • Matrix Vision
  • Point Grey
  • SENTECH
  • The Imaging Source
  • 東芝テリー
  • XIMEA

もっとある感じだったけど、ざっと調べたところこんなところだった。

USB3 VisionMac対応

  • Basler
  • XIMEA

Macに対応しているのは上記2社のみで、このうち日本に代理店があるのはBaslerのみなのでBasler社のカメラを導入した。

Baslerのカメラ

エリアスキャンカメラ| Basler
f:id:miso_engine:20170710165610p:plain

スクリーンショットは上記URLから。

気軽に買えるのは、ace、pulse、dartあたりで、1個あたりの値段も ace -> pulse -> dartdartが一番安い)の順であるが、dartのみ最小ロットが5個*1とのことで、1個のみ導入する場合はpulseのほうが手軽になる。今回小型化が必要だったのでdartを選んだのだが、基板がむき出しになるので、扱いやすさを考えると多少スペースに余裕があるならpulseやaceを選ぶほうが良いと思う。

また、aceだと一部のセンサに限定される画像補正機能であるPGIが、pulseとdartではすべてのセンサで有効とのこと。

ソフトについて

https://www.baslerweb.com/jp/support/downloads/software-downloads/pylon-5-0-5-osx/

BaslerはPylonというSDKを出している。これがmac対応しているわけだ。SDK自体の出来は問題なく、サンプルコードを見て簡単にOpenCVに組み込めたし、openFrameworksで扱うことにも成功した。まぁ理想を言えばUSB3 VisionがUVCのようにOpenCVなどのライブラリが標準対応してほしくはある。

また、Pylon Viewerというアプリで簡単にカメラとの接続確認やパラメータの確認なども出来て、macで開発自体スムーズに出来た。

*1:今回利用した代理店の制約かもしれない