专利名称:基于数字头盔的通用三维虚拟场景实时交互方法
技术领域:
本发明涉及了计算机图形学、虚拟现实技术、用户接口管理系统技术、计算机硬件 接口技术、计算机操作系统技术等领域,具体涉及了获取数字头盔状态信息、映射为标 准输入设备鼠标、键盘消息,将模拟的鼠标键盘消息发送给三维可视化软件并进行三维 场景的交互控制。
背景技术:
人机交互技术是计算机图形学和虚拟现实领域中不可或缺的组成部分,是属于用户 接口管理系统(User Interface Management System, UIMS)的一项重要技术。而交互 设备是完成交互任务的重要基础,其主要实现定位、选择、取值,拾取等五种交互任务。 目前的三维可视化软件如3dMax、 Maya等主要通过鼠标和键盘进行场景的定位和变换, 在三维游戏中则除了鼠标键盘外,还可以采用游戏杆进行交互。这些设备的交互能力有 限,在软件中被人为地映射为场景平移、旋转、縮放等操作,交互方式不够自然、灵活。 此外,这类交互软件还限制了用户的双手,使得更加复杂的交互难以实现。
虚拟现实技术最早出现在上世纪60年代,在航空航天、建筑、医疗、教育、艺术等 领域有着广泛的应用。其中数字头盔直接佩戴在使用者头部,可以根据用户头部的运动 控制场景的变换,极大的增强了三维交互式虚拟现实的自由感和沉浸。但数字头盔的使 用需要虚拟现实系统等专门软件的支持,而一般的三维可视化软件均不支持数字头盔。
发明内容
本发明的目的在于解决目前数字头盔需要专门软件系统支持,不能运用于大多数三 维可视化软件系统中的缺陷,提供一种基于数字头盔的通用三维虚拟场景实时交互方 法,将使用者佩戴的数字头盔的运动状态映射为标准输入设备键盘、鼠标的状态消息传 送给三维可视化系统,以实现用数字头盔控制三维可视化系统中的三维交互。
本发明的技术方案是基于数字头盔的通用三维虚拟场景实时交互方法,该方法包
括以下三个步骤
步骤1利用数字头盔的硬件接口规范及数据协议或SDK从计算机接口中读取并解析 数字头盔状态数据,获得头盔的空间位置及方位角参数;
步骤2根据三维虚拟场景软件交互配置定义,将从步骤1中获得的数据映射为标准 交互设备(鼠标、键盘)输入状态信息;
步骤3调用操作系统API,将步骤2中得到的模拟标准交互设备输入状态信息转化为真实交互设备信息,驱动三维虚拟场景的实时交互。
所述步骤l中从计算机硬件接口中获取数字头盔状态信息的方法有两种(1)利用 数字头盔供应商提供的硬件接口规范及数据协议,调用操作系统API,从计算机硬件接 口中获取数字头盔状态信息;(2)调用数字头盔供应商提供的软件开发包,利用开发包 中提供的方法获取数字头盔状态信息。本方法所需要获得的数字头盔状态信息包括数字 头盔空间位置数据(x,y,z)及数字头盔方位角数据(alpha,beta,gama)。
所述步骤2中的交互方式映射是指建立数字头盔运动状态信息与标准输入设备鼠 标、键盘输入信息间的映射关系。数字头盔运动信息包括头盔位移分量(w)和头盔方 位角(alpha,beta,gama);键盘信息包括按键(vk)及按键状态(vkState);鼠标信息包括鼠标 位置(x,y)与鼠标状态(左键按下、左键释放、右键按下、右键释放、滚轮向前、滚轮向 后、鼠标移动)。根据三维可视化系统的交互定义,将数字头盔的连续运动信息映射为 键盘与鼠标的连续信息组合。将数字头盔位移状态映射到单位立方体,将数字头盔旋转 状态映射到单位球体,然后再映射到三维可视化软件的交互窗口中。
所述步骤3中将步骤2所获得特定输入设备状态信息转化为真实交互设备信息发送 给计算机,是通过操作系统自带的应用程序编程接口,将自定义的鼠标、键盘消息插入 到系统消息队列中,并被三维可视化软件所接受处理,以实现对三维可视化软件的交互 控制。
图1是本发明实施例1的流程图
图2a是本发明实施例1平移映射规范空间
图2b是本发明实施例1旋转映射规范空间
具体实施方法
下面结合附图和实施例做进一步详细说明。 实施例1
本实例以Windows XP SP3为操作系统环境,Visual Studio 2008 SP1为开发环境, 。++为开发语言,以Virtual Research公司HMD v8数字头盔控制AutoDesk公司的3D Max 软件进行三维场景交互。
如图1所示,基于数字头盔的通用三维虚拟场景交互方法,按照如下步骤建立数字头盔交互配置程序HMD—panel, exe:
步骤1利用数字头盔的SDK从计算机接口中读取并解析数字头盔状态数据,获得头 盔的空间位置及方位角参数;
步骤2根据三维虚拟场景软件交互配置定义,将从步骤l中获得的数据映射为鼠标、 键盘的输入状态信息;
步骤3调用Microsoft Windows操作系统应用程序编程接口 Sendlnput(),将步骤 2中得到的模拟标准交互设备输入状态信息转化为真实交互设备信息,驱动三维虚拟场 景的实时交互。
完成HMD一panel.exe之后,连接并安装头盔显示器,确认运行正常;启动三维软件, 以3DMAX为例,明确其三维观察窗口的鼠标和键盘映射方式;启动HMD_panel.exe后, 进入到用户配置界面,按照3DMAX的三维交互相关的鼠标和键盘映射,设置界面平移和 旋转选项启动头盔交互模式,利用数字头盗控制3D Max三维场景变换;最后结束头 盔交互模式并退出数字头盔交互配置程序。
具体实施步骤如下
步骤1利用数字头盔的SDK从计算机接口中读取并解析数字头盔状态数据,获得头 盔的空间位置及方位角参数。
数据获取需要涉及设备初始化、设备读取、设备关闭三个方面。为了适应不同的头 盔设备,定义相应的回调函数如下。只要满足如下接口的定义,则能适应任何一种头盔。
(1) 初始化设备的回调函数接口 針ypedef void * (*PR0C—INIT) (void);
(2) 数据读取回调函数接口
fttypedef bool(*PR0C_READER)(void* context,
float氺x,float *y, float氺z;
float氺alpha, float氺beta, float承gama); 其意义是头盔交互系统通过调用该函数接口,即可获得头盔的位置x,y,z以及方位 角度alpha、 beta、 gama等重要数据。
(3) 关闭设备回调函数接口
針ypedef void(*PR0C—CLOSE) (void* context); 以上三个回调函数接口一般由用户针对具体的头盔硬件来实现。(4)定义头盔数据获取类CHMD—Reader如下 class CHMD—Reader
Void* m一context; PROC—INIT m_callback—init; PROC—READER m_callback_reader; PROC一CLOSEm—callback—close;
void SetInit(PROC_INIT cb—init) { m—callback—init = cb—init; } void SetReader( PR0C_READER cb一reader)
{ m一callback一reader = cb—reader; } void SetClose(PROC—CLOSE cb一close)
{ m—callback_close = cb—close; }
h
其中成员变量nucontext表示数据获取接口的运行情景,视具体的设备访问方法 而定。CHMD_Reader的使用方法是这样的,先用这个类定义一个对象,接着调用这个类 的方法
a. 定义一个对象 CHMD一Reader reader;
b. 设置用户定义的回调函数
reader. Setlnit(cb—init—usr—defined): reader. SetReader(cb—reader—usr—defined); reader. SetClose(cb—close—usr—defined);
c. 调用回调函数幵启设备、获取数据、最后关闭设备。 Float x (0) , y (0) ,z(O), alpha(0), beta(0), gama(O); Reader, m—context 二 reader, m—callback—init0;
Reader, m—callback—reader (reader, m—context, x, y, z, alpha,
beta, gama); Reader, m—callback—close(reader, m—context);
步骤2根据三维虚拟场景软件交互配置定义,将从步骤1中获得的数据映射为鼠标、键盘的输入状态信息。
(1)头盔、鼠标和键盘等设备状态的数据结构。
a. 定义HS为头盔状态HS HS定义为结构体
struct HS
float x, y, float已,b, r;
其中x,y,z分别表示头盔的位移分量,a,b,r分表表示头盔的方位角。
b. 定义键盘状态KS KS定义为结构体
struct KS
BYTE state; BYTE vk;
其中state表示按键状态"1"表示是释放状态,"2"表示按下状态;vk表示虚 拟键。 一般只需要考虑功能键如"CTRL SHIFT SPACE"和字符键"A...Z; 0, 1,..., 9, -, +〃以及光标键 〃上下左右〃。
c. 定义鼠标状态MS MS定义为结构体 struct MS
BYTE state; 〃鼠标状态,左键单击,移动鼠标 int x, y; } 〃鼠标位置 其中state的取值范围可以为 e誦MS—STATEMS—LBTN—PRESS=1, MS一LBTN—UP=2,
MS一RBTN—PRESS=4, MS—RBTN_UP=8,
MS—WHEEL_PRE=16, MS—WHEEL—DWN=32,
MS—M0VE=64
分别表示鼠标的左右键状态、滚轮状态、移动状态等。
(2)定义两种映射 HI :头盔的连续运动+连续的按键组合; H2 :头盔的连续运动+连续的鼠标运动。
其中HI视具体的交互情景而定,如将头盔的移动量映射为持续的光标键的按 下状态;对于某些辅助按键并不需要实际的头盔数据,如Alt、 Ctrl、 Shift等, 可根据需要自动产生。
(3)平移映射的计算
如图2a,给定头盔的移动范围[O,H幻,[O,HY],
;以及三维场景的范 围[O,S幻,[O,SY], [O,SZ]。
a. 按键映射方法Hl:
If头盔移动量大于零then发送与平移场景对应的按键消息
b. 映射方法H2:
由头盔的位移分量(hx, hy, hz),计算屏幕上鼠标的位移分量(mx, my)。 头盔位移规范化(中心对称) uhx = hx / HX - 0. 5; uhy = hy / HY - 0. 5; uhz = hz / HZ - 0. 5; 虚拟场景移动量 sx = uhx氺SX + sx0; sy = uhy * SY + sy0;sz = uhz氺SZ + sz0;
其中平移分量(sx。, sy。, sz。)为预先定义的参考基点,相当于观察者在虚拟三维 场景中的初始位置。 鼠标移动量计算 Mx = sx * kx; My = sy * ky;
其中系数kx, ky分别为三维软件自定义的放縮系数,也可由用户自己任意设置. 需要注意的是移动分量sz并没有被鼠标利用,但是可以映射为某个按键,即可表示 跳起的高度.
(4)旋转映射的计算
如图2b,头盔的方位角度活动范围给为[-A/2,A/2], [-B/2'B/2], [-R/2,R/2]; 虚拟场景的旋转角度一般为
,
,
,分别表示绕x, y, z轴 的旋转角度.
a. 按键映射H1:
给定头盔的方位角度a, b, r,产生相应的按键消息,即 If头盔转动量大于零then发送与旋转场景对应的按键消息 其中转动量的计算增量方式,即新的角度减去旧的角度.
b. 鼠标移动量映射H2:
给定头盔的方位角度a,b,r,产生鼠标移动消息和相应的移动量.这意味着对空间 球体的连续旋转变换.而要从已知的空间旋转变换得到平面鼠标的移动往往没有唯一解. 为简单起见,可将头盔的方位角视为连续实施的欧拉角度,从中任选两个角度分别映射 到鼠标的移动分量上即可.
规范化头盔旋转量
ha = 2氺a / A ;
hb = 2*b / B ;
hr = 2氺r / R ;
映射鼠标移动分量
mx = ha*Pi * radius;
my = hb承Pi氺radius;其中radius为空间操纵球的半径,可以根据需要进行设置.
步骤3调用操作系统API,讲步骤2中得到的模拟标准交互设备输入状态信息转化 为真实交互设备信息,驱动三维虚拟场景的实时交互。模拟传统输入设备的方法是调 用系统API。下面给出在本实施例中使用的关键数据结构。
(1) API定义以及参数说明.
UINT Sendlnput( UINT nlnput, LPINPUT plnput, int cbsize ) 该函数能够将自定义的鼠标,键盘、以及其他硬件消息插入到系统的消息队列中.当 这些消息被三维软件所处理时,则能模拟三维软本身的交互行为.函数的参数意义如 下
nl叩ut : —起发送的消息数目 LPINPUT :输入消息数组指针 Cbsize :单个消息结构体的的大小.
LPINPUT定义
Typedef struct tagI,T { DWORD type;
Union {MOUSEINPUT mi; 〃鼠标输入结构体
KEYBDINPUT ki; 〃键盘输入结构体
HAREDWAREINPUT hi; } 〃其他硬件输入结构体
结构体中type字段可取值为INPUT_MOUSE, INPUT—KEYBOARD, INPUT—HARDWARE.
结构体中mi字段为鼠标输入结构体,定义为 Typedef struct tagMOUSEINPUT
LONG dx, dy;
DWORD mousedata, dwFlags. Time, dwExtralnfo; 其中dx、 dy分别表示鼠标的绝对位置或者相对位置,这取决于字段dwFlags的设定MOUSEEVENTF—ABSOLUTE.
结构体中字段ki为键盘输入结构体,定义为: Typedef struct tagKEYINPUT
WORD wVK; WORD wScan; DWORD dwFlags; D丽D time; DWORD dwExtralnfo
〃虚拟键码 〃硬件扫描码
〃指示按键状态
〃时间邮戳
(2)将鼠标键盘状态转换为实际输入消息
对每一个被映射的设备状态,定义一个与之对应的INPUT结构体对象,然后调用 SendI叩ut()将所有INPUT对象发送到当前消息队列中去.下面给出该函数调用的方法。 a.模拟键盘输入的系统API方法. 定义原型函数 void Simu—.keyboard(KS * pKS, int nks); 其中参数pKS表示按键状态列表,nks表示列表长度.该函数的简要实现方法如下 void Sirau—keyboard(KS* pKS, iri't nks)
]:NPUT * inkey = new INPUT [nks]; for(int i=0; i<nks;
Inkey[i].type = INPUT—KEYBOARD;
Inkey[i].wVK = VK—LEFT;
If(pKS[i]. state = = KS—PRESSED)
inkey[i]. dwFlags &= KEYEVE野—KEYUP; Else inkeydwFlags |= KEYEVENTF—KEYUP;
:}
〃调用系统API,发送消息Send:[:叩ut (nks, .inkey, s]'zeof (:I:NP(JT));
b.模拟鼠标输入的系统API方法. 定义原型函数
void Simu一mouse(MS * pMS, int nms); 其中参数pMS表示按键状态列表,nms表示列表长度.该函数的简要实现方法如下: void Simujnouse( MS* pMS, irvt咖s)
INPUT * inmus = new INPUT[咖s];
for (int i=0; i<nms; ++]'.)
j〔
inmus[i]. type = INPUT—MOUSE;
i. nmus [i ]. dx = pMS [i ]. pos. x;
i nmu s[i]. dy 二 pMS[i]. po s. y;
if (pMS[i]. state == MS—LBTN) 〃左键状态
i腦us[i]. dwFlags卜MOUSEEVENTF—LEPTDO糊; else if'(pMS[i]. state = MS....._RBTN) 〃右键状态
inmus[i].dwFlags卜MOUSEEVENTF—RIGHTDOWN; if (pMS[i]. state & MS—ABSOLUTE) 〃绝对移动还是相对移动
inmus[i]. dwFlags |= MOUSEEVENTF_ABSOLUTE;
〃发送鼠标消息 Senf Input (runs, inmus, sizeof (INPUT));
权利要求
1、基于数字头盔的通用三维虚拟场景实时交互方法,该方法包括以下三个步骤步骤1利用数字头盔的硬件接口规范及数据协议或软件开发包(SDK)从计算机接口中读取并解析数字头盔状态数据,获得头盔的空间位置及方位角参数;步骤2根据三维虚拟场景软件交互配置定义,将从步骤1中获得的数据映射为标准交互设备输入状态信息;步骤3调用操作系统应用程序编程接口(API),将步骤2中得到的模拟标准交互设备输入状态信息转化为真实交互设备信息,驱动三维虚拟场景的实时交互。
2、 根据权利要求1所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特 征是所述步骤l具体包括将数字头盔与计算机之间通过串口、并口或USB接口等方式 中的一种进行连接;利用数字头盔供应商提供的硬件接口规范及数据协议,调用操作系 统应用程序编程接口 (API)或数字头盗厂商提供的软件开发包(SDK),从接口中获得 数据;从获取的数据中解析出数字头盔相对于基坐标系的位移矢量和方位角度;所述步骤2具体包括将步骤1中所获得的数字头盔相对于基坐标系的位移矢量和 方位角度映射为特定的输入设备状态信息,输入设备状态信息包括鼠标移动方向、移动 量、按键状态以及键盘的按键状态,根据具体三维可视化软件交互方式,定义相应的交 互映射关系;所述步骤3具体包括调用操作系统应用程序编程接口,将步骤2所获得特定输入 设备状态信息转化为真实交互设备信息发送给计算机,计算机系统自动将获得的真实交 互设备信息发送给目标三维可视化软件,并进行场景的交互。
3、 根据权利要求1所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特 征是所述步骤l中从计算机硬件接口中获取数字头盔状态信息的方法是利用数字头 盔供应商提供的硬件接口规范及数据协议,调用操作系统API,从计算机硬件接口中获 取数字头盔状态信息。
4、 根据权利要求1所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特 征是所述步骤1中从计算机硬件接口中获取数字头盔状态信息的方法是调用数字头 盔供应商提供的软件开发包,利用开发包中提供的方法获取数字头盔状态信息,数字头盔状态信息包括数字头盔空间位置数据(x,y,z)及数字头盔方位角数据 (alpha, beta, gama)。
5、 根据权利要求2所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特征是所述步骤2中的交互方式映射是指建立数字头盔运动状态信息与标准输入设备 鼠标、键盘输入信息间的映射关系;数字头盔运动信息包括头盔位移分量(x,y,z)和头 盔方位角(alpha, beta, garaa);键盘信息包括按键(vk)及按键状态(vkState);鼠标信息 包括鼠标位置(x,y)与鼠标状态;根据三维可视化目标系统的交互行为定义,将数字头 盔的连续运动信息映射为键盘与鼠标的连续信息组合。
6、 根据权利要求2所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特 征是:所述步骤2中的交互方式映射中的位移映射是将数字头盔位移状态映射到单位立 方体,然后再映射到三维可视化软件的交互窗口中。
7、 根据权利要求2所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特 征是:所述步骤2中的交互方式映射中的旋转映射是将数字头盔旋转状态映射到单位球 体,然后再映射到三维可视化软件的交互窗口中。
8、 根据权利要求1所述的基于数字头盔的通用三维虚拟场景实时交互方法,其特 征是:所述步骤3中将步骤2所获得特定输入设备状态信息转化为真实交互设备信息发 送给计算机,是通过操作系统自带的应用程序编程接口,将自定义的鼠标、键盘消息插 入到系统消息队列中,并被三维可视化软件所接受处理,以实现三维可视化软件的交互 控制。
全文摘要
本发明公开了一种基于数字头盔的通用三维虚拟场景实时交互方法利用数字头盔的硬件接口规范及数据协议或软件开发包(SDK)从计算机接口中读取并解析数字头盔状态数据,获得头盔的空间位置及方位角参数,根据三维虚拟场景软件交互配置定义,将所获得的获得头盔的空间位置及方位角参数与三维虚拟场景中视点等参数结合,转化为模拟鼠标/键盘输入,调用操作系统应用程序编程接口(API),将模拟鼠标/键盘输入状态信息转化为真实交互设备信息,驱动三维虚拟场景的实时交互。以此实现基于数字头盔控制三维可视化软件中的虚拟场景实时旋转、漫游等交互。基于该方法,可将数字头盔与其它三维可视化软件相集成,提高软件的三维交互能力。
文档编号G06F3/048GK101644989SQ200910034799
公开日2010年2月10日 申请日期2009年9月8日 优先权日2009年9月8日
发明者吴明光, 周良辰, 温永宁, 盛业华, 闾国年 申请人:南京师范大学