一、安装Kinect SDK 2.0(KinectSDK-v2.0_1409-Setup.exe)
刚开始时没装运行demo提示缺少Kinect10.dll,因为没有驱动;然后装1.8版本,依然报错,因为我的kinect是2.0的,1.8的不支持。
二、手掌方向问题
项目需求是要实现手掌托起一个模型,并且模型在小范围内和手掌正面的方向一致。如何确定手掌正面的方向?我看了KinectManager,里面没有直接的方法,于是选取了手掌(Hand)、拇指(Thumb)、手掌指尖(HandTip)这三个点,得到手掌到拇指、手掌到指尖两个向量,叉乘得出法向量,即为手掌方向。
随即又有一个问题,那就是得出的方向不稳定,看了一下,是检测本身就有波动,不是我代码的问题,于是弄了一个过滤方法:记录3帧的手掌向量,不同向上或向下的过滤掉,效果差强人意。
//非连续三帧向下或向上,过滤掉
IEnumerator HandUpFiter()
{
while (true)
{
if (manager && manager.IsUserDetected())
{
oldUp = GetHandUp();
yield return new WaitForEndOfFrame();
lastUp = GetHandUp();
yield return new WaitForEndOfFrame();
currentUp = GetHandUp();
if (Vector3.Angle(oldUp, lastUp) < Vector3.Angle(oldUp, currentUp) && oldUp.y * lastUp.y > 0 && oldUp.y * currentUp.y > 0)
{
availableUp = currentUp;
}
}
else
{
yield return new WaitForEndOfFrame();
}
}
}
//获取手掌方向
Vector3 GetHandUp()
{
handToThumb = manager.GetJointKinectPosition(userId, rightThumbJointIndex) - manager.GetJointKinectPosition(userId, rightHandIndex);
handToTip = manager.GetJointKinectPosition(userId, rightHandTipJointIndex) - manager.GetJointKinectPosition(userId, rightHandIndex);
return Vector3.Cross(handToThumb, handToTip).normalized;
}