• 复杂手势识别


    http://depts.washington.edu/aimgroup/proj/dollar/

    so good!

    给游戏加入复杂手势识别的功能无疑可以大大增加游戏的趣味性,对于像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是其权重,越高则与模板越匹配。

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

  • 相关阅读:
    第十三周课程总结
    第十二周
    第十一周课程总结
    第十周课程总结
    第九周课程总结&实验报告(七)
    第八周课程总结&实验报告(六)
    第七周课程总结&实验报告(五)
    第六周&java实验报告四
    期末课程总结与个人总结
    第十四周课程总结
  • 原文地址:https://www.cnblogs.com/ligun123/p/2411447.html
Copyright © 2020-2023  润新知