4 设计说明
本项目的设计目标在于实现抛掷、盛接的算法,用一个开口的木箱3D模型代替实际的智能垃圾桶,在Unity3D模拟的场景中,安置一个虚拟的用户数字骨架,当用户完成抛掷动作之后,实例化一个小球,并做抛物运动,计算出落点后,让模型木箱移动到落点位置进行盛接。
4。1 核心算法
整个项目的核心算法就在于,抛掷的触发、盛接的落点位置计算以及木箱的移动算法。抛掷的触发依靠的是多个触发位,即bool值,当全部的触发位满足条件,即全部的bool值为true时,触发抛掷函数,将初速度、抛出方向、抛出位置的值赋予小球。已知小球x、y、z三个方向上的分速度和抛出点位置的高度,就可以计算出下落时间及木箱在x、z方向上的移动距离。在抛掷动作完成,小球的落点也算出之后,计算木箱当前位置与落点位置的差值,就可以将木箱移动到小球的落点位置,等待小球落进木箱。
4。1。1 抛掷算法
手势的概念在Kinect项目中是一个广泛的概念,不能理解为手部、手指的动作,而应该理解为是肢体的动作。相反,手指的动作在Kinect手势的定义中常常被剔除在外。
一个婴儿对于眼前的事物,能够做出简单的反应,因为他的眼睛和视觉中枢都是正常工作的,但是这个婴儿也许根本不能理解他看到的是什么,因为他的大脑里面还没有输入识别事物的“经验”。当这个婴儿成长为大人,这个过程中,通过学习,获得了判别事物的知识,他也许就能叫出大部分他所看到事物的名称,理解其运行原理。并能够理解一些人体动作含义。
在各种联欢会,或者娱乐节目中,我们也许都曾看过这样一种游戏——“你演我猜”,要求两名玩家,一人猜,一人演,表演动作的人(表演者)知道题目上的字,猜的人不知道题目上的字,表演者只能用动作告诉猜的人题目上究竟写了什么,猜的人只能通过表演者的动作来“猜”题目上的字。
如果用计算机去“猜”(识别)表演者的动作所表达的含义,那就需要在程序中定义好需要识别的手势,然后用程序去识别人体的动作。例如,在利用Kinect播放ppt的应程序中,将右手向身体右边挥动算作播放下一张ppt的指令,将左手向身体左边挥动算作播放上一张ppt的指令。
在人们的日常生活中,肢体要不断的运动,如果用物理的方法去分析,人体的每一个细微的运动,就会发现,每一个运动都是变速运动。例如,桌上有一支笔,我们需要拿起这支笔,递给另一个人,那就需要我们将置于体侧的手抬起,移向桌上的笔,拿起这支笔。这是一连串的动作,而这一连串的动作中,每一个动作都是变速运动。
在抛掷、盛接的系统中,需要用物理方法去分析右手的运动。右手作为系统中抛掷的触发物体,其运动本身也是变速运动。用户右手抛掷时的运动状态,和平时正常用右手时的状态有所不同。在平常用右手时,右手的速度和加速度相较于抛掷时瞬间用力的速度和加速度,有较大的区别。如下图4-1、图4-2、图4-3、图4-4所示,通过函数图像,我们可以较为直观地看出不同。
如果我们将平时右手的速度,与抛掷时右手的速度计算出来,画图进行比较,以单位时间为间隔,将其大小作为线段长度,竖立着画出来,并将线段的中间位置串在一条直线上,再用直线连接上一个速度线段的首端与下一个速度线段的尾端,那么我们就可以得到右手,平时运动状态下与抛掷状态下的速度“波形图”,类似于声波图,如下图4-5、图4-6所示,竖线旁标注的是单位时间内速度的大小。声音可以通过波形来进行分析,同样的方法,可以将运动的速度波形图作为分析动作的依据,通过速度的波形图,我们可以更加直观的看到,右手在平时状态下以及抛掷状态下的速度变化情况。 Kinect体感设备虚拟抛掷盛接系统的设计+源代码(6):http://www.youerw.com/jisuanji/lunwen_92206.html