人工智能 - 利用人体姿势检测做健身游戏(仅限高级版,难度:3级)
-
用到的相关知识
介绍
在这篇教程中,大家将利用人体姿势检测做一个健身游戏。不同的姿势将显示在舞台上,玩家要以最快速度做出这些姿势。
第1步 - 新建一个项目
在创益编程游乐场中新建一个项目。删除角色“角色1”,把角色“空的1”改名为“主角”。
第2步 - 运行身体部位检测
当点击绿旗时,我们要立即运行身体部位检测。这会打开摄像头并实时分析摄像头影像。大家要把“调试”设置为“是的”,就会自动显示身体关键部位。
在“变量”类别中会自动创建一个表格“i”。请勾选表格“i”前面的勾选框,使其在舞台显示:
然后运行程序。大家会看到身体关键部位被标记出来,表格“i”实时更新:
第3步 - 添加深蹲造型
接下来,取消勾选表格“i”,添加一个“深蹲”姿势的造型。大家可以用造型“多利亚-d”,然后改名为“深蹲”:
把角色大小设为130,然后移动到舞台右下角。这是玩家的第1个目标姿势。
第4步 - 分析这个深蹲姿势
尽管我们知道每个身体部位的位置,但我们不知道玩家摆的是什么姿势。为了自动检测玩家是否是深蹲姿势,我们重点看这4个点位:左胯、右胯、左膝、右膝。
主要观察点为,当玩家做深蹲姿势时,两个膝盖的距离要比左右胯部距离宽得多。
为了让逻辑简单,我们假设玩家的身体没有左右倾斜,那么我们就可以只用这4个部位的x坐标计算距离:- 膝盖距离 = 右膝x坐标 - 左膝x坐标
- 胯部距离 = 右胯x坐标 - 左胯x坐标
第5步 - 读取表格
现在我们新建4个变量来表示这4个身体部位的x坐标:“左胯x”、“左膝x”、“右胯x”、“右膝x”。
我们可以从表格“i”读取变量的值。再次勾选表格“i”的勾选框来查看内容。例如左胯的x坐标,我们先找到“X”列,然后找到其行号为12:
那么,我们就可以把这个值读取到变量“左胯x”,如下所示:
读取这4个变量的积木如下所示:
第6步 - 计算距离
我们得到了4个身体部位的x坐标,现在可以计算膝盖之间的距离、胯部之间的距离。
新建2个变量“膝盖距离”、“胯部距离”,来表示这两个距离。
“胯部距离”就是右胯与左胯的x坐标之差:
同理,膝盖距离就是右膝盖与左膝盖的x坐标之差。这一步做完后的完整程序如下所示:
第7步 - 根据距离计算姿势
我们的程序知道了这2个距离,现在就可以对比二者以判定玩家是否为深蹲姿势。我们可以用一个简单规则:如果膝盖距离大于跨步距离的两倍,就算是一个好的深蹲姿势。
新建一个变量“姿势”,将其默认值设为“未知”。如果膝盖距离大于胯部距离的两倍,我们就把“姿势”设为“深蹲”。
第8步 - 重新编排积木
因为我们添加的所有新积木都为了计算玩家姿势这一个目的,我们应该制作一个新积木。新积木命名为“计算姿势”,然后把所有新积木移动到这个积木的定义中:
第9步 - 防备无效值
如果摄像头影像检测不到身体部位,表格中的对应项就将被设为-10000。如果胯部、膝盖的x坐标这4个变量有一个为-10000,这些数据就作废无效。
因此,我们应当再添加一些逻辑来忽略无效数值,比如要求全部4个变量大于-250。提示,如果舞台上能看到身体部位,那么x坐标就一定大于-240。
第10步 - 重复不断计算姿势
当玩家移动并修改姿势后,表格“i”中的数值将持续不断更新。因此,我们应当重复不断计算玩家的姿势,可以用一个无限循环来完成:
第11步 - 检查是否为“深蹲”姿势
现在我们可以重复不断检查变量“姿势”的值。一当该值变为“深蹲”,我们就展示一条成功消息。
运行程序后得到如下结果:
第12步 - 设置目标姿势
现在我们把基本的游戏机制做出来了,下一步就是让游戏更有趣。我们给玩家提供多个目标姿势,玩家要尝试完成这些姿势来得分。
第一步,我们新建一个变量“目标姿势”,表示玩家要做的下一个目标姿势。
我们可以用这个新变量重新编写代码:
第13步 - 将目标姿势在“深蹲”和“站立”之间切换
当用户完成目标姿势后,我们就应当把目标换成一个新姿势。简便起见,我们让目标在这两个姿势之间切换:“深蹲”和“站立”。
我们可以为此制作一个新积木“切换目标姿势”。如果“目标姿势”为“深蹲”,那么下一个目标应当为“站立”。否则,如果“目标姿势”不是“深蹲”,那一定是“站立”,那么我们就要切换回“深蹲”。
第14步 - 制作“站立”造型
为了显示出目标姿势改变了,我们也要更换角色的造型。
找到“多利亚-c”造型并添加到角色中,重命名为“站立”。
我们还需要为这个造型做一些细微调整。原来左边的腿向旁边伸出,我们可以选中整条腿并旋转到直立位置:
此外,头部侧视,可能会让玩家感到迷惑。我们只需删除这个头部,然后从“深蹲”造型复制一个头:
第15步 - 切换造型
当我们切换“目标姿势”,同时也要切换造型,从而使玩家看到下一步做什么姿势:
第16步 - 视觉效果/听觉效果
当目标姿势切换完成后,为了给玩家清晰反馈,我们要展示一些视觉效果。例如,在切换至下一个造型之前我们可以让角色瞬间变亮。并且,我们还可以播放收集硬币的声音:
第17步 - 检测玩家是否为“站立”姿势
在积木“计算姿势”的定义中,目前我们只检查了是否为“深蹲”姿势。我们还要检查玩家是否为“站立”姿势。简便起见,我们还是看膝盖距离和胯部距离。如果玩家站立,膝盖距离应该比胯部距离稍大一点点。我们假设,当膝盖距离小于跨步距离的1.2倍时就算是站立:
现在游戏就做好了。每当玩家做出目标姿势,我们就切换至下一个目标姿势:
创意扩展
在这个项目的基础上大家可以制作一些更有趣的东西:
-
游戏规则:大家可以设置不同的游戏规则。例如,大家可以为玩家设置时间限制(比方说1分钟),获得金币最多的玩家胜利。还可以要求玩家完成60次姿势,用时最短的获胜。
-
改进姿势检测方法:现在我们只看膝盖和胯部,大家还可以检查胳膊。比如,要求胳膊水平伸直,大家可以比较手腕和肩部的y坐标。
-
其他目标姿势:大家可尝试添加更多有趣的姿势。例如,让玩家做一个“X”姿势,如下图所示。需要用手腕和脚踝的x坐标和y坐标来检测这一姿势。
- 双人模式:当有两个玩家站在摄像头前面时,两个人都能被身体姿势检测引擎所检测到,这使得大家能够制作双人游戏。例如,每当玩家A做一个姿势,这个姿势就作为玩家B的目标。这样的话,玩家B就要重复玩家A的姿势。