hololensを試していました。

LINEで送る
Pocket



先日一週間ほどhololensを借りることができました。
最終的には中途半端な話になってしまいそうですが触ってみたので記録を残しておこうと思います。

って前置き無しなのも良くないのでそれなに?って言う方。
hololensの凄さはこの動画を見ると伝わるはずです。

ここ最近はOculusHTC ViveのようなVR機器やgoogle glassなどのメガネ系デバイスが出てきていますが、それらとは一線を画し、別の方向性での未来を感じることができるものでした。

違いとしては、

  • メガネ系デバイスで当然レンズの向こうが見えるので現実世界の上に映像(CG)を重ねることができる
  • リアルタイムで現実世界の形状を認識するので、テーブルの裏側にキャラクターが隠れたり、壁からモンスターが出て来るというような現実世界とリンクしたコンテンツを制作できる
  • hololens単体で動作する(PCが入っている)ので別途スマホを用意したりごついPCとケーブルでつなぐ必要がない。→ワイヤレスなので自由に空間を動き回ることができる!

というところでしょうか。

個人的にはリアルタイムで形状を認識している(メッシュを生成している)というだけで大興奮なのですが、VRのように視界すべてが映像で閉じられた別世界になるのではなく、現実世界を利用できるので「そこにいるから、hololensをつけているから体験できること」というコンテンツを作ることができるので大人数で体験する演劇やライブなどでも有効な使い方があるのではないかと思っています。




で、どんな感じでつくるのかな?ということでUnityで試してみました。

VRが流行ることでより五感を使った体験が重要度を増していると感じているのでhololensの音ってどんな感じだろうと思って音を使った何かを作ろうとしました。

目標としたものは
「壁や床などからボールが自分に飛んできて、それをひたすら避けるゲーム(?)」
です。

開発情報はやはり中村さんの記事を参考にしました。
さすがのスピード、さすがの充実感。
http://www.naturalsoftware.jp/entry/2016/04/07/093200

いざ作るぞ!と気持ちは高まったものの環境構築とかインストールに時間がかかってしまい、
結局本格的に試すまで進められなかったのですが、いざ作ってみると

  • 壁から向かってくるボールのスピードを速くしたかったが音にそこまでの指向性を感じられなかったのでよくわからないまま常にキョロキョロしないとかわすことができなかった
  • 素早くキョロキョロするとなるとhololensの視野角の狭さが気になってしまった(音がなっている方向を向いているつもりでも小さめの視野角にボールがなかなか入らず、音のなる方を向いているのにボールを発見できずに全然かわせない)

ということを嫌というほど実感することができました。(さらに動画まで撮り忘れてしまった・・・)

とはいえどまだまだ開発途中のデバイス、これからデバイスの性能も向上するだろうし、楽しみです。
なんというかSF映画で見た世界を突然現実に体験することができ、また自分がそのコンテンツを作ることができると思うとこれからワクワクしてたまりません。

で、こんなところで時間が無くなりそうだったのでタップするとボールがまっすぐ飛んでいって、壁に跳ね返る、というだけのものを作って一旦返却。

これだけでも現実世界のものにCG世界のオブジェクトが跳ね返り、そこから音がなっていることくらいはわかるようになります。

また借りる機会はあるのでもっと色々と作ってみて経験を積もうと思います。
もっとちゃんとしたアプリを作りたいと思いました。

なんだかんだ新しいことが多く覚えることも新しいことに触れるたびに増えて大変はありますが、新しいもの、未来を感じることができて幸せです。

また借りる機会ができたらもうちょっと音の面も深堀していこうと思います。


#VRもいじってるのにいきなりこっち書くのも順番すっ飛ばしている気がしますが、そちらは後日ということで。
#自宅の風景が映ってしまうのちょっと恥ずかしいですね・・・

MYOでレーザーをちょっと操ったことと気づいたこと。

LINEで送る
Pocket

こんばんは。
先日、1/30に前々からちらっと声はかけてもらっていたこちらのイベントでレーザーをやってきたのですが、せっかくなので先日届いたMyoを使えないかと思い立って実験もしてきましたのでその感想でも書いておきます。
こちらのイベントでした。Wombは相当久々。( http://iflyer.tv/ja/event/217868/

MYOとは筋電をとってジェスチャーの認識やら手の向きとかを取得できる腕輪のデバイス。
この動画で一時期すごい話題になりました。
https://www.thalmic.com/en/myo/

Kinectと違ってカメラでないので向きを気にしなくて良いのと、腕に巻くだけという気軽さからかなり使えるんではないかと思って注文しました。

すごい派手なところではこんな使われ方をしています。

まあとはいえ実際に動画のようにデバイスが使えるようになるにはかなりの苦労やノウハウが必要なのはいつものこと。
本番導入する前に現場で一度試してみよう、ということでとりあえず作ってみました。

やっていることは、腕のX, Y, Zの回転とジェスチャーを使って制御のon/offとキューの切り替えを実装して挑みました。
機能的には、
・Y軸の回転→レーザーの明るさの制御
・Z軸の回転→レーザーのキューのZ軸方向の回転
・手を握る→回転を使った制御のon/off切り替え(トグル)
・手を右へ動かす→次のキューへ移動
・手を左へ動かす→一つ前のキューへ移動
という感じです。
このジェスチャに合わせてMIDIを送るだけです。

で、やってみたのがこんな感じです。動画は朝方のクローズ直前くらいにブースから出てフロアで切り替えてたのですごいわかりにくいですね。すみません。

実際にやってみると複数ジェスチャを組み合わせてやるには誤認識が多くてあんまり使えなかったけど、Y軸方向の回転を使うのは比較的思い通りに動かせました。

気をつけたほうがいいなあ、と思ったのは、
・回転を使う場合、当然ながら人の可動域は体の柔らかさによっても異なるし、360度の回転なんてできるもんじゃないので反応する範囲をどう設定するかが大事。
・回転のon/offは初めはダブルタップ(親指と中指を素早く2回触れるジェスチャ)にしていたのですが誤認識が多かった。(手を右に動かすジェスチャの時に特に多かった。これは僕の動き方の問題とは思いますが)
・特にZ軸の回転をさせようと思った時に多かったのですが、人の体なんで当然Z軸の回転をさせようとしてもXY軸も動くわけで、ぐるぐる回すつもりが明るさが変わってしまうということがありました。

このへん改善してもうちょっといろんなものを制御しようと思います。

よかったのは、当たり前ではあるけどピークタイムでも混線もなく無事に動作したこと。VJブースがフロア前方で、フロアであれば後ろの方でも全く問題ありませんでした。

Arminのも仕組みとしてはわかるので改善してこういうのやりたいなあ。どなたかやりません??

Tokyo MotionControl Network #7でLTしてきました。

LINEで送る
Pocket

珍しく開発者っぽい投稿?です。

昨日の2014/05/08、Tokyo MotionControl Networkというイベントに参加して、LTで発表してきました。
http://tmcn.doorkeeper.jp/events/10492

で、こういうイベント久しぶりだけどまじめな雰囲気やろうなーどうしよっていう感じだったのですが、開会の挨拶とか聞いていると結構柔らかいというか緩い感じだったので安心し、さらにお酒が(焼酎とか!)あったので調子に乗ってガンガン呑んでました。。。そして結構な仕上がり・・・・

しゃべれなくなると思って喋る内容を資料に打ち込んでいたのですが結果かなり饒舌にしゃべれた気がします!
うけたのではないでしょうか。(自賛)

その後もいろんな方と面白い話ができていってよかったです。

モーションセンサー系とかに興味ある方はいってみると同じ事で盛り上がれる人に知り合えてよいのではないでしょうか?

あと、運営のみなさま、いろいろとご無理を通していただいてありがとうございました!

あ、発表した内容は都合によりアップはしないですがブログに書いているような内容をしゃべってきました!

Science Nonfiction Premiere feat. TeddyLoid

LINEで送る
Pocket

と言う訳で当日の映像です。

Science Nonfiction is a complex of Japanese creators living in Tokyo but the members are not revealed……yet

です。
何かありましたらcontactまでどうぞ。

2013/04/05 block.party@clubasiaにて

LINEで送る
Pocket

ブログを書くのがかなり久々になってしまいました。

ちょっと時間がかかってしまいましたが、ようやく音楽と技術を融合したものを発表する事ができるようになりました。

さて、先日4/5。こちら。進化し続けるblock.fmのパーティーである、block.partyです。
http://iflyer.tv/ja/article/2013/04/04/new-block-party/

ステージ全面をスクリーンにするという大迫力な映像体験。
その中で僕はというと
Science Nonfictionとしてblock.partyで3分間のショーケースをやってまいりました。
豪華すぎるメンバーと曲が良いのはもちろん、こういった新しい事への興味と柔軟性が尋常ではないくらい優れているTeddyLoidさんをフィーチャーし初披露。

概要としては、
Kinectを使って人の動きから映像と音楽とレーザー(参考動画には無いかも?)をインタラクティブに制御するというものです。

実験的な映像とかはありましたが、ここまで作り込んだ物はあまり無いのではないでしょうか。

グラフィック、映像、音楽、全体をくみ上げるための脚本などそれぞれすごい人が集まって作り上げたのですが、やはりそれぞれのみんながすごいので、
ストーリーを考えてはおもしろいものが出来そう、とテンションがあがり、
あがってくる曲を聴いては良い曲過ぎてテンションがあがり、
グラフィック(GUIやロゴ)があがってきてはテンションがあがり、
映像があがってきてはあまりのかっこうよさにテンションがあがり、
リハでTeddyLoidさんがあまりにも上手にライブ感ある演奏とどでかいスクリーンと迫力のあるサウンドシステムでみてはテンションがあがりと、最後の方は駆け込みで色々やって大変でしたがすごくやる気が高まるおもしろいお仕事でした。
僕はというとそれらの要素をインタラクティブなアプリとしてくみ上げたり音楽や映像やレーザーがうまく連携できるようにプログラムを書いてつなげるところを担当しました。

プログラム(オーサリング、通信部の開発)
というところでしょうか。

普段は原則一人で仕事をしているし、あまりチーム仕事が得意では無かったのですが今回のようなチームでやれるのであればみんなで組んで一つのものを作り上げるのも良いな、と思いました。
本番が始まるまでは本当にドキドキで久々に緊張したのですが、無事に動いてお客さんがすごい喜んでくれている歓声を聞いたときに報われた気がしました。

まだまだ改善点や反省点はありますが、これからもっともっとおもしろいものを作って行こう!と改めて決意したのでした。

参考動画(本番の動画が無いのでリハの様子です。):

改めて関係者のみなさま、これをみて楽しんでいただいた方本当にありがとうございました。
これからもよろしくお願いいたします。

OpenNIのライセンスが気になったので聞いてみた

LINEで送る
Pocket

KinectやXtionを使ってアプリ開発するときには、Kinect for WindowsのSDKであれば
Kinect for Windowsのデバイスを買い、Windowsアプリを作るのであればライセンスの心配をする事はありません。
一方のOpenNIはLGPLやらGPLやらと書いていて、GPLの解釈については動的リンクでもソースコードの公開義務があるとする解釈もあり商用案件で使うにはやはり躊躇してしまいます。

とはいえOpenNIになじんでいたのでOpenNIの開発元の一つである、primesenseにメールで直接問い合わせました。

返答がこれ。

The LGPL constraint that you are mentioning only applies if you are modifying OpenNI using it source code. If you are using OpenNI as-is, then you do not need to uncover anything about your own code! OpenNI is FREE for commercial use, but softwares using OpenNI do not need to inherit the LGPL license. For examples, NiTE is not LGPL nor open source, it’s a Primesense proprietary software.

要するに、「OpenNIをそのまま使うのであればソースコードを公開する必要は無いよ、実際NiTEはオープンじゃないし」
って事で公認がもらえたと思ってるので商用案件でもOpenNIを導入して良さそうですね!

その後も少しやりとりしていると、Apache ライセンスに変えるか検討しているようでした。

ライブでのKinect使用例

LINEで送る
Pocket

少し前の話になりますが、2011/12/22にageHaにて行われた
「m-flo presents BONENKAI」でBoxステージでのPanty & Stocking OrchestraのライブにてKinect+OpenNIを使った演出を行いました。

ちょっとわかりにくいですが、右下にいるアーティストの動き(この画像はTeddyLoidさん)にあわせてスクリーン上のロボットが動く、というものです。OpenNI Unity Wrapperを使いました。

pso_kinect

より効果的に見せるための課題など反省点は色々ありますが、まずは問題なく本番で使う事ができて一安心です。

今年2012年はよりパワーアップしたものをお届けするべく頑張りますのでよろしくお願いします。

OpenNIのUnityWrapper

LINEで送る
Pocket

このエントリはOpenNI Advent Calendar 2011 : ATNDの12月24日分です!!


さてクリスマスイブですが、
少し前からOpenNIにはUnityWrapper版が存在していますのでそれについて紹介します。

unity_screenshot

最近話題になっている、ゲームの開発環境のUnity3Dというものがあり、OpenNIのサイトからUnity3Dで使うためのUnityWrapperをダウンロードできます。

追記:
2013/06/12時点では(もう少し前からだったと思います)OpenNI公式のUnityWrapperは配布していません。
有料ではありますがこちらのZigfuを使えば同じ事+それ以上の事が出来ます。

opennidownload


Unity3Dについて:

Unity3D ( http://unity3d.com/unity/ ) とはゲーム開発ツールであり、WindowsとMacのどちらでも開発する事が可能です。
IDEがあるのでステージの画面を見ながら次々とオブジェクトを配置するだけでゲームの世界を簡単に作る事ができます。
プログラムはJavascriptとC#(mono)で書く事ができるのでweb開発者や.NETの開発者にも取っ付きやすいのではないでしょうか。
MacでもC#で記述する事ができます。

また、一人でグラフィックやサウンドやモデリング、プログラムを行うのは大変ですが、Unity3DではAsset Storeというものが用意されており、これを利用する事で必要な素材を入手する事ができるので気軽にゲーム開発を進める事ができます。

Unity3Dの無料版、有料版、ライセンスについて

無料版と有料版があり、無料版では制限はいくつかありますが、WindowsとMacで実行できますし、有料版にアップグレードする事でAndroidやiOSに対応させる事も可能です。
詳しいライセンスなどはUnity3Dのサイト( http://unity3d.com/unity/licenses )か、「強火で進め」さまのサイトが詳しいです。( http://d.hatena.ne.jp/nakamura001/20110710/1310292561


Unityのダウンロードからインストール

それでは、Unityをダウンロードしましょう。

http://unity3d.com/unity/download/より、Unityをダウンロードし、流れに沿ってインストールしてください。
インストール後、先ほどOpenNIのサイトからダウンロードしたファイル(Unity OpenNI toolkit 0.9.7.1.unitypackage )をダブルクリックしImport Packageより一式をunityにインポートします。
importが完了すると、Projectタブにこのようなファイル群が表示されます。
unity_project

OpenNI/Sample Scenes以下にすぐに試せるようなサンプルシーンが入っていますのでダブルクリックしてシーンを開き、三角の再生ボタンを押して次々と試してみるとUnity3D+OpenNIの可能性を試せると思います。
Unity_IDE

私はライブなどで使ったりしていますが、骨格をちゃんと映していれば問題なく現場でも使えます。今のUnityWrapperだと全身映す前提のコードになっているので、上半身だけ認識などに変更する事でより柔軟なアプリケーションが開発できます。

ではそれぞれのサンプルのキャプチャやサンプル動画をのせておきます。


サンプルのシーンについて

MultipleSkeletons:
僕は一人なので試せませんでしたが、複数人のスケルトンを認識できるサンプルだと思います。
MutipleSkeletons
NIGUIControl:
NIGUIControl
NIInputControl:
すごく地味なのですが、手を動かすと黒い四角が追従します。XBoxでもあるような、手で操作するゲームはこれを使うと作れそうですね。

SimpleGame:
上からふってくるボールにタッチするゲームです。実際に動いたりジャンプするとそれにあわせて画面も動きます。一番運動している感じになりそうですね。

SingleSkeleton:
スケルトンの情報をもとに画面のキャラクターが動きます。

せっかくなのでスケルトンをサンタにかえてみましたよ。サンタ気分で小さく踊ってみました。
あ、サンタのデータはAsset Storeで購入可能ですよ!

※この記事は、下記の環境で確認しました。

OpenNI 1.5.2.7
NITE 1.5.2.7
Unity3D 3.4.2f3

OpenNIをOpenframeworksで使う

LINEで送る
Pocket

このエントリはOpenNI Advent Calendar 2011 : ATNDの12月23日分です!!

OpenframeworksでOpenNIの連携について書きます。

Openframeworks ( http://www.openframeworks.cc/ )(以下、oF)とは、メディアアート界隈で使われている描画や動画の扱いやプログラムの書き方がprocessingっぽく作られている、クロスプラットフォームで動作するC++のフレームワークです。
oFはたくさんの有志により様々なアドオンが配布されており、それを使うとソケットやOSC、OpenCVなどの機能を簡単に使う事ができます。

oFで使えるアドオン

oFで使えるKinect関連のアドオンがいくつか、下記のものがあります。
・ofxKinect: ( https://github.com/ofTheo/ofxKinect )
→深度情報とRGBが取得できます。スケルトンの取得機能はありません。
・ofxOpenNI:( https://github.com/gameoverhack/ofxOpenNI )
→OpenNIをoFで使えるように作ったもの。

ただ、OpenNI自体バージョンアップが早い事もあるので今回は普通のOpenNIをoFで使う方法を紹介します。

oFを使えるようにする

oFのWebサイトから必要なファイルをダウンロードします。私の場合はMacなのでosxバージョンをダウンロードします。
http://www.openframeworks.cc/download/

ダウンロードしたファイルを解凍すると下記のフォルダ構成になっています。

  • add ons / oFのアドオンが格納されています。
  • apps / サンプルプログラムがたくさん入っています。実際にoFでアプリを開発する場合はこの中のexamples/EmptyExampleをベースにします。
  • libs / oF自体のライブラリやoFが使っているライブラリが格納されています。

of_directory

では、oFの基本を理解するために EmptyExampleをみてみます。

testApp.cppをみてみましょう。
はじめに定義されているメソッドの実装を進めて開発を進めます。

setup() :
アプリケーションの起動時あるいはnewした直後に呼ばれる関数です。初期化などはここで行います。
update():
毎フレーム毎draw()の前に呼ばれます。ここでデータや座標計算の更新をすると良いでしょう。
draw():
毎フレーム毎、update()の後に呼ばれます。ここには描画処理をかきます。

基本的にはこれらを使うのですが、マウスやキーボードのユーザー入力にも対応しています。

keyPressed, keyReleased:
キーボードを押したとき、離したときに呼ばれます。
mouseMoved, mouseDragged, mousePressed, mouseReleased:
マウスの移動、ドラッグ、マウスダウン、マウスを離した時に呼ばれます。

OpenNIの設定:

準備

今回はとにかく簡単に使えるようになる事を考えて説明します。
まず、OpenNIのIncludeとLibフォルダをプロジェクト直下に”OpenNI”というフォルダを作成し、そこに移動します。

次にプロジェクトにヘッダー参照パスとライブラリパスの設定をします。
プロジェクト設定の “Build Settings” → “Search Paths”の

Header Search Pathsに以下を設定します。
“$(SRCROOT)/../OpenNI/Include
Library Search Pathsに以下を設定します。
“$(SRCROOT)/../OpenNI/Lib

※設定後、自動的に別の項目に変更される場合がありますが、ビルドが通れば問題はありません。
私の環境では、
HEADER_SEARCH_PATHS_QUOTED_FOR_TARGET_1
LIBRARY_SEARCH_PATHS_QUOTED_FOR_TARGET_1
の項目が追加されていました。

さて、それではOpenNIのコードを書いてみましょう。NiSimpleViewerをパク、、いやもとにして、深度情報を表示させてみましょう。
表示にはoFTextureクラスを使い、テクスチャとして表示させます。

今回は簡単に移植するため、NiSimpleViewerからコピペする事にします。
まず、

testApp.h

testApp.hに下記を追加します。

#include <XnCppWrapper.h>
using namespace xn;
//---------------------------------------------------------------------------
// Defines
//---------------------------------------------------------------------------
#define SAMPLE_XML_PATH "../../../data/SamplesConfig.xml"

#define DISPLAY_MODE_DEPTH		2
#define DEFAULT_DISPLAY_MODE	DISPLAY_MODE_DEPTH

#define MAX_DEPTH 10000

SamplesConfig.xmlはbin/data/以下に設置したため、
SAMPLE_XML_PATHを変更しています。

——-

testApp.cpp

testApp.cppに”Globals”の内容をもとに移植します。

//---------------------------------------------------------------------------
// Globals
//---------------------------------------------------------------------------
float g_pDepthHist[MAX_DEPTH];
XnRGB24Pixel* g_pTexMap = NULL;
unsigned int g_nTexMapX = 0;
unsigned int g_nTexMapY = 0;

unsigned int g_nViewState = DEFAULT_DISPLAY_MODE;

Context g_context;
ScriptNode g_scriptNode;
DepthGenerator g_depth;
DepthMetaData g_depthMD;

——–
NiSimpleViewerのmain関数が初期化に関する内容なので、setupに移植します。

	XnStatus rc;
	
	EnumerationErrors errors;
	rc = g_context.InitFromXmlFile(SAMPLE_XML_PATH, g_scriptNode, &errors);
	if (rc == XN_STATUS_NO_NODE_PRESENT)
	{
		XnChar strError[1024];
		errors.ToString(strError, 1024);
		printf("%s\n", strError);
		return ;
	}
	else if (rc != XN_STATUS_OK)
	{
		printf("Open failed: %s\n", xnGetStatusString(rc));
		return;
	}
	
	rc = g_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
	if (rc != XN_STATUS_OK)
	{
		printf("No depth node exists! Check your XML.");
		return;
	}
	
	g_depth.GetMetaData(g_depthMD);
	
	// Texture map init
	g_nTexMapX = (((unsigned short)(g_depthMD.FullXRes()-1) / 512) + 1) * 512;
	g_nTexMapY = (((unsigned short)(g_depthMD.FullYRes()-1) / 512) + 1) * 512;
	g_pTexMap = (XnRGB24Pixel*)malloc(g_nTexMapX * g_nTexMapY * sizeof(XnRGB24Pixel));

——-
setup関数の最後にofTextureクラスとofTextureで表示させるためのunsigned char*のデータをを初期化します。

	pixels = (unsigned char*)malloc(640*480*3*sizeof(unsigned char));
	tex.allocate(640, 480, GL_RGB);

——-
OpenNIでのデータを更新する処理をupdateに移植します。

	XnStatus rc = XN_STATUS_OK;
	
	// Read a new frame
	rc = g_context.WaitAnyUpdateAll();
	if (rc != XN_STATUS_OK)
	{
		printf("Read failed: %s\n", xnGetStatusString(rc));
		return;
	}
	
	g_depth.GetMetaData(g_depthMD);
	//g_image.GetMetaData(g_imageMD);
	
	const XnDepthPixel* pDepth = g_depthMD.Data();
	
	// Calculate the accumulative histogram (the yellow display...)
	xnOSMemSet(g_pDepthHist, 0, MAX_DEPTH*sizeof(float));
	
	unsigned int nNumberOfPoints = 0;
	for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
	{
		for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth)
		{
			if (*pDepth != 0)
			{
				g_pDepthHist[*pDepth]++;
				nNumberOfPoints++;
			}
		}
	}
	for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
	{
		g_pDepthHist[nIndex] += g_pDepthHist[nIndex-1];
	}
	if (nNumberOfPoints)
	{
		for (int nIndex=1; nIndex<MAX_DEPTH; nIndex++)
		{
			g_pDepthHist[nIndex] = (unsigned int)(256 * (1.0f - (g_pDepthHist[nIndex] / nNumberOfPoints)));
		}
	}
	
	xnOSMemSet(g_pTexMap, 0, g_nTexMapX*g_nTexMapY*sizeof(XnRGB24Pixel));
	
	// check if we need to draw depth frame to texture
	const XnDepthPixel* pDepthRow = g_depthMD.Data();
	XnRGB24Pixel* pTexRow = g_pTexMap + g_depthMD.YOffset() * g_nTexMapX;
	
	for (XnUInt y = 0; y < g_depthMD.YRes(); ++y)
	{
		const XnDepthPixel* pDepth = pDepthRow;
		XnRGB24Pixel* pTex = pTexRow + g_depthMD.XOffset();
		
		for (XnUInt x = 0; x < g_depthMD.XRes(); ++x, ++pDepth, ++pTex)
		{
			int idx = (x + y * g_depthMD.XRes()) * 3;
			if (*pDepth != 0)
			{
				int nHistValue = g_pDepthHist[*pDepth];
				
				pixels[idx] = nHistValue;
				pixels[idx+1] = nHistValue;
				pixels[idx+2] = nHistValue;
			}
			else
			{
				pixels[idx] = 0;
				pixels[idx+1] = 0;
				pixels[idx+2] = 0;
			}
		}
		
		pDepthRow += g_depthMD.XRes();
		pTexRow += g_nTexMapX;
	}
	
	tex.loadData(pixels, 640, 480, GL_RGB);

ofTextureのloadDataメソッドを使い、深度データをテクスチャとして読み込ませます。
——
最後にdrawメソッドにofTexetureのdrawを使って実際に描画します。

引数は、x座標、y座標、幅、高さを示しています。
—–

これでビルドすると表示できるようになります。
たくさんの警告はありますが、ライブラリ内部的なものもあるので無視する事にします。

advant_of

ファイル一式をこちらにアップしましたのでダウンロードして試してみてください。
https://github.com/mmlemon/OpenNI_Advent_oFSample

※OpenNIは1.4.0.2、oFは007で記述しています。

[修正]スケルトン認識ポーズいらずのOpenNI1.4.0.2がリリースされました!

LINEで送る
Pocket

OpenNIの新しいバージョンがunstableながら出たようです。(バージョンは1.4.0.2)
http://75.98.78.94/
※ググった結果の一番上なんですけどなんでIPアドレスなんだろう。。。

今回からなんとOpenNIでスケルトン認識する時の例のポーズがいらなくなった、という大きすぎるアップグレードがあります。
「かおるんダイアリー」様が早速デモ動画をアップされています。
http://d.hatena.ne.jp/kaorun55/20111121

MSのSDKでは画面から外れた時の暴れっぷりや全身が映っていないときの反応がちょっと荒かった印象がありましたが、OpenNIの方は比較的ましな感じがしています。

今はSensorKinectの人にも問い合わせしているので進展があれば追記します。

早速試したかったのですが、僕の環境では実行しようとしても
Segmentation fault: 11
が出てしまい実行できませんでした。

あまりにもわからなかったのでOpenNIのGoogleGroupで質問してみたところ、
Kinectの時に使っているドライバ、SensorKinectが新しいバージョンに対応していないからだそうです。

これはOpenNI使う時はKinectじゃなくてXtion使えよ、っていうことなんでしょうかね。。。

追記:
動作することを確認しました。
すみません。僕が使っていたSensorKinectが古かったようです。

ここにあるバージョン(5.0.5.1で確認しました)を使うと無事動作しました。
OpenNI, SensorKinect、NITE、入れていればOpenNIのサイトにあるSensorをアンインストールし、KinectをUSBから抜いて再度インストールすると問題なく動作するようになりました。
(NITEは先ほどリリースされた1.5.0.2をインストールしました。)
https://github.com/avin2/SensorKinect

さあ、これで試せるよ!

備考:
動作確認バージョン:
OpenNI: 1.4.0.2
NITE: 1.5.0.2
SensorKinect 5.0.5.1
Mac OS X 10.7 Lion
デバイス: Kinect

撮影するための環境が無くて僕とKinectの距離が近かったのでスケルトンが暴れていますが、実際はもう少しましだと思います。

これになったことでスケルトンを使ったアプリを作りやすくなりましたが、暴れることが以前より多くなった(当然)ので、こういったノイズデータをハンドリングする必要がありそうですね。