unity3d中利用kinect数据控制三维模型(删减至一个脚本)
博主在做项目时需要利用kinect数据控制三维模型中人物的动作,但不是实时控制,而是利用之前获得的骨骼数据,直接控制。无需再利用脚本打开kinect设备。
在博主转载的一篇博客中有一个unity3d的工程包,特别适合,实现unity与kinect的交互。
http://blog.csdn.net/a350203223/article/details/22040119
该工程中有多个脚本,之间联系复杂。本人使用此工程中的脚本,经过分析,去除了其中冗余的脚本,可以实现直接传入数据即可控制三维模型动作,不需要实时打开kinect,可以直接读取之前存录的骨骼点数据。
Kinect
KinectModelControllerV2 - 你需要将这个脚本拖放到你想要应用Kinect控制的模型上。为了让模型能够跟上人的节奏,你需要将模型上控制模型动作的关键骨骼拖放到这个脚本暴漏的合适的变量中 ,也就是将模型中的骨骼与kincet识别到的人的骨骼绑定起来。另外这个脚本暴漏的变量中,还有一个变量时标识模型是受哪个玩家控制。
KinectPointController - 你也需要将这个脚本拖放到场景中的游戏物体上。但是这个游戏物体不是模型,而是由一系列分别代表头部、肩部、手等人体部位的点组成。你需要将游戏物体中的这些关键点都拖放到这个脚本暴漏的外部变量中。这样就可以使用Kinect控制游戏物体了,游戏物体是由一系列的点组成的人体。
DisplayDepth - 这个脚本得到深度图像。
DisplayColor - 这个脚本得到RGB图像。
KinectRecorder - 这个脚本用于记录你的动作,并为Kinect模拟器(emulator)产生回放文件。
KinectEmulator - 这个脚本模拟Kinect设备.和KinectRecorder产生的回放文件一起工作。
KinectSensor - 这个脚本从Kinect设备中取得数据。需要替换这个文件使用特用版本的SDK.
DeviceOrEmulator - 这个脚本设置使用Kinect物理设备还是Kinect模拟设备.
SkeletonWrapper - 这个脚本抓取骨骼数据.
DepthWrapper - 这个脚本抓取深度图像数据.
KinectInterop - 这个脚本从Microsoft Kinect SDK中抓取数据.
Recordings/playbackDefault - 这是为Kinect模拟设备准备的默认的回放文件.
但是我只想找到控制模型的机制,传入数据直接控制模型。于是我分析了所有的脚本,找到其中的 Matrix4x4矩阵变换的关键,kinect坐标转化为世界坐标,删减了冗余的脚本。
整合到KinectModelControllerV2一个脚本中。
/*
* KinectModelController.cs - Handles rotating the bones of a model to match
* rotations derived from the bone positions given by the kinect
*
* Developed by Peter Kinney -- 6/30/2011
*
*/
using UnityEngine;
using System;
using System.Collections;
public class KinectModelControllerV2 : MonoBehaviour {
//Assignments for a bitmask to control which bones to look at and which to ignore
public enum BoneMas