CN106970720B - 一种虚拟仿真器及单机多鼠标独立并行操控方法 - Google Patents
一种虚拟仿真器及单机多鼠标独立并行操控方法 Download PDFInfo
- Publication number
- CN106970720B CN106970720B CN201610847932.9A CN201610847932A CN106970720B CN 106970720 B CN106970720 B CN 106970720B CN 201610847932 A CN201610847932 A CN 201610847932A CN 106970720 B CN106970720 B CN 106970720B
- Authority
- CN
- China
- Prior art keywords
- mouse
- information
- equipment
- picked
- unity
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/01—Input arrangements or combined input and output arrangements for interaction between user and computer
- G06F3/03—Arrangements for converting the position or the displacement of a member into a coded form
- G06F3/033—Pointing devices displaced or positioned by the user, e.g. mice, trackballs, pens or joysticks; Accessories therefor
- G06F3/038—Control and interface arrangements therefor, e.g. drivers or device-embedded control circuitry
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- User Interface Of Digital Computer (AREA)
Abstract
本发明公开了一种虚拟仿真器及单机多鼠标独立并行操控方法,虚拟仿真器包括仿真计算机、显示器及鼠标设备;单机多鼠标独立并行操控方法通过鼠标设备信息接收模块从Windows系统底层获取所有鼠标设备的鼠标动作信息,然后通过鼠标设备信息解析模块对鼠标动作信息进行解析,将解析后的数据与NGUI插件对接,最后对NGUI插件进行扩展,使其实现NGUI对多鼠标的支持;利用本发明可以支持多个用户在同一台虚拟仿真计算机上同时操作鼠标,避免了基于分布式仿真系统的多台计算机间状态不同步缺陷,节约了硬件设备成本;本发明支持在同一台虚拟仿真计算机上连接多个显示器,多个用户各自操控的鼠标独立并行工作,每个用户通过自己操控的鼠标可对仿真系统中模拟设备进行操控。
Description
技术领域
本发明属于模拟器设计领域,涉及一种虚拟仿真器及单机多鼠标独立并行操控方法。
背景技术
在针对复杂装备/设备开发的虚拟仿真器中,一般由多人同时对虚拟装备/设备进行操作,该虚拟仿真器需采用分布式架构,由多台计算机多个显示器构成分布式系统。为节省计算机硬件设备,同时避免不同计算机之间状态同步的问题,可以采用单机多屏幕多人操作的方案。但是,在单机多屏幕多人操作环境中需要在同一台计算机上接入多个鼠标设备,由于在Windows系统中仅支持一个鼠标,即系统鼠标。当插入多个鼠标设备后,多个鼠标设备会同时控制系统鼠标。目前的多鼠标软件,如Teamplayer,MultiMouse等,虽然可以模拟出多个鼠标,供用户使用,但是均存在一个“抢焦点”的问题,即这些软件模拟的多个鼠标之中,某一时刻只能有一个占用程序焦点,如果某一个鼠标设备左键点下后,其他的鼠标设备即使点击左键,Windows也不响应该左击事件,在实际使用过程中不能达到理想的多人同时操作的交互效果。所以,采用现有的多鼠标软件对虚拟仿真器进行操控,不能达到单机多人同时操作且各人之间完全相互独立的目的。
发明内容
本发明所要解决的技术问题是提供一种能够实现多屏幕多人同时操作的虚拟仿真器及单机多鼠标独立并行操控方法。
为解决上述技术问题所采用的技术方案是:一种虚拟仿真器及单机多鼠标独立并行操控方法。虚拟仿真器包括一个仿真计算机、一个以上显示器及一个以上鼠标设备;所述显示器和鼠标分别与仿真计算机的相应端口连接。所述显示器以扩展模式排列。
单机多鼠标独立并行操控方法为:在所述仿真计算机上安装鼠标设备信息接收模块、鼠标设备信息解析模块、Unity下鼠标绘制模块、Unity下物体拾取模块和NGUI扩展模块;所述鼠标设备信息接收模块用于从Windows系统的底层获取多个鼠标设备的鼠标设备信息;所述鼠标设备信息解析模块用于对所述鼠标设备信息进行解析,得到解析后鼠标设备信息;根据解析后鼠标设备信息,所述Unity下鼠标绘制模块在Unity程序界面上绘制相对应的鼠标图标;所述Unity下物体拾取模块利用所述鼠标图标来确定所拾取的物体;所述NGUI扩展模块用来驱动多个鼠标设备所拾取的物体运动。
所述获取鼠标设备的鼠标设备信息的方法如下:设置消息处理函数,以所述消息处理函数替换Windows系统默认的Window过程处理函数;所述消息处理函数用于接收Windows系统的多个鼠标设备信息并对所述鼠标设备信息进行处理,所述消息处理函数的格式与Windows系统的WindowProc函数格式一致;所述鼠标设备信息包括当前接入鼠标数量、鼠标设备ID号、鼠标位置偏移量和鼠标动作信息;所述鼠标动作信息包括鼠标位置移动、鼠标左键按下、鼠标左键抬起、鼠标右键按下、鼠标右键抬起、鼠标中键轮按下、鼠标中键轮抬起和鼠标中键轮滚动。
对所述鼠标设备信息进行处理的方法如下:指定需要使用鼠标的程序窗口作为消息接收窗口;消息接收窗口等待Windows系统的鼠标消息,收到Windows系统的鼠标消息后,确定鼠标消息类型:如果鼠标消息是程序窗口关闭命令WM_CLOSE,则恢复Windows系统默认的Window过程处理函数;如果鼠标消息是外部输入命令WM_INPUT,则判断外部输入命令WM_INPUT是否为鼠标设备信息,如果不是鼠标设备信息则继续等待,如果是鼠标设备信息,则将所述鼠标设备信息传输给鼠标设备信息解析模块,由鼠标设备信息解析模块对鼠标设备信息进行解析。
所述鼠标设备信息解析模块对鼠标设备信息进行解析的方法如下:鼠标设备信息解析模块从鼠标设备信息中获取鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息,并记录鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息。
所述Unity下物体拾取模块确定所拾取的物体的方法如下:将Unity下的物体通过Unity来与碰撞体绑定,得到绑定碰撞体物体;Unity下物体拾取模块获取记录在鼠标设备信息解析模块中的鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息;根据鼠标设备ID号确定对应的鼠标设备,根据鼠标位置偏移量确定鼠标指针位置,根据鼠标动作信息确定鼠标设备动作事件;所述鼠标指针位置为鼠标设备在以扩展模式排列的显示器上的绝对坐标,将所述绝对坐标转换为鼠标指针在每个显示器上的相对坐标,根据所述相对坐标得到鼠标指针在Unity的摄像机中的鼠标指针坐标;
由Unity中的摄像机向鼠标指针坐标发出射线,得到与射线相交的所有绑定碰撞体物体,距离摄像机最近的绑定碰撞体物体确定为所拾取的物体。
所述鼠标设备动作事件包括鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件。
所述NGUI扩展模块驱动多个鼠标设备的操作方法如下:在原来Unity中的NGUI插件结构基础上,使用自定义的鼠标信息结构体数组替代原来Unity中的NGUI插件的存储Windows系统鼠标信息的NGUI数据结构;所述自定义的鼠标信息结构体数组描述了拾取物信息,所述拾取物信息包括所拾取的物体对应的鼠标设备动作事件,包括所拾取的物体对应的鼠标设备ID号、鼠标指针坐标、鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件;在每次Unity的时钟更新时,遍历自定义的鼠标信息结构体数组中的拾取物信息,对鼠标信息结构体数组中拾取物信息的处理方式与原有NGUI插件的处理方式一致;通过对拾取物信息的处理实现驱动所拾取的物体对应的鼠标设备工作。
利用本发明可以支持多个用户在同一台虚拟仿真计算机上同时操作鼠标,避免了基于分布式仿真系统的多台计算机间状态不同步缺陷,节约了硬件设备成本;本发明支持在同一台虚拟仿真计算机上连接多个显示器,每台显示器对应一个用户,每个用户可以在其对应的显示器上看到一个完全由自己操控的鼠标,多个用户各自操控的鼠标独立并行工作,互不影响;每个用户通过自己操控的鼠标可对仿真系统中模拟设备进行操控;本发明从Windows底层获取所有鼠标设备原始数据信息并解析,以实现支持鼠标的功能;本发明对NGUI插件进行了扩展,使扩展后的NGUI能够实现对多鼠标的支持。
附图说明
图1为本发明虚拟仿真器的原理框图。
图2为本发明Unity下软件模块结构结构示意图。
图3为实际鼠标信息接收解析过程示意图。
图4为鼠标点数据的获取流程图。
图5为鼠标点数据的解析流程图。
图6为正交相机拾取物体流程图。
图7为透视相机拾取物体流程图。
图8为鼠标点信息转化函数算法流程图。
图9为拾取物体算法流程图。
图10为多鼠标工作示原理意图。
图11为鼠标事件响应逻辑的算法流程图。
具体实施方式
下面结合图1-11及实施例对本发明做详细说明。
本发明的虚拟仿真器如图1所示,包括一个仿真计算机、一个以上显示器及一个以上鼠标设备;所述显示器和鼠标分别与仿真计算机的相应端口连接;所述仿真计算机中安装有虚拟仿真系统。所述显示器以扩展模式排列。
本发明的单机多鼠标独立并行操控方法为:在所述仿真计算机上安装鼠标设备信息接收模块、鼠标设备信息解析模块、Unity下鼠标绘制模块、Unity下物体拾取模块和NGUI扩展模块;所述鼠标设备信息接收模块、鼠标设备信息解析模块、Unity下鼠标绘制模块、Unity下物体拾取模块和NGUI扩展模块是在Unity环境下用Windows提供的API基于C#语言编制而成;所述鼠标设备信息接收模块用于从Windows系统的底层获取多个鼠标设备的鼠标设备信息;所述鼠标设备信息解析模块用于对所述鼠标设备信息进行解析,得到解析后鼠标设备信息;根据解析后鼠标设备信息,所述Unity下鼠标绘制模块在Unity程序界面上绘制相对应的鼠标图标;所述Unity下物体拾取模块利用所述鼠标图标来确定所拾取的物体;所述NGUI扩展模块用来驱动多个鼠标设备所拾取的物体运动。
所述获取鼠标设备的鼠标设备信息的方法如下:设置消息处理函数,以所述消息处理函数替换Windows系统默认的Window过程处理函数;所述消息处理函数用于接收Windows系统的多个鼠标设备信息并对所述鼠标设备信息进行处理,所述消息处理函数的格式与Windows系统的WindowProc函数格式一致;所述鼠标设备信息包括当前接入鼠标数量、鼠标设备ID号、鼠标位置偏移量和鼠标动作信息;所述鼠标动作信息包括鼠标位置移动、鼠标左键按下、鼠标左键抬起、鼠标右键按下、鼠标右键抬起、鼠标中键轮按下、鼠标中键轮抬起和鼠标中键轮滚动。
对所述鼠标设备信息进行处理的方法如下:指定需要使用鼠标的程序窗口作为消息接收窗口;消息接收窗口等待Windows系统的鼠标消息,收到Windows系统的鼠标消息后,确定鼠标消息类型:如果鼠标消息是程序窗口关闭命令WM_CLOSE,则恢复Windows系统默认的Window过程处理函数;如果鼠标消息是外部输入命令WM_INPUT,则判断外部输入命令WM_INPUT是否为鼠标设备信息,如果不是鼠标设备信息则继续等待,如果是鼠标设备信息,则将所述鼠标设备信息传输给鼠标设备信息解析模块,由鼠标设备信息解析模块对鼠标设备信息进行解析。
所述鼠标设备信息解析模块对鼠标设备信息进行解析的方法如下:鼠标设备信息解析模块从鼠标设备信息中获取鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息,并记录鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息。
所述Unity下物体拾取模块确定所拾取的物体的方法如下:将Unity下的物体通过Unity来与碰撞体绑定,得到绑定碰撞体物体;Unity下物体拾取模块获取记录在鼠标设备信息解析模块中的鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息;根据鼠标设备ID号确定对应的鼠标设备,根据鼠标位置偏移量确定鼠标指针位置,根据鼠标动作信息确定鼠标设备动作事件;所述鼠标指针位置为鼠标设备在以扩展模式排列的显示器上的绝对坐标,将所述绝对坐标转换为鼠标指针在每个显示器上的相对坐标,根据所述相对坐标得到鼠标指针在Unity的摄像机中的鼠标指针坐标;
由Unity中的摄像机向鼠标指针坐标发出射线,得到与射线相交的所有绑定碰撞体物体,距离摄像机最近的绑定碰撞体物体确定为所拾取的物体。
所述鼠标设备动作事件包括鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件。
所述NGUI扩展模块驱动多个鼠标设备的操作方法如下:在原来Unity中的NGUI插件结构基础上,使用自定义的鼠标信息结构体数组替代原来Unity中的NGUI插件的存储Windows系统鼠标信息的NGUI数据结构;所述自定义的鼠标信息结构体数组描述了拾取物信息,所述拾取物信息包括所拾取的物体对应的鼠标设备动作事件,包括所拾取的物体对应的鼠标设备ID号、鼠标指针坐标、鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件;在每次Unity的时钟更新时,遍历自定义的鼠标信息结构体数组中的拾取物信息,对鼠标信息结构体数组中拾取物信息的处理方式与原有NGUI插件的处理方式一致;通过对拾取物信息的处理实现驱动所拾取的物体对应的鼠标设备工作。
本发明通过鼠标设备信息接收模块从Windows系统底层获取所有鼠标设备的鼠标动作信息,然后通过鼠标设备信息解析模块对鼠标动作信息进行解析,将解析后的数据与NGUI插件对接,最后对NGUI插件进行扩展,得到NGUI扩展模块,实现NGU扩展模块对多鼠标的支持。本发明结构示意图如图2所示。
Windows操作系统为硬件设备提供了一系列的数据结构与API接口以支持第三方来获取硬件设备信息,本发明需要使用数据结构RAWINPUTDEVICELIST_ELMT、数据结构RID_DEVICE_INFO、数据结构RAWINPUTDEVICE、数据结构RAWINPUT及API来获取鼠标设备数据。数据结构RAWINPUTDEVICELIST_ELMT、数据结构RID_DEVICE_INFO、数据结构RAWINPUTDEVICE、数据结构RAWINPUT分别表示如下:
1)RAWINPUTDEVICELIST_ELMT
RAWINPUTDEVICELIST_ELMT
{
public IntPtr hDevice;
public uint dwType;
}
RAWINPUTDEVICELIST_ELMT结构体描述了raw input device相关信息,其中hDevice描述设备的句柄号,dwType描述设备类型。其中设备类型包含鼠标、键盘和HID输入设备使用一个枚举结构表示。
enum RawInputDeviceType:uint
{
RIM_TYPEMOUSE=0,
RIM_TYPEKEYBOARD=1,
RIM_TYPEHID=2,
}
本发明提供了GetRawInputDeviceList函数接口来获取与计算机相连接的设备列表。
2)RID_DEVICE_INFO
RID_DEVICE_INFO
{
[FieldOffset(0)]
public uint cbSize;
[FieldOffset(4)]
public RawInputDeviceType dwType;
[FieldOffset(8)]
public RID_DEVICE_INFO_MOUSE mouse;
[FieldOffset(8)]
public RID_DEVICE_INFO_KEYBOARD keyboard;
[FieldOffset(8)]
public RID_DEVICE_INFO_HID hid;
}
RID_DEVICE_INFO结构定义了raw input device的设备信息,其中RID_DEVICE_INFO_MOUSE结构定义了鼠标的外设信息。其结构定义如下所示。本发明提供了GetRawInputDeviceInfo函数接口来获取相应设备的设备信息。
RID_DEVICE_INFO_MOUSE
{
public int dwId;
public int dwNumberOfButtons;
public int dwSampleRate;
public bool fHasHorizontalWheel;
}
3)RAWINPUTDEVICE
RAWINPUTDEVICE
{
public ushort usUsagePage;
public ushort usUsage;
public int dwFlags;
public IntPtr hwndTarget;
}
RAWINPUTDEVICE结构体定义了raw input device相关设备描述信息,在接收该设备产生的数据之前要先使用RegisterRawInputDevices函数对该设备进行注册。本发明提供触摸屏设备描述符为:usUsagePage=0x0D;usUsage=0x04。
4)RAWINPUT
RAWINPUT结构体定义了相关设备的输入信息,其中header描述了输入信息的头,其结构定义如下所示。其中dwType描述了设备类型,dwSize描述了这个数据包的大小,hDevice描述了产生该数据的设备句柄,wParam描述了数据中的参数。
RAWINPUTHEADER
{
public RawInputDeviceType dwType;
public int dwSize;
public IntPtr hDevice;
public uint wParam;
}
本发明接收的信息为RAWMOUSE类型信息,其结构定义如下所示。其中usFlags描述了鼠标状态,usButtonFlags描述了鼠标按键状态,usButtonData描述了鼠标滚轮数据,lLastX和lLastY分别描述鼠标X和Y的坐标值。当窗口收到WM_INPUT消息时可以通过GetRawInputData函数接口获取设备的输入信息内容。
public struct RAWMOUSE
{
[FieldOffset(0)]
public ushort usFlags;
[FieldOffset(2)]
public uint ulButtons;
[FieldOffset(4)]
public ushort usButtonFlags;
[FieldOffset(2)]
public ushort usButtonData;
[FieldOffset(6)]
public uint ulRawButtons;
[FieldOffset(10+2)]
public short lLastX;
[FieldOffset(14+2)]
public short lLastY;
[FieldOffset(18)]
public uint ulExtraInformation;
}
由于Unity下没有直接的Windows消息处理机制,所以首先实现对Windows消息的截取,然后处理鼠标消息。实际鼠标信息接收解析过程如图3所示。
鼠标设备信息读取模块:功能获取windows鼠标设备信息;
首先,用自定义的消息处理函数替换系统默认的Window过程处理函数,以便直接在自定义函数中接收Windows消息。消息处理函数的格式必须与Windows的WindowProc函数格式一致。
获取当前计算机设备实际接入的标准鼠标数量,并记录windows提供给每个鼠标的设备ID号;
指定需要使用多鼠标的程序窗口作为消息接收窗口;
窗口程序的消息处理函数等待Windows的鼠标消息,每个程序窗口在接收到鼠标消息后会执行消息处理函数;
消息处理函数执行过程:消息处理函数收到Windows消息后,确定消息类型;
如果是WM_CLOSE(程序窗口关闭命令)消息,则恢复默认的Window过程处理函数;
如果是WM_INPUT(外部输入命令)消息,则判断WM_INPUT(外部输入命令)是否为鼠标消息,如果不是鼠标消息则继续等待,如果是鼠标消息,则解析鼠标消息中的鼠标设备ID号、鼠标位置偏移量以及鼠标动作,并记录。
鼠标点数据获取:本发明从Windows底层获取鼠标信息,首先需要获取鼠标设备信息,然后对鼠标设备进行注册,最后通过Windows的窗口消息循环接收鼠标点信息,其流程图如图4所示。鼠标点数据解析:当系统接收到鼠标点信息后需要对鼠标点信息解析,转化为可识别的位置信息,在转化过程中定义鼠标信息结构体,其结构如下所示,其中hDevice为鼠标设备号,DeviceName存储鼠标设备名称,X和Y分别存储鼠标位于屏幕中的坐标,state和Laststate分别记录当前帧和前一帧鼠标的状态,events记录鼠标事件。当收到鼠标点信息后将处理后数据保存到SiRawMouse结构,其算法流程图如图5所示。SiRawMouse结构如下所示,其中hDevice为鼠标设备号,DeviceName存储鼠标设备名称,X和Y分别存储鼠标位于屏幕中的坐标,state和Laststate分别记录当前帧和前一帧鼠标的状态,events记录鼠标事件。
SiRawMouse
{
public IntPtr hDevice;
public string DeviceName;
public int X;
public int Y;
public int state;
public int Laststate;
public int events;
}
拾取模块获取鼠标信息解析模块提供的鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息,根据鼠标设备ID号区分每个鼠标设备,根据鼠标位置偏移量确定每个鼠标设备指针位置,根据鼠标动作信息确定每个鼠标设备点击事件。
Unity下鼠标对物体的拾取是通过射线机制实现的。根据鼠标在屏幕上的位置,由Unity的相机发出一条射线,该射线碰撞到的物体(程序窗口内的组件)即为拾取物体。
相机分为正交相机和透视相机两类。其中正交相机发出的射线只能与2D碰撞体(boxcollider2d)碰撞,不能与3D碰撞体(boxcollider、meshcollider)碰撞;透视相机发出的射线只能与3D碰撞体碰撞,不能与2D碰撞体碰撞。
Unity下建立的某物体,如果实现被鼠标拾取到功能(该物体可以被拾取),则需要将该物体与碰撞体(2D碰撞体或3D碰撞体)通过Unity绑定。
正交相机拾取物体基本流程如图6所示,正交相机拾取物体基本流程如图7所示,两类相机拾取物体基本流程类似。
多个显示器以扩展模式排列则多个显示器合并的屏幕分辨率会自动扩展。
鼠标指针位置为在鼠标在多屏幕的绝对坐标(1至10个显示器)->将各鼠标指针所在的绝对坐标转换为鼠标相对于每个屏幕的相对坐标-》根据各鼠标在每个屏幕的相对坐标得出鼠标在unity中具体摄相机中的坐标。
首先,根据鼠标在屏幕上的平面位置,对于多个屏幕的系统,需考虑将鼠标位置从Windows逻辑屏幕位置转换到具体显示器上;
然后,设定鼠标位置点的深度,一般为Z=0。从而确定鼠标的三维坐标;
第三步,由相机发出射线,并经过鼠标位置点。如果是正交相机,射线与相机方向平行,如果是透视相机,射线起点为相机自身;
从而得到与射线相交的所有碰撞体。
对于正交相机,深度最小的二维碰撞体对应的物体为拾取物体;对于透视相机,距离相机最近的三维碰撞体对应的物体为拾取物体。
根据实际需要,拾取物体分为两种情况,一种是拾取鼠标点击时,点击到的物体;另一种是拾取鼠标滑动式,移动到哪个物体上。两类物体分别记录。
鼠标的位置信息不是来自Windows的系统鼠标消息,而是经过解析为多个鼠标之后的多鼠标消息,不同的鼠标对应不同的数据。
NGUI插件是Unity中描述UI(程序界面)一套组件,目前只能支持Windows系统单鼠标消息,本发明在此基础上,对NGUI插件进行了扩展,称之为NGUI+,使之支持多个鼠标设备同时针对不同的部件进行操作。即基于NGUI+开发的Unity程序,可以响应多个鼠标设备的操作,并且能区分具体鼠标的身份信息。为了使多鼠标系统支持此插件,需要为其提供数据支持。在此定义结构体MouseParameter,,其中MouseID为鼠标ID,IsDown描述鼠标键是否按下,IsJustDown描述在当前帧下鼠标键是否按下,IsJustUp描述在当前帧中鼠标键是否弹起,MouseCode描述当前鼠标按键,0表示左键,1表示右键,2表示中键。MouseEvent描述鼠标事件,postion描述鼠标当前位置,Point记录拾取物体的点的位置信息。MouseTouchObj和MouseHoverObj分别记录拾取的物体,bHoverAndPress描述Hover或Press的状态信息。
MouseParameter
{
public int MouseID;
public bool IsDown;
public bool IsJustDown;
public bool IsJustUp;
public int MouseCode;
public int MouseEvent;
public Vector2 postion;
public Vector3 Point;
public GameObject MouseTouchObj;
public GameObject MouseHoverObj;
public bool bHoverAndPress;
}
为了能够较好的驱动NGUI插件,需要将已获取的鼠标点信息结构经过计算转化为MouseParameter结构,其算法流程图如图8所示,其中拾取物体算法流程图如图9所示。
针对NGUI插件的扩展:为了使NGUI插件支持多鼠标需要对该插件进行扩展。NGUI插件通过委托等机制实现了onClick、onHover、onPress等鼠标事件的响应,其触发条件如下所示:
1)onClick事件只有当快速点击时被触发,当长按或者按下鼠标键并移动后弹起不响应该事件。
2)onHover事件当移动到注册该事件的某物体上时被触发,当鼠标指针从A移动到B物体上时,A物体响应onHover的false事件,B物体响应onHover的true事件,当onHover的true事件触发后在该物体上移动,不再触发onHover事件。
3)onPress事件当鼠标键按下时响应onPress的true事件,当鼠标键弹起时响应onPress的false事件,当鼠标按下后移动到另一物体上再弹起,此时原物体响应onPress的false事件。
为了使扩展后的鼠标事件响应逻辑与原NGUI事件响应逻辑相同,在不改变原来逻辑的基础上扩展鼠标信息数组,并对多个鼠标设备数据进行遍历,以驱动多个鼠标设备的事件响应,其工作原理如图10所示。在NGUI中处理鼠标数据的算法流程图如图11所示。
对NGUI插件扩展方法:1)对NGUI数据结构进行扩展:使用自定义的鼠标信息结构体数组替代原有存储Windows系统鼠标信息的结构;自定义的鼠标信息结构体数组描述了各鼠标的鼠标ID、鼠标按键状态、鼠标位置信息以及鼠标拾取的物体信息;2)对NGUI处理鼠标消息的机制进行扩展:在每次Unity的时钟更新时(NGUI的Update函数执行),遍历自定义的鼠标信息结构体数组中所有的鼠标信息,每个鼠标的信息的处理方式和原有NGUI处理方式保持一致,驱动多个鼠标设备的事件响应。
其中,onClick、onHover、onPress三种事件是虚拟仿真系统互操作中应用较多的,本发明对上述三类事件进行了扩展,分别为onClickMultiMouse、onHoverMultiMouse和onPressMultiMouse。
为了使扩展后的鼠标事件响应逻辑与原NGUI事件响应逻辑相同,本项目扩展了NGUI的鼠标消息处理模块,将原来的对单个系统鼠标消息处理方式,改为对多个鼠标设备数据信息遍历处理的方式;即在每次Unity系统更新时(NGUI的Update函数),循环遍历所有的鼠标信息,每个鼠标的信息均按照原逻辑处理,只是在对外界调用回调函数时,增加了函数参数信息。与原有的函数接口相比,扩展后的函数接口都增加了Inputs.MouseParameter类型的输出参数,描述事件发生时的鼠标信息。其中MouseID为鼠标ID,IsDown描述鼠标键是否按下,IsJustDown描述在当前帧下鼠标键是否按下,IsJustUp描述在当前帧中鼠标键是否弹起,MouseCode描述当前鼠标按键,0表示左键,1表示右键,2表示中键。MouseEvent描述鼠标事件,postion描述鼠标当前位置,Point记录拾取物体的点的位置信息。MouseTouchObj和MouseHoverObj分别记录鼠标点击拾取的物体和滑动拾取的物体,bHoverAndPress描述Hover或Press的状态信息。
以上所述实施方式仅为本发明的优选实施例,而并非本发明可行实施例的穷举。对于本领域一般技术人员而言,在不背离本发明原理和精神的前提下对其所作出的任何显而易见的改动,都应当被认为包含在本发明的权利要求保护范围之内。
Claims (8)
1.一种虚拟仿真器,其特征在于:包括一个仿真计算机、一个以上显示器及一个以上鼠标设备;所述显示器和鼠标分别与仿真计算机的相应端口连接;
NGUI扩展模块驱动多个鼠标设备的操作方法如下:在原来Unity中的NGUI插件结构基础上,使用自定义的鼠标信息结构体数组替代原来Unity中的NGUI插件的存储Windows系统鼠标信息的NGUI数据结构;所述自定义的鼠标信息结构体数组描述了拾取物信息,所述拾取物信息包括所拾取的物体对应的鼠标设备动作事件,包括所拾取的物体对应的鼠标设备ID号、鼠标指针坐标、鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件;在每次Unity的时钟更新时,遍历自定义的鼠标信息结构体数组中的拾取物信息,对鼠标信息结构体数组中拾取物信息的处理方式与原有NGUI插件的处理方式一致;通过对拾取物信息的处理实现驱动所拾取的物体对应的鼠标设备工作。
2.根据权利要求1所述的虚拟仿真 器,其特征在于:所述显示器以扩展模式排列。
3.一种应用于权利要求1所述虚拟仿真器的单机多鼠标独立并行操控方法,其特征在于:在所述仿真计算机上安装鼠标设备信息接收模块、鼠标设备信息解析模块、Unity下鼠标绘制模块、Unity下物体拾取模块和NGUI扩展模块;所述鼠标设备信息接收模块用于从Windows系统的底层获取多个鼠标设备的鼠标设备信息;所述鼠标设备信息解析模块用于对所述鼠标设备信息进行解析,得到解析后鼠标设备信息;根据解析后鼠标设备信息,所述Unity下鼠标绘制模块在Unity程序界面上绘制相对应的鼠标图标;所述Unity下物体拾取模块利用所述鼠标图标来确定所拾取的物体;所述NGUI扩展模块用来驱动鼠标图标确定的所拾取物体的运动;
NGUI扩展模块驱动多个鼠标设备的操作方法如下:在原来Unity中的NGUI插件结构基础上,使用自定义的鼠标信息结构体数组替代原来Unity中的NGUI插件的存储Windows系统鼠标信息的NGUI数据结构;所述自定义的鼠标信息结构体数组描述了拾取物信息,所述拾取物信息包括所拾取的物体对应的鼠标设备动作事件,包括所拾取的物体对应的鼠标设备ID号、鼠标指针坐标、鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件;在每次Unity的时钟更新时,遍历自定义的鼠标信息结构体数组中的拾取物信息,对鼠标信息结构体数组中拾取物信息的处理方式与原有NGUI插件的处理方式一致;通过对拾取物信息的处理实现驱动所拾取的物体对应的鼠标设备工作。
4.根据权利要求3所述的单机多鼠标独立并行操控方法,其特征在于所述获取鼠标设备的鼠标设备信息的方法如下:设置消息处理函数,以所述消息处理函数替换Windows系统默认的Window过程处理函数;所述消息处理函数用于接收Windows系统的多个鼠标设备信息并对所述鼠标设备信息进行处理,所述消息处理函数的格式与Windows系统的WindowProc函数格式一致;所述鼠标设备信息包括当前接入鼠标数量、鼠标设备ID号、鼠标位置偏移量和鼠标动作信息。
5.根据权利要求4所述的单机多鼠标独立并行操控方法,其特征在于对所述鼠标设备信息进行处理的方法如下:指定需要使用鼠标的程序窗口作为消息接收窗口;消息接收窗口等待Windows系统的鼠标消息,收到Windows系统的鼠标消息后,确定鼠标消息类型:如果鼠标消息是程序窗口关闭命令WM_CLOSE,则恢复Windows系统默认的Window过程处理函数;如果鼠标消息是外部输入命令WM_INPUT,则判断外部输入命令WM_INPUT是否为鼠标设备信息,如果不是鼠标设备信息则继续等待,如果是鼠标设备信息,则将所述鼠标设备信息传输给鼠标设备信息解析模块,由鼠标设备信息解析模块对鼠标设备信息进行解析。
6.根据权利要求5所述的单机多鼠标独立并行操控方法,其特征在于所述鼠标设备信息解析模块对鼠标设备信息进行解析的方法如下:鼠标设备信息解析模块从鼠标设备信息中获取鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息,并记录鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息。
7.根据权利要求6所述的单机多鼠标独立并行操控方法,其特征在于所述Unity下物体拾取模块确定所拾取的物体的方法如下:将Unity下的物体通过Unity来与碰撞体绑定,得到绑定碰撞体物体;Unity下物体拾取模块获取记录在鼠标设备信息解析模块中的鼠标设备ID号、鼠标位置偏移量以及鼠标动作信息;根据鼠标设备ID号确定对应的鼠标设备,根据鼠标位置偏移量确定鼠标指针位置,根据鼠标动作信息确定鼠标设备动作事件;
所述鼠标指针位置为鼠标设备在以扩展模式排列的显示器上的绝对坐标,将所述绝对坐标转换为鼠标指针在每个显示器上的相对坐标,根据所述相对坐标得到鼠标指针在Unity的摄像机中的鼠标指针坐标;
由Unity中的摄像机向鼠标指针坐标发出射线,得到与射线相交的所有绑定碰撞体物体,距离摄像机最近的绑定碰撞体物体确定为所拾取的物体。
8.根据权利要求7所述的单机多鼠标独立并行操控方法,其特征在于所述鼠标设备动作事件包括鼠标点击事件、鼠标滑动事件、鼠标按下事件、鼠标释放事件和鼠标悬停事件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610847932.9A CN106970720B (zh) | 2016-09-26 | 2016-09-26 | 一种虚拟仿真器及单机多鼠标独立并行操控方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610847932.9A CN106970720B (zh) | 2016-09-26 | 2016-09-26 | 一种虚拟仿真器及单机多鼠标独立并行操控方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106970720A CN106970720A (zh) | 2017-07-21 |
CN106970720B true CN106970720B (zh) | 2020-06-02 |
Family
ID=59334521
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610847932.9A Active CN106970720B (zh) | 2016-09-26 | 2016-09-26 | 一种虚拟仿真器及单机多鼠标独立并行操控方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106970720B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN109407544B (zh) * | 2017-08-17 | 2021-07-30 | 凌华科技股份有限公司 | 非侵入式数据提取系统的仿真机台操作画面的系统模块 |
CN107728983A (zh) * | 2017-10-18 | 2018-02-23 | 上海龙旗科技股份有限公司 | 双屏操作方法及设备 |
CN108089737B (zh) * | 2017-11-13 | 2020-09-29 | 北京全路通信信号研究设计院集团有限公司 | 单台计算机的多鼠标控制方法及装置 |
CN109145542B (zh) * | 2018-08-31 | 2022-07-12 | 广东虹勤通讯技术有限公司 | 一种实现多输入设备独立工作的权限分配方法及装置 |
CN110543342B (zh) * | 2018-09-20 | 2022-12-09 | 北京北方华创微电子装备有限公司 | Ocx组件响应界面交互方法及装置 |
CN110209294B (zh) * | 2019-06-10 | 2020-10-09 | 威创集团股份有限公司 | 一种鼠标控制方法、系统及一种kvm系统 |
CN112965618A (zh) * | 2021-01-15 | 2021-06-15 | 聚融医疗科技(杭州)有限公司 | 一种多屏超声诊断系统多鼠标设备操作方法及系统 |
CN112799526B (zh) * | 2021-01-29 | 2022-11-18 | 瑞芯微电子股份有限公司 | 一种单系统多鼠标同时显示操作的方法和系统 |
CN114374712B (zh) * | 2021-12-14 | 2024-03-22 | 青岛海信微联信号有限公司 | 行车管理方法、电子设备和存储介质 |
CN116048362B (zh) * | 2023-01-28 | 2023-06-30 | 北京全路通信信号研究设计院集团有限公司 | 一种双鼠标控制方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6295509B1 (en) * | 1997-10-17 | 2001-09-25 | Stanley W. Driskell | Objective, quantitative method for measuring the mental effort of managing a computer-human interface |
CN1848079A (zh) * | 2005-04-11 | 2006-10-18 | 田园 | 一种使视窗类操作系统拥有多个鼠标的方法 |
CN101067772A (zh) * | 2007-06-08 | 2007-11-07 | 广东威创日新电子有限公司 | 对服务端的多鼠标远程控制方法 |
CN103246364A (zh) * | 2013-05-28 | 2013-08-14 | 李家海 | 多键盘多鼠标多显示屏电脑 |
CN203311342U (zh) * | 2013-06-03 | 2013-11-27 | 山西精英科技股份有限公司 | 一种多鼠标监控系统 |
-
2016
- 2016-09-26 CN CN201610847932.9A patent/CN106970720B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6295509B1 (en) * | 1997-10-17 | 2001-09-25 | Stanley W. Driskell | Objective, quantitative method for measuring the mental effort of managing a computer-human interface |
CN1848079A (zh) * | 2005-04-11 | 2006-10-18 | 田园 | 一种使视窗类操作系统拥有多个鼠标的方法 |
CN101067772A (zh) * | 2007-06-08 | 2007-11-07 | 广东威创日新电子有限公司 | 对服务端的多鼠标远程控制方法 |
CN103246364A (zh) * | 2013-05-28 | 2013-08-14 | 李家海 | 多键盘多鼠标多显示屏电脑 |
CN203311342U (zh) * | 2013-06-03 | 2013-11-27 | 山西精英科技股份有限公司 | 一种多鼠标监控系统 |
Non-Patent Citations (1)
Title |
---|
Unity3d 多鼠标 mulit mouse mulit pointer NGUI事件;网友守候_海阔天空;《CSDN blog》;20150918;1-3页 * |
Also Published As
Publication number | Publication date |
---|---|
CN106970720A (zh) | 2017-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106970720B (zh) | 一种虚拟仿真器及单机多鼠标独立并行操控方法 | |
US20150363005A1 (en) | Techniques for using human gestures to control gesture unaware programs | |
JP2013175242A (ja) | 画像センサベースのヒューマンマシンインタフェースを提供する方法システムおよびソフトウェア | |
WO2013118373A1 (ja) | 画像処理装置、画像処理方法及びプログラム | |
CN103984494A (zh) | 用于多种设备间的直觉式用户互动系统及方法 | |
CN102819391B (zh) | 一种多场景下具有并行性的多点触摸手势反馈系统及方法 | |
CN111459393B (zh) | 一种多信号源交互操控的实现方法、系统及设备 | |
KR20130137069A (ko) | 마우스 모의 터치 제어 스크린 조작 방법 | |
US20170192665A1 (en) | Hand gesture api using finite state machine and gesture language discrete values | |
WO2019192190A1 (zh) | 无线传屏触摸回传方法及系统 | |
US20210072818A1 (en) | Interaction method, device, system, electronic device and storage medium | |
US20170277614A1 (en) | Intelligent test robot system | |
CN109698853A (zh) | 远程控制方法、装置、设备、系统及计算机可读存储介质 | |
CN103472931A (zh) | 鼠标仿真触控屏幕操作的方法 | |
WO2019036097A1 (en) | USER INTERFACE CHANGE | |
US9870061B2 (en) | Input apparatus, input method and computer-executable program | |
JP3183729U (ja) | タッチスクリーン機能を疑似操作できるマウスモジュール | |
US9898256B2 (en) | Translation of gesture to gesture code description using depth camera | |
US10496237B2 (en) | Computer-implemented method for designing a three-dimensional modeled object | |
TWI390440B (zh) | 視窗切換方法及系統 | |
CN101876870A (zh) | 显示终端和操作显示画面的方法 | |
CN109308142B (zh) | 单主机多触控屏人机交互系统及其实现方法 | |
US20100287569A1 (en) | Computer, input method, and computer-readable medium | |
CN102622178A (zh) | 基于触屏电子设备使平面图像扭曲的方法 | |
CN116166143B (zh) | 全局触摸手势识别方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |