読者です 読者をやめる 読者になる 読者になる

hakobera's blog

技術メモ。たまに雑談

Mac で 「Kinectを使ってブラウザのWebGL内を動いてみた」

偉大なる元ネタ

Kinectを使ってブラウザのWebGL内を動いてみた - 最高のコンピューティング環境とは?

これがやりたくて、Kinect を買ったと言っても過言ではない。

準備

OpenNI

OpenNI をインストールしておいてください。

homebrew な人はこちらのエントリーの手順で。
Mac で Kinnect & OpenNI - Scalaとlift のはずだった ・・・

MacPorts な人はこちらのエントリーの手順で。
OpenNIがMacに対応したようです。NITEも動きます。 - some comments

node.js と Socket.IO

node.js は安定版の v0.2.6 を利用します。node.js は nvm を使ってインストールするのがオススメです。
続・複数のバージョンの node.js をインストールする - Sarabande.jp

nvm で node.js をインストールしたら、npm で Socket.IO をインストールしておきます。

npm install socket.io

OpenNI のサンプルの改変

"OpenNI/Samples/NiUserTracker" を改変します。元ネタでは、OpenNI -> node.js へのネットワーク通信部分が Windows 用なので、これを Mac (Unix) で動くように書き換えれば良いです。

具体的には、元ネタの diff をパッチした後に、network.cpp を以下のように変更します。

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "SceneDrawer.h"
#include "network.h"

Tunnel::Tunnel()
{
        char *dest = "127.0.0.1";
        unsigned short port = 8888;

        this->soc = socket(AF_INET, SOCK_STREAM, 0);

        struct sockaddr_in dest_addr;
        memset(&dest_addr, 0, sizeof(dest_addr));
        dest_addr.sin_family = AF_INET;
        dest_addr.sin_addr.s_addr = inet_addr(dest);
        dest_addr.sin_port = htons(port);

        if (connect(soc, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) < 0) {
                fprintf(stderr, "connection error\n");
                return; // todo exception
        }
}

Tunnel::~Tunnel()       // can't call. glutMainLoop() is never end.
{
        close(this->soc);
}

void Tunnel::send(char *in_mes)
{
        ::send(this->soc, in_mes, strlen(in_mes), SO_NOSIGPIPE);
}

ビルド

普通に make するだけです。

make

動作確認

node.js サーバ、OpenNIサンプル、ブラウザの順番で起動して、動きました。左が OpenNI、右がブラウザ(WebGL in Chrome 10)です。
f:id:scalar:20110123132225p:image

Unix C++ 初めて書いたので、たまに Segmentation fault するのは許してください。問題点のご指摘大歓迎です。

MacBook Air 13インチ (2010 late) で動作することを確認しているので、これでどこでもデモし放題ですね。あとはスケルトンにモデルを当てれるように改造していこうかと思っています。

Kinect 最高に面白いです!