色々あって、Xtion PRO LIVE関連の開発を行う事になった。
サンプルコードが色々公開されているものの、最新版のXcodeでのビルド方法に関する情報がなかなか見付からなかったので、備忘録としてここに記しておく。
今回ビルドに成功したのは、NiSimpleReadとNiSimpleViewer、あとNITEのSingleControl。
Xcodeで新規C++プロジェクトを作成してから、main.cppを上書きする方法を採った。
いずれもコード本体を改変する必要はないのだが、ビルド設定が重要。
1. NiSimpleReadの場合
TARGETS -> Build Settings -> Other Linker Flags: /usr/lib/libOpenNI.dylib
TARGETS -> Build Settings -> Header Search Paths: /usr/include/ni
2. NiSimpleViewerの場合
TARGETS -> Build Settings -> Header Search Paths: /usr/include/ni
TARGETS -> Build Phases -> Link Binary With Libraries: OpenGL.framework GLUT.framework
3. SingleControlの場合
TARGETS -> Build Settings -> Other Linker Flags: /usr/lib/libOpenNI.dylib /usr/lib/libXnVNite_1_5_2.dylib※バージョンは環境によるので注意
TARGETS -> Build Settings -> Header Search Paths: /usr/include/ni /usr/include/nite
正直な所、NiSimpleViewerでOther Linker Flagsが何故設定不要なのかよく分かっていなかったりするのだが、取り敢えず上記の通り設定すればビルドは通る筈。
あと、Xtion動作させる時はSamplesConfig.xmlなりSample-Tracking.xmlなりを参照する必要があるが、いずれもビルド済バイナリと同一フォルダ内を参照するようにコードを改変して、TARGETS -> Build Phases -> Copy Filesで自動コピーするように設定しておくと便利。
DestinationはProducts Directoryを選択、Subpathは空欄でOK。
SingleControlをちょっといじると、ハンドトラッキングと同時にマウスポインタのコントロールが可能になって楽しい。
main.cppの冒頭に
#import <ApplicationServices/ApplicationServices.h>
を追加して、void XN_CALLBACK_TYPE OnPointUpdateに
CGDirectDisplayID displayID = kCGDirectMainDisplay;
CGPoint p1;
float DispCentX = CGDisplayPixelsWide(displayID) / 2.0;
float DispCentY = CGDisplayPixelsHigh(displayID) / 2.0;
p1.x = 2500.0 * pContext->ptPosition.X / pContext->ptPosition.Z + DispCentX;
p1.y = -2500.0 * pContext->ptPosition.Y / pContext->ptPosition.Z + DispCentY;
CGDisplayMoveCursorToPoint(displayID, p1);
を書き加えればOK。
本当はNITEのPointViewerをカスタマイズしたいのだが、OpenGL ES絡みのエラーでどうしてもビルドが通らない。
Xcode Project形式でサンプル配布してくれれば助かるんだがな…。