zoukankan      html  css  js  c++  java
  • 手势

        给游戏加入复杂手势识别的功能无疑可以大大增加游戏的趣味性,对于像iosandriod这样的全触控操作系统尤其如此。这篇文章不是讲解手势识别的论证推倒过程(那些公式看着就头疼,毕竟咱是写程序的不是写论文的,这些东东是怎么来的咱不管,能用就好),也不是讲解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是其权重,越高则与模板越匹配。

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


  • 相关阅读:
    流复制-pg_basebackup (有自定义表空间)
    流复制-pg_basebackup (没有自定义表空间)
    PG 更新统计信息
    PG修改参数方法
    Postgres的索引01
    Postgres基础操作
    PostgreSQL安装
    SQL拦截器
    没对象的快自己写一个吧!带你了解一下python对象!
    喜欢看电影来哦!教你如果使用Python网络爬虫爬取豆瓣高分电影!
  • 原文地址:https://www.cnblogs.com/yssgyw/p/3456114.html
Copyright © 2011-2022 走看看