Kinect+XNA による簡易バーチャルスタジオ

id:logion:20120907 で書いたKinectのネタですが、実は簡易バーチャルスタジオのシステムを作っていました。
しょぼい事務所で撮影しても人物だけ切り抜いてCGセットに合成すれば、あら不思議!豪華なセットで撮影したように見える!(かも?)
正確にはカメラの角度や位置にCGも完璧に追従しないといわゆるバーチャルスタジオにはなりませんが、そこはどうしようもないので目をつぶっております。
また3DフレームワークであるXNAを使う以上、スタジオのモデルも当初は3Dポリゴンで表示していまいたが、諸般の事情によりレンダリング済の画像を2Dで合成する方法に変更しており、バーチャルというよりはただのハメコミ合成システムと化しております。orz
このシステムを使って今晩から4週間ほど、毎週土曜日19:00〜20:00にニコニコ生放送YouTube Liveで番組が生放送されます。

ニコニコ生放送 「フミコの告白」「ロボと少女(仮)」作者らと観る、 CGアニメコンテスト・CGアニカップ 予習的鑑賞会
YouTube Live CGアニメコンテスト・CGアニカップ事前告知番組「予習的鑑賞会」

お時間がありましたらよろしければご覧下さい。なお、普通のビデオカメラ映像になっていたら何かしらのトラブルで中の人が慌てふためいていると思われますので、生暖かい眼差しを投げ掛けて頂けると嬉しいです。

そして…

似たような状況で苦しんでいる方がおられましたら、↑の記録が少しでも参考になれば幸いです。
4台目をどう接続するか悩んでいるのですが、最後のPCI-Ex16にUSBカードを挿してしまうとビデオカードが挿さらなくなってしまいCPU内蔵のintel HD Graphics 3000で3DCGを表示することになるのは嫌やなあ…。
PCI-Eがx1, x4, x8, x16と4種類あるマザーボードを調達するか、*1PCIに挿さるUSBカードでKinectを認識するものを探すか…。
まだまだ先は長そうです。orz

*1:スロットの種類を替えなければいけない?…というのも今ひとつ腑に落ちませんね…。もしかするとPCI-Ex1が複数の組み合わせの時に限ってバスの帯域が足りないとか…そうであればPCI-Ex4(x2, x8, x16でも可)が複数ある場合なら問題なく行けるのかもしれませんね。残念ながら上記のマザーボードにはPCI-Ex4もx16も1つずつしかありませんので検証のしようが有りませんでしたが、これでいいなら選択肢はもう少し広がることになります。

3台接続に成功した構成

ということで、以下の構成でKinect3台の同時接続に成功しました。

CPU intel Core i7-2600(無印)
マザーボード MSI Z68A-G43(B3)
メモリ Geil EVO CORSA DDR3-1333 8GBx2
USBカード 玄人志向 USB3.0R-P2-PCI2 PCI-Ex1に接続
USBカード SilverStone SST-EC04 PCI-Ex4に接続

当然ながら、KinectマザーボードとそれぞれのUSBカードに1台ずつ接続しました。

PCI-Eのスロットの種類にも要注意

こうしてUSBコントローラの種類にも気をつけて別メーカーのコントローラを搭載したUSBカードを入手したのですが、2枚のUSBカードをいずれもPCI-Ex1のスロットに挿していると、2台目のKinectを認識しませんでした。
PCI-Ex1とPCI-Ex16、あるいはPCI-Ex1とPCI-Ex4の組み合わせなら無事認識しました。

同一USBコントローラの複数枚挿しには要注意

USBカードを色々試していたときに、まず玄人志向 USB3.0R-P2-PCI2がKinectを認識することがわかったので、同じカードをもう1枚買ってきて挿してみたところ、2枚目のUSBカードが全く認識されませんでした。orz
どうも同じコントローラチップを持つ複数のカードがあると、ドライバが2つ目を認識できないようです。
PCショップの店員さんによると、SATAカードなどでもよくあることらしいです。

USBコントローラの種類に注意

上記リリースノートには、

最大 4 台の Kinect センサーのサポート: 同一 PC に最大 4 台までの Kinect センサーを接続することができます。ただし、各センサーがそれぞれ独立した USB コントローラーに接続できるだけの性能を持つ PC であることが前提。(これまで通り、骨格追跡は1 プロセスにつき 1 台の Kinect でしか使用することができませんが、開発者は使用する Kinect センサーを選択することができます。)

と書かれており、Kinectを追加するには PCIまたはPCI-E接続のUSBカードが必要になります。
ところが、USBコントローラチップの種類によってはKinectを全く認識しないものがありました。

メーカー 製品名 PCI/PCI-E USB種別 USBコントローラ Kinectの認識
AREA SD-PEU3E-2E(Due・Sport) PCI-Ex1 USB3.0 Etron ×
AREA SD-PEU3V-2E2IL(OF2) PCI-Ex1 USB3.0 VLI ×
玄人志向 USB2.0N6P-PCI PCI USB2.0 Renesas μPD720101 ×
玄人志向 USB3.0R-P2-PCI2 PCI-Ex1 USB3.0 Renesas uPD020202
SilverStone SST-EC04 PCI-Ex1 USB3.0 TI TUSB7340

Kinect 3台接続までの道

どういうわけか今Microsoft Kinectを使ったイベント向けのシステムを作っています。3DCGの扱いが簡単なXNA Game Studio4.0上で、Microsoft公式のKinect SDKを使いC#で書いています。
リリースノートによると1台のPC4台まで接続できるようですが、実際にやってみるとハードウェアの相性と思われる問題に多数ぶち当ってしまいました。とりあえず3台までは同時に接続し色・深さ画像が取得できるようになりましたので、ここに記録しておきたいと思います。

CPU intel Core i7-2600(無印)
マザーボード MSI Z68A-G43(B3)
メモリ Geil EVO CORSA DDR3-1333 8GBx2

上記マザーボードには、USB3.0コントローラとしてRenesas μPD720200 を内蔵しておりKinect1台だけならUSBカードはいりません。
2台以上接続する場合にPCI(2本)またはPCI-E(x16,x4が1本ずつ、x1が2本)にUSBカードを接続することになります。(※伏線)