让游戏支持复杂手势识别

给游戏加入复杂手势识别的功能无疑可以大大增加游戏的趣味性,对于像ios、andriod这样的全触控操作系统尤其如此。这篇文章不是讲解手势识别的论证推倒过程(那些公式看着就头疼,毕竟咱是写程序的不是写论文的,这些东东是怎么来的咱不管,能用就好),也不是讲解ios上面UIGestureRecognizer类的应用(这个暂时只能识别轻触滑动等简单的手势,虽然对于普通应用来说已经足够了,但是对于游戏来说还远远不够)。

 

    这篇文章会帮助你让游戏识别三角形、五角星、圆圈、以及任意自定义的复杂图形。并且由于无论是识别算法还是其应用都非常简单,所以你可以零成本的应用于任何你想要使用的地方。

 

    手势识别算法是"$1 Unistroke Recognizer"。

    这个算法实现起来非常简单,但是识别效率很高,这个就有点类似寻路算法中的A*。它足以满足我们在游戏中的需求,所以没有必要再去探讨神经网络、机器学习什么的了。(其实还有一种更简单的识别算法:我们定义八个方向,鼠标移动的时候判断后一个点相对于前一个点的方向,最终组合成一个由字符串组成的手势代码----比如下上代表一个手势,下右代表一个手势,然后对这个代码与模板进行匹配--这个时候匹配的就是字符串的相似度,要简单很多。这也是浏览器中手势识别常用的方法。不过这种方法应用到游戏中效果不如$1,因为$1会对坐标集合进行正规化,即便我画的图形歪了或者有些走样,它都可以很好的识别出来)。

 

    最初知道这么个算法是看了SDL里面的touch gesture的实现(当初还以为它只能识别$美元符号呢,汗),网上有各个语言版本的实现。推荐大家看看这里(http://depts.washington.edu/aimgroup/proj/dollar/),这里有其对应语言版本的下载,大家也可以先在其js测试程序上试一试效果,非常好玩。同时也有其相关论文和改进(比如支持多点触控手势的$N),喜欢钻研的朋友不要错过。

 

    这里推荐这个版本(http://depts.washington.edu/aimgroup/proj/dollar/others/cpp.bw.zip)。c++实现,代码清晰,使用简单。

    1、在初始化的地方new一个GeometricRecognizer实例recognizer_,调用recognizer_->loadTemplates()方法。注意这个函数只是测试时使用,真正设计时,其手势模板应该是从配置文件中读取。

    2、在TouchMove(或者是MouseMove,依平台而定)的时候将坐标push_back到一个集合里(touch_points_)。

    3、在TouchEnd的时候调用: RecognitionResult r = recognizer_->recognize(touch_points_);

    我们对其返回的结果进行判断,如果(r.name != "Unknown" && r.score > 0.5),那么这就是我们识别出来的一个手势。name是手势模板名称,score是其权重,越高则与模板越匹配。

 

    通过简单的几行代码,我们就把手势识别功能加入到游戏中了,这时我们是用其释放魔法,还是做一些特殊的动作都依赖与设计者的创造性了。很有趣,不是吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值