手势手指项目技术博客

1.名词解释:

  Unity中的主线程(Main Thread):是Unity脚本的消息循环。在主线程中的Update()函数会重复不断地被执行。

2.项目目的

  对于用户传递进来的数据根据特定的规则(规则会在文中给出)向用户展示一组手势的切换。

3.工具

  Unity2019.1.0a8(64-bit):用以制作“手”的模型,并且通过其中的脚本接收数据以控制手势的切换。

  visual studio 2017:在visual studio 2017中建立winform用以接受用户从外设传来的消息、容纳系统主要的业务逻辑,并且向用户展示软件界面。

4.手模型的简单描述

  手的模型中包括手掌,手指关节和手指关节之间的每一截手指。

      要使手做出手势状态,我们无需关注手掌以及各个手指关节之间的每一截手指,我们要关注的是手指关节的状态。通过观察,我们把手指关节的状态抽象为两种,弯曲和伸直。默认每个关节的状态为伸直的,此时我们手的模型模拟的是手完全伸展开的状态(如下图)。弯曲状态即是向手掌方向旋转90度。    

 

5.数据流图

  1.新建winform,在其中建立一个TextBox。用户通过键盘向winform中的TextBox中输入手势状态信息数据用以暂时替代用户从外设传来的消息。

  2.在Unity中建立一个Socket Server 并开启监听状态等待Socket Client的连接。在winform中建立一个Socket Client根据根据IP和端口号与在unity中建立的Socket Server建立连接。winform程序接收到来自于键盘输入的手势状态信息数据之后将数据通过在winform和unity之间已经建立好的Socket连接将数据发送至Unity。

  3.Unity中的Socket Server在接收到从Winform进程中的Socket Client发来的手势状态信息数据之后将这些由‘0’和‘1’组成的字符串转化为由指定的大写字母组成的字符串。

  4.将转换之后的字符串存入到队列中。

  5.Unity的主线程从队列中获取手势状态信息并且根据收拾状态信息控制手的模型切换手势。

  

 

6.技术路线

   1.  Windows Sockets 2,微软的技术手册中对于Windows Sockets 2的解释是这样的:

    Windows Sockets 2 (Winsock) enables programmers to create advanced Internet, intranet, and other network-capable applications to transmit application data across the   wire, independent of the network protocol being used. With Winsock, programmers are provided access to advanced Microsoft® Windows® networking capabilities such as    multicast and Quality of Service (QoS).

    Winsock follows the Windows Open System Architecture (WOSA) model; it defines a standard service provider interface (SPI) between the application programming     interface (API), with its exported functions and the protocol stacks. It uses the sockets paradigm that was first popularized by Berkeley Software Distribution (BSD) UNIX. It was   later adapted for Windows in Windows Sockets 1.1, with which Windows Sockets 2 applications are backward compatible. Winsock programming previously centered around   TCP/IP. Some programming practices that worked with TCP/IP do not work with every protocol. As a result, the Windows Sockets 2 API adds functions where necessary to    handle several protocols.

    我们在本次项目中用Windows Sockets 2的目的是在winform进程和Unity进程之间进行进程间通信(数据流图中的“2.手势状态信息”的传递),动机是为了业务逻辑主体在C#  中,避免以unity框架作为业务逻辑的主体,方便后续开发中业务逻辑与unity3d解除耦合。

  2.  线程间通信,在Unity中,我们需要建立一个线程来启动Socket Server监听客户端的连接并且接收来自于客户端的信息。需要在主线程中完成手势的切换。所以需要手势状态信  息从接收客户端的信息的线程中传递至主线程。这就是我们使用线程间通信的动机。

    我们采用的线程间通信的方式是使用全局变量。这里使用的全局变量是一个队列。

    线程间通信体现在数据流图中的“4.将转换之后的字符串存入到队列中”和“5.Unity的主线程从队列中获取手势状态信息并且根据收拾状态信息控制手的模型切换手势”。

  3.  队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。

    在本次项目中,我们的手势完成切换需要一定的时间,而在切换手势的这段时间里手势状态是不被允许发生变化的。否则将出现无法预料的错误。我们使用队列的动机是为了  缓冲,队列是先入先出的,使用队列存储来自客户端的手势信息并且在手势切换完成之后再从队列中取出新的手势状态信息能够有效地避免在旧手势执行完毕前新手势到来导致丢  失动作

 

7.手势状态信息的含义

  数据流图中“1”和“2”传递的数据是由‘0’和‘1’组成的字符串,‘0’代表关节伸展,‘1’代表关节弯曲。根据‘0’或‘1’所在的位置对应的关节会伸展或者弯曲。其中的对应关系如下。

  

上面的这一组数据(000000111111000)对应对的手势如下:

 

数据流图的“3”和“4”中的“由固定的大写字母组成的字符串”的意义如下:

  该字符串中的每一个大写字母代表一个关节会“弯曲”。其中的对应关系如下:

上面的000000111111000转换为“由固定大写字母组成的字符串”的结果是:“CDEVFR”。

8.运行效果的动态展示

  如下图:

 

posted @ 2020-05-10 15:09  位军营  阅读(256)  评论(0编辑  收藏  举报