KOSAKA LABORATORY->Tips

Kinect SDK XNAでカメラ角度の設定

kinect.jpg

Kinectには、首振り機能があるらしいです。Kinectは持っているけどXBoxは持ってないので分かりませんが・・・。横には振らないみたいです。上下に首を振ってくれます。
 前回は、Kinect for Windows SDKでカメラ角度の取得を行う方法を解説しました。今回は、そのカメラ角度を設定する方法を解説します。


ソース
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Research.Kinect.Nui;  //Kinect Uniの読み込み

namespace WindowsGame6
{
  /// <summary>
  /// 基底 Game クラスから派生した、ゲームのメイン クラスです。
  /// </summary>
  public class Game1 : Microsoft.Xna.Framework.Game
  {
    GraphicsDeviceManager graphics;

    Runtime nui;  //Kinectのセンサクラス

    public Game1(){
      graphics = new GraphicsDeviceManager(this);
      Content.RootDirectory = "Content";
    }

    protected override void Initialize(){

      base.Initialize();

      nui = new Runtime();  //Kinectセンサクラスの初期化

      try{
        //奥行の取得、トラッキング、実画像
        nui.Initialize(  RuntimeOptions.UseDepthAndPlayerIndex |
                RuntimeOptions.UseSkeletalTracking |
                RuntimeOptions.UseColor);
  
      }
      catch (InvalidOperationException){
        Console.WriteLine("Runtime initialization failed.");
        return;
      }
    }

    protected override void LoadContent(){

    }

    protected override void UnloadContent(){
    }

    protected override void Update(GameTime gameTime){
      if(GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

      KeyboardState keyState = Keyboard.GetState();
      keyState = Keyboard.GetState();
      
      try{
        //キーボードの↑ボタンを押すと
        if(keyState.IsKeyDown(Keys.Up)){
          //カメラ角度を27へ設定
          nui.NuiCamera.ElevationAngle=27;
        }
        //キーボードの↓ボタンを押すと
        if(keyState.IsKeyDown(Keys.Down)){
          //カメラ角度を-27へ設定
          nui.NuiCamera.ElevationAngle=-27;
        }
      }catch{
      }

      //Kinectのカメラ角度の取得
      Console.WriteLine(  nui.NuiCamera.ElevationAngle);

      
      base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime){
      GraphicsDevice.Clear(Color.CornflowerBlue);
      base.Draw(gameTime);
    }

  }
}
実行結果
 キーボードの↑矢印キーを押すことで、Kinectが上を向きます。反対に↓矢印キーを繰り行くするとKinectが下を向きます。

 公式のマニュアルを見ると角度の値は、以下の通りになっています。
   ElevationMaximumの値が+27 
   ElevationMinimumの値が-27
 この値以外(‐27 ~+27)の値を入れるエラーで怒られます。
 
角度を設定して、その角度に移動するまでに次の値を入れると例外が発生します。
(※今回のプログラムではTryCatchで無視してます)