Unity 5.1サラウンド (Mac)

Unityでサラウンド再生したいなー。でもできるかな~って要件があったので調べました。

オーディオインターフェイスを用意

そもそも5.1ch再生するには、6ch以上のアウトのあるオーディオインターフェイスが必要です。 今回はちょっと古いですが、FA-66で検証。 Firewire to Thunderbolt変換で、MacbookPro OS10.9.4へ 5.jpg

音を用意

テスト用に6ch入りのWAVを用意。 こちらは、3Dサウンドのチェックを外してインポート。

7.png

モノラル音声3Dサウンドも用意しました。

Unityの環境設定を変える

Edit/Project Settings/Audio Default Speaker ModeをStereoからSurround 5.1へ変更

3.png

4.png

API的にはこいつです。 http://docs.unity3d.com/ScriptReference/AudioSpeakerMode.html

マックの環境設定を変える

ここまでで動くとおもいきや、デフォルトだと、3ch,4ch,5ch,6chが、1,2chにミキシングされちゃいます。

  1. Audio Midi 設定アプリを開いて、
  2. 使っているインターフェースを選ぶ。
  3. Configure Speakers 右下のボタン
  4. Multi Surroundタブの設定を5.1 Surroundへ。
  5. Applyボタンを押す。

1.png

2.png

テストアプリ

6.png

サラウンドファイルはそのまま再生。 3Dサウンドは、Cubeに割り当てて、スライダーで空間をうごかせる。 こんなかんじで作成。

Unity Macでマルチスクリーン&フルスクリーン。

色々調べると、Unityのフルスクリーンで、マルチスクリーンは出来ないってのが定石のようだったので。
諦めるのは悔しいので、サイネージで使うネイティブ拡張機能をまとめたリポジトリ公開しました。

Githubリポジトリ

まだ実践投入してないですが、こんな感じ。3画面テストまでは成功。 capture

あとは4点ホモグラフィー補正機能とかも入れていきたいなあ。

TODO

1個だけ。'Displays have separate Spaces'をOFFにしないと、うまく動きません。 image

その他の機能

  • アプリの起動中は環境設定を変えなくてもスリープしない機能、スクリーンセーバーにならない機能
  • メニューバーを隠す
  • ウィンドウのタイトルを隠す
  • ウィンドウの優先度を変えて、最前面に(エラーダイアログ、Dock、通知とかより前に)。Finderを選択しても、このアプリのほうが上に出ます。

サンプルアプリ

Download link osx:10.9~

openFrameworksでジェスチャ認識

最近いろいろと試しているGRTというジェスチャ解析ライブラリの紹介です。

ジェスチャ認識とはなんぞや

理系じゃないので、正しくはないですが、ふんわりこんな感じなのかな↓

ジェスチャ認識とは

1.パソコンに正解パターンを沢山教える。→ Classfication  
2.入力した信号が、どのパターンに似ていたか判定する。→ Recognition  

この2つのフェーズに別れてやるらしい。論文を読むと妙に難しい単語で挫けそうになるのだけど。 学習フェーズ、判定フェーズの2つがあるってことを知っておけば、わかりやすくなります。

その上で、素敵なスライドのご紹介。流石MIT
IAP Workshop: A Hands-On Introduction to Gesture Recognition & Machine Learning

そしてこのPDFがとてもまとまっている。 [IAP Session 1] (http://www.nickgillian.com/archive/teaching/workshops/mitiap2013/IAP_Session1.pdf)

本当は検出器に掛ける前に、
カルマンフィルタ、ローパスフィルタやら入力する信号の特性に応じてフィルタリングかけたり、FFTに変換とかいろいろ下ごしらえをするらしい。

アルゴリズムも色いろある。
AdBoostとか、SVMとか…ふむふむ分からん。
僕がよくやりたいパターンだと、9軸センサからジェスチェ認識とかやりたいので、Dynamic Time Warpingがよさげ。

やってみる。

ジェスチャ認識のライブラリは他にWiigeeとか見つかったのですが、アルゴリズムが一種類HMM(隠れマルコフモデル)だけ。上記でも使っているGRTを使ってみます。

GRTソースコードはこちらから。
https://code.google.com/p/gesture-recognition-toolkit/source/checkout

今回実行したプログラムはこちら。
http://www.nickgillian.com/wiki/pmwiki.php/GRT/OpenframeworksDTWExample

Rキーで、レコード開始。正解パターンを教えます。一文字につき5~10回繰り返す。
スクリーンショット 2013-12-15 19.00.10.pngスクリーンショット 2013-12-15 19.00.17.png

スクリーンショット 2013-12-15 19.00.57.pngスクリーンショット 2013-12-15 19.01.12.png

スクリーンショット 2013-12-15 19.02.38.pngスクリーンショット 2013-12-15 19.02.44.png

Tキーで教えこむ。
ちょっと待つとリアルタイムで解析するようになります。
全部Rとして認識成功!

スクリーンショット 2013-12-15 19.05.10.pngスクリーンショット 2013-12-15 19.05.24.pngスクリーンショット 2013-12-15 19.04.48.png

今回はマウス座標で2次元だったけど、yaw,pitch,rollでの解析とか。加速度での解析とかができそう。

// line:
trainingData.setNumDimensions( 2 ); // こんかいはx,y

おまけ

GRT部分を単体のアプリケーションにして、OSC経由で使える。Processingのサンプルが含まれてますが、OSC経由なら別にiPhoneの加速度センサだって簡単に。面白いことができそう。
http://www.nickgillian.com/wiki/pmwiki.php/GRT/Download

GPSって実際どれほどの精度なのか試してみた

たまたまGPSを使う要件がありまして、
GPSがどこまでいけるのか検証してみました。

結論からいうと、かなりよい。

モジュールはスパークファンから購入した
Adafruit Ultimate 66チャンネル10Hz GPSモジュール Version 3

このライブラリの通りに5Vと、TX/RXをつなぐだけ。

IMG_0313.jpg

ArduinoのSerial MonitorでそのままGPSのログが確認できるようになりますが、
一点だいじな事…
屋内では使えません。
Macと、この怪しげなArduinoむき出しのブレッドボードをもって近所の公園へ出掛けました。
僕が警官なら間違いなく職質します。

↓横浜海辺の公園を、不審者まがいに歩いたログ
GPS LOG

↓高度情報はこちら
height_walk_10fps.png

絶対値のoffsetは2m程東へずれていますが、
相対値の移動はかなり正確だという印象。
車載GPSで次の角を曲がってくださいって言っているんだから当たり前か。自分でやるとえらく感動する。

シリアル通信でこんな感じのフォーマットが流れてくる。(横浜の公園だけどちょっとだけ伏せ字)

$GPGGA,094022.200,35XX.XXXX,N,139XX.XXXX,E,2,11,0.78,-10.4,M,39.5,M,0000,0000*79
$GPRMC,094022.200,A,35XX.XXXX,N,139XX.XXXX,E,0.08,311.14,201113,,,D*6B

これはNMEAフォーマットというものらしい。パーサーも上述のgithubにあるので、ありがたい。
速度方向も結構な精度が出ていた。

ちなみに、GPSログの解析は、
http://www.gpsvisualizer.com/
このサイトを利用。
生のNMEAログファイルをいれるだけで、googlemapでみれるし、png,jpg,svg,さらにgoogleearth用のkmlフォーマットにも変換してくれる。
なんて素敵なサービス。(サクラではありません。ほんとうに素敵です。)

picojsonを使ってoF環境設定ファイルを読み書き

ofxXmlSettingが使いにくかったので、picojson使ってみました。

こんな感じ。落ち着いたらクラスにまとめたい。ofxPicojsonに。

Unityでインタラクティブなプロジェクションマッピングを

プロジェクションマッピングは、2年前は面白いとおもっていたんだけど、
最近はジャンルとしてカテゴライズされちゃいましたて、僕の母親でも知っているくらい。
でも、カテゴライズされたからこそ、表現の面白さで戦うフェーズがあると思う。
プロジェクションマッピングも丁度今そういうフェーズだと思います。

参考になるかどうか分かりませんが、
Unity→プロジェクションマッピングをやった時の構成をシェアします。

今回のまとめ

結論から。Unityで全部はやらないほうがいいです。

Unity -> Syphon -> MadMapper

こういった構成を作ります。

機材機材

今回の記事はMac向けです。windowsの方はゴメンナサイ。
更に言うと、Unityを立ちあげて、テクスチャマッピングして、時としてプロジェクター複数台繋いでとかやると負荷は高いので。イベントで使うときは、Mac Proとか良いマシンを頑張って用意したいです。落ちた時のリスクとかも考えるとなんだかんだお金はかかる。
もちろん開発機/試すだけなら、なんでもいけます。

SyphonをUnityでつかう

Unityはインタラクティブな映像を作ることに集中したほうがいい。
僕も含めて、なんでもかんでもOSCでアプリケーションごと処理を分けていっちゃうことが多いけど、 映像でも似たような物があるようです。

[Syphon サイフォン] (http://syphon.v002.info/)

映像版OSC程度の理解でいいかと。 アプリケーション間で、低負荷、低遅延で、映像の受け渡しを出来る仕組みらしい。ちゃんとしたことは、公式サイトでみてくだしい。
Syphonサーバーにチャンネル名決めて、映像を送る。受信側で同じサーバー名、チャンネル名で受け取る。

1 . ここからダウンロード
2 . UnityPackageを展開
3 . Syphonに映像としてい送りたいカメラに"Syphon Server Textrue"コンポーネントを追加
ちなみに全部のシーンのメインカメラに、EditorスクリプトでSyphonコンポーネントが自動でアタッチされます

a.jpg

キャプチャではUnityからQuartzComposerへ送っています。

MadMapperでマッピング

送信はやったけど、受信側がないと、動いているか分からない。

UVマッピングはUnityでも割と簡単に出来るのだけど、
やっぱり餅は餅屋。マッピングはマッピングソフトにお任せするのがお奨めです。
有料ソフトですが
MadMapper マッドマッパー
がなんだかんだ入って使いやすいと思います。

  1. 左の入力で、syphonチャンネルを選ぶ。

c.jpg

  1. 適当なサーフェスを作って、マッピング! b.jpg

作ったほうがいいシーン

3Dをマッピングするときに
補正テスト用のシーンを用意しておくと良いかと思います。経験談。
変にアニメーションせずに、マッピングするためだけのプレーンなシーン。
何が正しいかわからなくなりがちなので。

Syphon -> Unity

今回はプロジェクションマッピングのために、Unityからサイフォン経由でMadMapperに送る記事だったけど、逆もやりたい。
サイフォン経由でUnityにMovieTextureぽく送る。
例えば、syphon対応しているVJソフトとか、Unityで動いている3DモデルのテクスチャをVJみたいに切り替えてつかう。
などなど。

そんなお仕事ありましたらお知らせくださいw