4。1。2 盛接算法
在小球被抛出的时刻,我们记录下小球在x,y,z三个方向上的分速度,并且记录下抛出时刻的高度,便可以利用物理公式计算出小球的理论落点,即小球在x轴和z轴移动的距离,其公式如下:(Vx,Vy,Vz为小球抛出时刻三个方向上的分速度,h为小球抛出时刻的高度,g为重力加速度。需要注意的是,在Unity3D的环境中,y轴为垂直方向轴,与数学的空间几何中的三维坐标规定略有不同,在数学的空间几何中,z轴为垂直方向轴。)
论文网文yyyywwyy
Sz = (Vy/g+((Vy^2+2*g*h)/g^2)^0。5)*Vz。z轴方向上的移动距离
整个公式的推导过程如下:
在Unity3D的物理引擎中,y轴表示垂直方向。小球抛出时刻的y轴方向速度为Vy,小球在y方向上需要先做向上的减速运动,其达到最高点时的速度为零,从小球被抛出到最高点所需要的时间为Vy/g,运动的距离为Vy^2/(2*g)。当小球达到最高点后,在垂直方向上便开始做自由落体运动,其下落高度为抛出时的小球y坐标值与向上做减速运功的距离之和,其计算公式为:Vy^2/2*g+h(h为抛出时刻的小球y轴坐标,是已知量),其做自由落体运动的下落时间为:((Vy^2+2*g*h)/g^2)^0。5。因此,小球从抛出到下落的总时间为T:Vy/g+((Vy^2+2*g*h)/g^2)^0。5。
在求得小球从抛出时刻,到落地的总时间之后,就可以算出小球的落点位置,即落点坐标。小球在平面上x、z的移动距离,其公式如下:(因为项目中不考虑空气阻力,所以小球抛出时刻x、z方向上的初速度是不变的。Vx为小球x方向上的初速度,Vz为小球z方向上的初速度,T为下落所需要的总时间。)
Sx = Vx*T;Sz = Vz*T。
小球的落点位置(x’,y’,z’)为小球的抛出位置(x,y,z)加上偏移量,其计算公式为:
x’=x+Sx;z’=z+Sz;y’=0。
最后我们计算木桶当前坐标与到小球落点坐标之间的差值,将木桶通过函数移动至小球落点,等待小球下落到落点位置,即可实现盛接。其计算公式如下:((x1,y1,z1)为木箱原位置的三维坐标,(x’,y’,z’)为落点位置的三维坐标。)
x1=x’;z1=z’;y1=y’=0。
由于木箱在xoz平面内移动,所以y轴坐标不变。
其示意图如下图4-9所示。
4。2 实现效果
本项目最终的实现效果,是通过3D场景的模拟来实现的。
4。2。1 panel显示人体视频图像信息
在Unity3D中提供了UI的界面设计,在Unity3D中添加一个panel组件,用于显示Kinect摄像头所捕获到的视频图像信息,方便我们在使用系统的时候,调整自己的站位。panel在Unity3D中的效果如图4-10所示。在panel组件上绑定一个C#脚本,在脚本中编写调用Kinect设备的控制语句,将Kinect获取到的视频彩色图像实时打印在panel中。
4。2。2 彩虹骨架以及KinectModelControllerV2
彩虹骨架为Kinect联合Unity3D开发的一个开源模型,在关于Kinect体感开发的论文以及相关的项目中多有采用。其中包含了人体二十个骨骼节点的彩色球状模型,并且使用彩色的柱状体,连接骨骼节点的球状模型,在Unity中呈现出一个人体的骨架模型。如下图4-11所示。在例程编写完毕之后,此彩虹骨架模型,在机器正确安装Kinect驱动程序,并且连接上Kinect设备之后,当用户站在Kinect设备的摄像头前面时,可以跟着玩家的动作做出相应的动作。这实际上就是数字化的人体骨架,相当于Xbox游戏机在开始游戏时为玩家创建的数字骨架。
在整个程序的设计过程中,KinectModelControllerV2。cs脚本提供了接收Kinect传输的骨骼节点信息,并控制场景内的数字骨架模型与用户做出一致动作的功能,同时,抛掷、盛接的算法代码也写在了这个脚本里面。通过这个脚本,可以实现抛掷手势的识别,小球落点的计算,以及木箱的移动。文献综述