摘 要 利用虚拟现实技术创建一个逼真“虚拟人”,利用虚拟人开发设计一个虚拟家庭环境,包括家居、人物、家用电器、电脑等,可以根据用户的需要,在虚拟空间布置家具位置的摆放,对室内进行装饰和装修达到满意的效果。也可以在虚拟现实空间的其他场所开发设计虚拟人,如在游戏设计中利用虚拟人进行人类活动及游戏。使浏览者体验虚拟空间与现实空间的不同心灵感受。
关键词 X3D,虚拟现实技术,X3D游戏设计,VRML200X
一、X3D虚拟现实三维人体简介
利用虚拟现实技术制造出一个逼真“虚拟人”,为医学实习、治疗、手术及科研夯实基础,虚拟现实技术对传统的医疗方式产生巨大的冲击,它为医学提供了许多新的治疗手段和方法。虚拟现实技术成为外科手术、疾病诊断和治疗的有效手段,虚拟现实技术为传统医疗提供更加自然、便捷和有效的方式完成外科手术与治疗。
X3D虚拟医学三维人体、骨骼设计,适合于人们在日常生活、学习和工作中,休闲娱乐、身体检查、疾病的诊断以及外科手术等。为人类医学研究、实习和治疗奠定坚实基础,为生物工程学提供虚拟现实平台。
利用X3D虚拟现实几何节点、复杂节点以及动态感知节点等,开发设计人体模型、人体骨骼以及人体石膏三维立体模型等,使虚拟现实世界达到欣赏、娱乐、体验以及治疗的完美效果。
二、X3D节点设计
X3D本文涉及到的主要节点包括:背景节点、视角节点、坐标变换节、面节点、纹理节点、内联节点以及智能感知节点等,由于文章篇幅所限,只能介绍主要几个节点,如背景节点、内联节点、视角节点以及路由等。
1. Background立体空间背景节点
Background背景节点用于定义X3D世界中天空和地面颜色以及空间和地面角,在天空和地面之间,设定一幅立体空间全景图并可以放置立体空间中。设计者根据实际需要进行相应设计和布局。
Background背景节点可以通过对背景设定空间和地面角以及空间和地面颜色来产生天空和地面效果,也可以在空间背景上添加背景图像,以创建城市、原野、楼房、山脉等场景。在X3D中使用的背景图像可以是JPEF、GIF和PNG格式文件等。
Background背景节点使用一组垂直排列的色彩值来模拟地面和天空,Background背景节点也可以在六个面上使用背景纹理,子纹理节点的域名按照字母顺序有:backTexture,bottomTexture,frontTexture,leftTexture,rightTexture,topTexture。另外,Background,Fog,NavigationInfo,TextureBackground,Viewpoint节点都是可绑定节点。
(1)语法定义
Background背景节点用来生成X3D的背景,其生成的背景是三维立体式的,它会带给人一种空间立体层次感效果。可以设计室内和室外三维立体空间效果。使您的设计更加生动、逼真。
Background背景节点语法定义了一个用于确定天空、地面以及应用纹理的属性名和域值,利用Background背景节点的域名、域值、域的数据类型以及事件的存储访问权限的定义来创建一个效果更加理想的背景三维立体空间场景和造型。
Background背景节点语法定义,如图1所示。
域名(属性名) |
域值(属性值) |
域数据类型 |
存储/访问类型 |
XML属性类型 |
DEF |
ID |
|
|
#IMPLIED |
USE |
IDREF |
|
|
#IMPLIED |
skyColor |
0 0 0 |
MFColor |
inputOutput |
CDATA |
skyAngle |
|
MFFloat |
inputOutput |
CDATA#IMPLIED |
groundColor |
0 0 0 |
MFColor |
inputOutput |
CDATA#IMPLIED |
groundAngle |
|
MFFloat |
inputOutput |
CDATA#IMPLIED |
frontUrl |
|
MFString |
inputOutput |
CDATA#IMPLIED |
backUrl |
|
MFString |
inputOutput |
CDATA#IMPLIED |
leftUrl |
|
MFString |
inputOutput |
CDATA#IMPLIED |
rightUrl |
|
MFString |
inputOutput |
CDATA#IMPLIED |
topUrl |
|
MFString |
inputOutput |
CDATA#IMPLIED |
bottomUrl |
|
MFString |
inputOutput |
CDATA#IMPLIED |
set_bind |
“” |
SFBool |
inputOnly |
#FIXED |
bindTime |
“” |
SFTime |
outputOnly |
#FIXED |
isBound |
“” |
SFBool |
outputOnly |
#FIXED |
containerField |
children |
|
|
NMTOKEN |
class |
|
|
|
CDATA#IMPLIED |
图1 Background背景节点语法定义
(2)详解
Background 背景节点包含DEF、USE、skyColor、skyAngle、groundColor、groundAngle、frontUrl、backUrl、leftUrl、rightUrl、topUrl、bottomUrl、containerField以及class域等。
1)域数据类型描述
MFFloat域:是多值单精度浮点数。MFColor 域:是一个多值域,包含任意数量的RGB颜色值。SFBool域:是一个单值布尔量。SFTime域:含有一个单独的时间值。MFString域:是一个含有零个或多个单值的多值域。
2)事件的存储/访问类型描述
表示域(属性)的存储/访问类型,包括inputOnly(输入类型)、outputOnly(输出类型)、initializeOnly(初始化类型)以及inputOutput(输入/输出类型)等,用来描述该节点必须提供该属性值。
3)Background 背景节点域、域名和域值详解
DEF为节点定义一个名字,给该节点定义了唯一的ID,在其它节点中就可以引用这个节点。用DEF为节点命名时,使用有意义的描述性的名称可以规范文件,以提高X3D文件可读性,该属性是可选项。
USE用来引用DEF定义的节点ID,即引用DEF定义的节点名字,同时忽略其它的属性和子对象。使用USE来引用其它的节点对象而不是复制节点可以提高性能和编码效率。该属性是可选项。
skyColor域:指定了对立体空间背景天空的颜色进行着色,该域值是一系列RGB红绿蓝颜色组合而成。其默认值为0.0 0.0 0.0。
skyAngle域:指定了空间背景上需要着色的位置的天空角。X3D浏览器就是在这些空间角所指位置进行着色的。第一个天空颜色着色于天空背景的正上方,第二个天空颜色着色于第一个天空角所指定的位置,第三个天空颜色着色于第二个天空角所指定的位置,依此类推。这样使天空角之间的颜色慢慢过渡,这就形成了颜色梯度。该域值必须以升序的方式排列。默认值为空。
groundskyColor域:指定了对地面背景颜色进行着色,该域值是一系列RGB红绿蓝颜色组合而成。其默认值为空。
groundAngle域:指定地面背景上需要着色的位置的地面角。第一个地面颜色着色于地面背景的正下方,第二个地面颜色着色于第一个地面角所指定的位置,第三个地面颜色着色于第二个地面所指定的位置,依此类推。该域值中地面角必须以升序的方式排列。默认值为空。
frontUrl、backUrl、leftUrl、rihgtUrl、topUrl和bottomUrl这6个域:分别表示在6个不同的立体空间添加天空地面背景图像,形成室内、外三维立体空间场景。可以在X3D文件中使用的背景图像通常使用JPEF、GIF和PNG格式文件。
set_bind域:指定一个输入事件set_bind为true激活这个节点,输入事件set_bind为false禁止这个节点。就是说设置bind 为true/false 将在堆栈中弹出/推开(允许/禁止)这个节点。
bindTime域:指定一个当节点被激活/停止时发送事件。
isBound域:指定一个当节点激活时发送true事件,当焦点转到另一个节点时发送false事件。
containerField域:表示容器域是field域标签的前缀,表示了子节点和父节点的关系。该容器域名称为children,包含几何节点。如:geometry Box, children Group, proxy Shape。containerField属性只有在X3D场景用XML编码时才使用。
class域:是用空格分开的类的列表,保留给XML样式表使用。只有X3D场景用XML编码时才支持class属性。
2. Inline内联节点
在X3D程序设计中,编写X3D源程序时,由于创建的节点造型复杂,使X3D源程序过大或过长,给程序编写和调试带来诸多不便,因此将一个很大的X3D源程序拆成几个小程序。这就是软件工程的设计思想,采用结构化、模块化、层次化,提高软件设计质量。设计出层次清晰结构合理的软件项目。
Inline内联节点可以使X3D程序设计模块化。由基本X3D程序模块组成复杂和庞大的X3D立体空间静态或动态场景。Inline嵌入节点是一个组节点,也可以包含在其他组节点之下。
(1)语法定义
在X3D程序设计中,Inline内联节点可以使X3D程序设计实现模块化及组件化。由基本X3D程序模块组成复杂和庞大的X3D立体空间静态或动态场景。
Inline内联节点可以通过url读取外部文件中的节点。提示:不可以路由参数值到Inline场景,如果需要路由可以使用ExternProtoDeclare 和ProtoInstance。
Inline内联节点语法定义了一个用于确定内联节点的属性名和域值,利用Inline内联节点的域名、域值、域的数据类型以及事件的存储访问权限的定义来创建一个效果更加理想,具有结构化、模块化、组件化整体感的三维立体空间造型。
Inline内联节点语法定义,如图2所示。
Inline内联节点数据结构: 图标
域名(属性名) |
域值(属性值) |
域数据类型 |
存储/访问类型 |
XML属性类型 |
DEF |
ID |
|
|
#IMPLIED |
USE |
IDREF |
|
|
#IMPLIED |
load |
true |
SFBool |
inputOutput |
(true|false) |
url |
|
MFString |
inputOutput |
CDATA#IMPLIED |
bboxCenter |
0 0 0 |
SFVec3f |
initializeOnly |
CDATA |
bboxSize |
-1 –1 -1 |
SFVec3f |
initializeOnly |
CDATA |
containerField |
children |
|
|
NMTOKEN |
class |
|
|
|
CDATA#IMPLIED |
图2 Inline内联节点语法定义
(2)详解
Inline内联节点包含DEF、USE、load、url、bboxCenter、bboxSize、containerField以及class域等。
1)域数据类型
SFVec3f域:定义了一个三维矢量空间。SFBool域:是一个单值布尔量。MFString域:是一个含有零个或多个单值的多值域字符串。
2)事件的存储/访问类型
表示域(属性)的存储/访问类型,包括inputOnly(输入类型)、outputOnly(输出类型)、initializeOnly(初始化类型)以及inputOutput(输入/输出类型)等,用来描述该节点必须提供该属性值。
3)Inline内联节点域、域名和域值详解
DEF为节点定义一个名字,给该节点定义了唯一的ID,在其它节点中就可以引用这个节点。用DEF为节点命名时,使用有意义的描述性的名称可以规范文件,以提高X3D文件可读性,该属性是可选项。
USE用来引用DEF定义的节点ID,即引用DEF定义的节点名字,同时忽略其它的属性和子对象。使用USE来引用其它的节点对象而不是复制节点可以提高性能和编码效率。该属性是可选项。
load域:指定了load值为true立刻读取至内存,load值为false时推迟读取或在内存中释放对象。提示:使用LoadSensor检测读取的结束时间。
url域:指定了一个所需要嵌入的X3D文件的路径和文件名,可以是本地计算机或网络中远程计算机文件名和位置。
bboxCenter 域:指定了边界盒的中心,从局部坐标系统原点的位置偏移。其默认值为0.0 0.0 0.0。
bboxSize 域:指定了边界盒尺寸X,Y,Z方向的大小。其默认值为-1.0 -1.0 -1.0。缺省情况下是自动计算的,为了优化场景也可以强制指定。
containerField域:表示容器域是field域标签的前缀,表示了子节点和父节点的关系。该容器域名称为children,包含几何节点。如:geometry Box, children Group, proxy Shape。containerField属性只有在X3D场景用XML编码时才使用。
class域:是用空格分开的类的列表,保留给XML样式表使用。只有X3D场景用XML编码时才支持class属性。
|