Windows.Kinect 네임스페이스를 사용할 수 있으며, 여기 속에 키넥트 관련 모든것이 들어있다.
우선 센서를 불러와서 연 후, 센서로부터 오는 프레임마다 담겨있는 데이터를 이용한다.
간단한 예제를 첨부한다.
두 손의 위치를 받아온 후 각각 게임오브젝트 위치에 넣어준다. 손의 움직임을 트래킹한다고 보면 됨.
단, 테스트용으로 짠거라서 마지막으로 인식된 한 사람의 손의 위치만 받아온다.
usingUnityEngine;usingSystem.Collections;usingWindows.Kinect;publicclassMain:MonoBehaviour{KinectSensorm_Sensor;Body[]m_Body=null;BodyFrameReaderm_bfReader;[SerializeField]GameObjectLeftHand,RightHand;// Use this for initializationvoidStart(){//키넥트센서, 리더 가져온다m_Sensor=KinectSensor.GetDefault();if(m_Sensor!=null){m_bfReader=m_Sensor.BodyFrameSource.OpenReader();if(!m_Sensor.IsOpen)m_Sensor.Open();}}// Update is called once per framevoidUpdate(){if(m_bfReader!=null){//한 프레임 얻는다BodyFrameframe=m_bfReader.AcquireLatestFrame();if(frame!=null){if(m_Body==null)m_Body=newBody[m_Sensor.BodyFrameSource.BodyCount];//몸 데이터 갱신frame.GetAndRefreshBodyData(m_Body);//프레임 해제frame.Dispose();frame=null;//모든 몸 데이터 가져온다foreach(Bodybodyinm_Body){if(!body.IsTracked)continue;LeftHand.transform.position=PointToVector3(body.Joints[JointType.HandLeft].Position);RightHand.transform.position=PointToVector3(body.Joints[JointType.HandRight].Position);}}}}voidOnApplicationQuit(){//모든 인스턴스 해제if(m_bfReader!=null){m_bfReader.Dispose();m_bfReader=null;}if(m_Sensor!=null){if(m_Sensor.IsOpen)m_Sensor.Close();m_Sensor=null;}}Vector3PointToVector3(CameraSpacePointp){Vector3v=newVector3();v.x=p.X;v.y=p.Y;v.z=p.Z;returnv;}
}
대충 맨 아래에 있는 PointToVector3 함수를 본인의 게임에 맞추어 잘 뜯어고치면 된다.
foreach문 내부를 좀 더 잘 프로그래밍하면 여러개의 몸이 인식됐을 경우도 처리할 수 있겠지.
모든 조인트를 얻어올 수 있으므로 다른 부위로 게임을 조작하는 것도 가능하다.
Body에는 Joint 말고 JointOrient도 있으므로 이걸 잘 활용하면 사람의 움직임과 케릭터의 움직임을 동기화시킬 수도 있겠다.