[Unity3D——用代码说明一切]Unity结合Kinect2体感开发:Kinect控制U3D中的模型

该博客介绍了如何使用Unity3D结合Kinect2进行体感开发,实现通过Kinect控制Unity中的3D模型。主要涉及的关键步骤包括获取Kinect的Body信息,解析骨骼旋转,应用到模型骨骼上,以及理解Vector3和Quaternion的关系,世界坐标和相对坐标的转换。提供了一个项目包的下载链接,并提到了三个关键脚本:KinectBodyControl、KinectBodyControlLogic和CamerColorView,分别用于获取身体信息、控制模型骨骼更新和显示Kinect摄像头内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现效果:




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 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值