实现效果:
Kinect1和Kinect2的关键骨骼位置信息:
Unity版本:5.3.5
项目包下载地址:点击打开链接
关键原理:
1.利用得到的Kinect的Body信息得到所有骨骼信息
2.通过骨骼信息得到对应点骨骼的旋转信息
3.将旋转信息用到本地的模型骨骼上
4.每个骨骼点的方向向量的计算
主要知识点:
要理解坐标系中Vector3和Quaternion之间的关系,世界坐标和相对坐标的相互转换
主要脚本:
KinectBodyControl用于获得Kinect获得的身体信息并创建模型
KinectBodyControlLogic用于控制模型骨骼的更新
CamerColorView用于UGUI显示Kinect摄像头内容
using UnityEngine;
using System.Collections;
using Windows.Kinect;
using System.Collections.Generic;
///
/// 体感游戏对象控制器
///
public class KinectBodyControl : MonoBehaviour
{
//Kinect对象
private KinectSensor _kinectSensor;
//身体信息读取流
private BodyFrameReader _bodyReader;
//从Kinect得到的身体信息 每帧获取
private Body[] _bodyDatas = null;
//场景中的体感游戏对象
private Dictionary
_bodies = new Dictionary
();
//当前追踪到的游戏对象
private List
_nowTrackedIDs = new List
();
//用于缓存已知的追踪到的游戏对象
private List
_nowCreatedBodyID = new List
(); void Start() { //得到kinect设备对象 _kinectSensor = KinectSensor.GetDefault(); if (_kinectSensor != null) { //得到身体数据流 _bodyReader = _kinectSensor.BodyFrameSource.OpenReader(); //设备是否开启 if (!_kinectSensor.IsOpen) _kinectSensor.Open(); } } void Update() { //通过Kinect得到身体信息 GetBodyInfos(); //得到身体信息后 更新场景中的身体对象 UpdateBodyObject(); } ///
/// 得到身体信息 /// private void GetBodyInfos() { if (_bodyReader != null) { BodyFrame frame = _bodyReader.AcquireLatestFrame(); if (frame != null) { //初始化身体数组信息 if (_bodyDatas == null) _bodyDatas = new Body[_kinectSensor.BodyFrameSource.BodyCount]; //得到该帧的身体信息 frame.GetAndRefreshBodyData(_bodyDatas); //清楚该帧 frame.Dispose(); frame = null; } } } ///
/// 根据身体信息更新场景上的对象信息 创建 骨骼位置更新等 /// private void UpdateBodyObject() { //判断是否得到了身体信息 if (_bodyDatas == null) return; _nowTrackedIDs.Clear(); //记录当前追踪到的对象 foreach (Body body in _bodyDatas) { if (body == null) continue; if (body.IsTracked) _nowTrackedIDs.Add(body.TrackingId);//trackingid是追踪到对象的唯一ID } //记录当前已经有的身体对象 _nowCreatedBodyID = new