書き物

技術とか作った物の話とか愚痴文句感想など

Kinect と Blender でモーションキャプチャしたい 1

Blender で作ったものを Flash で表示する(アニメーション) で、Blender からアニメーションデータ出力 → Flash で表示まで出来ました。あとは Blender でうまいことアニメーションを作れるようになれば・・・という状態です。 Kinect を使えば、家でモーションキャプチャの環境を作れるというようなことをどこかで聞いたので、色々調べた結果、とりあえずKinect から Blender へデータを渡し、Blender 上のモデルを動かすことが出来たので記録しておきます。せっかくなので、商用可な正規版 SDK でがんばりました。

対象環境

1. Kinect の準備 買いましょう・・・っ!

動かすだけなら Xbox 版でも動くのでしょうか?持っていないので分かりません。

Kinect for Windows SDK v1.5」の導入については、 Kinect for Windows SDK v1.5」がリリースされています が参考になるかと思います。

2. Kinect から Blender へデータを渡す準備 2.1. ツールのダウンロード Kinect for Windows SDK を使った、KinectBlender の連携ツールとして、「Blender Loop Station (Bloop)」があります。 Arbeitsgruppe Digitale Medien: Bloop しかしこのツール、SDK の Beta 版対応のようで、SDK v1.0 以降では動きません。 仕方ないので、v1.0 に対応するよう、ソースを修正しました。 この本と共に格闘。

現時点(2012/05/31)での SDK 最新バージョンは v1.5 なので、v1.5 環境でコンパイルしています。 勝手に “AMBloop” と名付けて github へ上げました。 asahiufo/AMBloop at 439bd77bf6cc5b885020a6647e2edd095eba0692 ここの ZIP をクリックして、ソースを一式ダウンロードして下さい。

2.2. Blender のアドオン追加 zip ファイルを解凍すると以下のフォルダが出てきます。

  • bloop
  • KinectToOsc
  • nui
  • samples

「bloop」と「nui」フォルダを、Blender の以下のアドオンフォルダへコピーします。 パス「[Blender のインストールフォルダ]\2.63\scripts\addons」

2.3. マッピング処理追加 現段階のソースでは、GUI 上で Kinect の各部位のデータと、Blender 上のモデルとを、どのように対応させるかの設定が出来ないようです。そのため、上記「bloop」のソースにマッピング設定をハードコーディングしなければなりません。(後々 GUI で設定できるよう直していきたい・・・) アドオンフォルダの「bloop」内の「bloop_op.py」をテキストエディタで開きます。 321行目の execute メソッドを以下のように修正します。 修正前 def execute(self, context): if self.name == “”: self.name = Bloop.generic_mapping_set_name() bpy.bloop.add_mapping_set(name=self.name, rotational=self.rotational) context.window_manager.bloop_props.mapping = self.name return {“FINISHED”} 修正後 この修正は、「samples」フォルダの「hopping_kangaroo.blend」に対応しています。 def execute(self, context): #if self.name == “”: # self.name = Bloop.generic_mapping_set_name() #bpy.bloop.add_mapping_set(name=self.name, rotational=self.rotational) #context.window_manager.bloop_props.mapping = self.name

    # add standard mapping sets for the kangaroo


    kangaroo = bpy.context.active_object

    k_map_1 = bpy.bloop.add_mapping_set(name="Head and Tail")
    k_map_1.map("r_hand", 1, kangaroo.pose.bones["Head Handle"])
    k_map_1.map("l_hand", 1, kangaroo.pose.bones["Tail Handle"])

    k_map_2 = bpy.bloop.add_mapping_set(name="Hands and Feet")
    k_map_2.map("r_hand", 1, kangaroo.pose.bones["Hands Handle"])
    k_map_2.map("l_hand", 1, kangaroo.pose.bones["Feet Handle"])

    k_map_3 = bpy.bloop.add_mapping_set(name="Dual User")
    k_map_3.map("r_hand", 1, kangaroo.pose.bones["Head Handle"])
    k_map_3.map("l_hand", 1, kangaroo.pose.bones["Tail Handle"])
    k_map_3.map("r_hand", 2, kangaroo.pose.bones["Hands Handle"])
    k_map_3.map("l_hand", 2, kangaroo.pose.bones["Feet Handle"])

    #k_map_4 = bpy.bloop.add_mapping_set(name="Ears")
    #k_map_4.map("r_hand", 1, kangaroo.pose.bones["Right Ear"])
    #k_map_4.map("l_hand", 1, kangaroo.pose.bones["Left Ear"])

    context.window_manager.bloop_props.mapping_set = "Head and Tail"


    return {"FINISHED"}

2.4. アドオン有効化 「File > User Preferences…」から User Preferences... 「Addons」のページで、「Animation: Bloop」と「Development: NUI Interface」を有効化します。 bloopnui (あまり安定しているアドオンでは無いため、不要な時は無効化しておいた方がいいかも)

3. モーションキャプチャ実行 3.1. サンプルを開く 2.1.のフォルダ内の「samples」に「hopping_kangaroo.blend」というファイルがあります。このファイルを Blender で開きます。 Open 3.2. Bloop 起動 左の「Bloop」メニューの「Start Bloop」ボタンと「NUI」メニューの「Start user display」ボタンを押下します。 3.3. マッピング設定 「Bloop」メニューの「New Mapping Set」を押下します。こういう画面になりますが、そのまま「OK」ボタンを押下します。 New Mapping Set 「Current Mapping」で、"Head and Tail" を選択します。 結果、このようになります。 Result menu これは、BlenderKinect からのデータに対し、

  • Kinect の右手位置 → カンガルーの頭
  • Kinect の左手位置 → カンガルーの尾

として処理する準備が出来たという状態です。 3.4. Kinect のデータを Blender へ送信 2.1.のフォルダ内の「KinectToOsc\source\KinectToOsc\bin\Release」の「KinectToOsc.exe」を実行します。 KinectToOsc.exe 「Initialize Kinect runtime」を押下します。 カメラが写ったら、出来るだけ全身が映るように Kinect へアピール!Kinect が人物を検出したら、以下のようにスケルトンが表示されます。 検出 Blender にも、このような人物が表示されれば、正常にデータ連携が出来ています。 シェー 3.5. スケルトンデータをモデルへ反映 「Bloop」メニューの「Mode」を “Calibration” にします。 「Calibration」ボタンが現れますので、押下します。 (「Calibration」ボタンが押せない場合、Mapping モードに戻し、再び「Current Mapping」を切り替えて再度 “Head and Tail” を選択して下さい。) Calibration 静止画だと分かりにくいですが、右手左手に応じてカンガルーの頭と尾がグネグネ動くようになりました!! モーションキャプチャ成功 ※これ以降、「Recording」「Start」すればアニメーションを記録できるのですが、これはもう少し詰めてから別途書きます。

終わりに ひとまず KinectBlender の連携が出来たことで、今後楽にリアルなアニメーションを作れるかもしれないという夢が広がりまくりです。 AMBloop については、以下の課題を解決すべく、もう少し改造していこうと思います。

  • GUIKinect のスケルトンデータの各部位と Blender のモデルとの紐付けを出来るようにする。
  • Kinect 上での座標情報と、Blender 上での座標情報との差異調整。