最新VRML教程汇编.doc

上传人:sccc 文档编号:4643270 上传时间:2023-05-02 格式:DOC 页数:54 大小:164.50KB
返回 下载 相关 举报
最新VRML教程汇编.doc_第1页
第1页 / 共54页
最新VRML教程汇编.doc_第2页
第2页 / 共54页
最新VRML教程汇编.doc_第3页
第3页 / 共54页
最新VRML教程汇编.doc_第4页
第4页 / 共54页
最新VRML教程汇编.doc_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《最新VRML教程汇编.doc》由会员分享,可在线阅读,更多相关《最新VRML教程汇编.doc(54页珍藏版)》请在三一办公上搜索。

1、VRML历史年月,在瑞士日内瓦召开的万维网(www)会议上,Mark Pesce和Tony Parisi在会上介绍了 他们开发的可在万维网上运行的虚拟现实界面。这时,由一个情趣相投者联谊会BOF马上产生强烈的反响,决定开发一种场景描述语言,它可以连通Web网。VRML这个词就是在BOF的会议上造出来的。(BOF来自一句英语的谚语:Birds of a feather.) 美国线路通(Wired)杂志的Pesce和Brian Behlendorf,在一个月之内,收集到一份有意于参与开发VRML人员的电子邮箱通讯录,那只不过是开初一周内登录的志愿人员,已超过千人,真可谓是一场有广泛群众参与的大战役

2、。其中有一位Gavin Bell,他是SGI(硅图公司Silicon Graphics Inc.)的工作组的工程师。Open Inventor是SGI推出的一工具软件,便于程序员快速、简洁地开发各种类型的交互式图形程序。这种工具软件的编制是基于场景结构和对象描述概念和手段。年,最初发布时名称为Inventor。 工作组每周举行一次例行的午餐会,尽管外人对其中奥妙一无所知,但很多工作组的内部事务,往往在这种不拘形式的随意交谈中得以完成。Gavin Bell正是利用了一次这种场合,告诉他的主管经理Rill Carey关于VRML的事情,说明急需建立一种可在Web网上运行、描述3D场景的语言。到聚餐

3、结束时,Carey已决心从事于这场新的开拓(后来两人合办了Wasabisoft)。 年初夏,第一次WWW会议期间初步决定,十月份在芝加哥召开第二次WWW会议,也就是说只留出五个月的时间。在这段时间里,能否拟出一个VRML规范的初步方案?BOF成员和自愿加入开发新规范行列的热心网客信心十足。他们一致认为:在下次会议之前,一个内部试用语言规范一定能完成。总的意向是:就一个业已存在的语言加以改造比较稳妥,而另起炉灶,从头开始重干一个全新,则不太可行。 事实上,不过用了两周时间,Bell就提出了SGI的方案它是一个经过修改的Open Inventor 3D模拓文件(Metafile,元文件)格式的子集

4、,在附加一些处理网络的相应功能和措施。SGI同意将这种新的文件格式向公众开放不需要任何专利权和专卖权,供大家使用。 还有几项颇有讨论价值的方案也先后提交,参加候选。Pesce和Behlendorf公允的主持了方案的论证会,最后投票结果,SGI方案赢得了多数。这就意味着VRML是脱胎于Open Inventor的文件格式。这就是年月在芝加哥(Chicago)召开的第二次WWW会议上公布VRML1.0的规范草案。主要的功能是完成静态的3D场景,以及与HTML链接的功能和措施。 另一位SGI的原Open Inventor的设计师Paul Strauss开始作一个VRML公共域(public doma

5、in)的词解程序(Parser),当时流行于业界的名字叫QvLib。这个程序的作用是把VRML的可读文件格式转换成浏览器可理解的格式。这个词解程序于年月公开发布。它可以安装到各式各样的平台上,随之,各种浏览器恰似雨后春笋般勃然兴盛起来。 可以理解和显示所有VRML文件的浏览器,最早还是出自SGI,由David Mott和多位Inventor的工程师写成的WebSpace? Navigator。不久,模板图形软件(Template GraphicsSoftware)运行于WebSpace,不仅适用于SGI平台,也适用于多种其它平台,而且所有版本的WebSpace Navigator浏览器均免费使

6、用。 年秋,SGI进一步推出了WebSpace Author(供创作的程序)。这是一种Web创作工具,可在场景内交互地摆放物体,并改进了场景的功能,还可用于发表VRML文件。此时,VRML设计工作组(VGA, VRML Architecture Group)相聚在一起,讨论下一个版本的VRML。 年初,VRML委员会审阅并讨论了若干个VRML2.0版本的建议方案,其中有SGI的动态境界( Moving Worlds)提案、太阳微系统(Sun Microsystem)的全息网(HollWeb)、微软公司(Microsoft)的能动VRML(Aictive VRML)、苹果公司(Apple)的超世

7、境界(Out of the world),以及其他多种提案。委员会的很多成员参与修改和完善这种种方案,特别是Moving Worlds。经过多方努力,最终在月底以投票裁定。结果,Moving Worlds以70%选票赢得了绝对多数。年月,VGA(VRML设计小组)决定将这个方案改造成为VRML2.0。 年月,在新奥尔良(New Orleans)的SIGGRAPH96会议上公布。VRML的国际标准草案(DIS,Draft of International Standard)就是以VRML2.0为基础制订的,于年月提交国际标准化组织ISO JYCI/SC24委员会审议、依照惯例,定名VRML97(

8、ISO/TEC 14772-1:1997),在年月认定。 年可能发表中文国标标准。初识VRMLVRML(Virtual Reality Modeling Language,虚拟现实建模语言)是一项和多媒体通讯(Multimedia Communication),因特网(Internet),虚拟现实(Virtual Reality, VR)等领域密切相关的新技术,其基本目标是建立因特网上的交互式三维多媒体。VRML于1998年1月被正式比准为国际标准(ISO/IEC 14772-1:1997,通常称为VRML97),创立了标准化进程仅18个月的ISO/IEC记录,它还是第一个用HTML发布的国际

9、标准。VRML是一种3D交换格式,它定义了当今3D应用中的绝大多数常见概念,诸如变换层级,光源,视点,几何,动画,雾,材质属性和纹理映射等等。VRML的基本目标是确保能够成为一种有效的3D文件交换格式。 VRML是HTML的3D模型。它把交互式三维能力带入了万维网,即VRML是一种可以发布3D网页的跨平台语言。事实上,三维提供了一种更自然的体验方式,例如游戏,工程和科学可视化,教育和建筑。诸如此类的典型项目仅靠基于网页的文本和图像是不够的,而需要增强交互性,动态效果连续感以及用户的参与探索,这正是VRML的目标。 VRML提供的技术能够把三维,二维,文本和多媒体集成为统一的整体。当把这些媒体类

10、型和脚本描述语言(scripting language)以及因特网的功能结合在一起时,就可能产生一种全新的交互式应用。VRML在支持经典二维桌面模型的同时,把它扩展到更广阔的时空背景中。VRML是赛博空间(cyberspace)的基础。赛博空间的概念是由科幻作家William Gibson提出的。虽然VRML没有为真正的用户仿真定义必要的网络和数据库协议,但是应该看到VRML迅速发展的步伐,作为标准,它必须保持简单性和可实现性,并在此前提下鼓励前沿性的试验和扩展。VRML基本模型VRML是由立方体、圆锥和球体三个几何形状构成的。输入的第一行文字是:#VRML V2.0 utf8 这是VRML文

11、 件的标志,所有2.0版本的VRML文件都以这行文字打头,VRML97是由VRML2.0版修订而成的, 符合VRML97规范的VRML文件也 以这行文字打头。其中“#”表示这是一个注释。 而utf8表示此文件采用的是utf8编码方案,这在标准中有详细说明。 先加入一个Group节点( 组节点): Group 组节点的花括号之内的所有内容视为一个整体,利用组节点可以把虚拟场景组织成条理清晰的树形分支结构。 下面定义组节点的children域(孩子域):children 在children后的方括号内定义Group节点的所有 孩子对象, 第一个孩子是一个Shape 节点(形态节点),它描述一个几何

12、形状及其颜色等特征:Shape 在Shape节点内定义一个几何体 Box(方盒节点):geometry Box 注意我们没有为Box定义任何域,这意味着它的尺寸和坐标位置等特 性取缺省值(单位立方体)。随后补齐各右括号: 至此,我们已经成功地制作了第一个虚拟境界,把它保存为hello world.wrl,下面是完整的文件:#VRML V2.0 utf8 childrenShape geometry Box 用浏览器打开这个文件,你会看到一个灰色的立方体,尽管不太好看,但你还是可以通过改变视点位置从不同方位观察它,初步体验“三维交互”的感觉。增加交互能力上一节我们学习了用几何体建立虚拟境界以及为

13、几何体赋予色彩和材质的方法, 这样建立的虚拟境界是静态的。这一节我们将使一个几何体(为了更具一般性,下面我们称之为 对象)能够根据用户动作做出反应,即交互能力,这是VRML2.0最突出的特征。1.检测器 在VRML中,检测器(Sensor)节点是交互能力的基础。检测器节 点共九种。在场景图中,检测器节点一般是以其它节点的子节点的身份而存在的,它的父节点 称为可触发节点,触发条件和时机由检测器节点类型确定。 接触检测器(TouchSensor )是最常用的检测器之一,最典型的应用例子是开关。其它检测器将在 后续教程中陆续介绍。这里我们定义一个开关节点lightSwitch(这是一个组节点),并定

14、义一个 接触检测器作为它的子节点:DEF lightSwitch Group children 各几何造型子节点.DEF touchSwitch TouchSensor 这样开关节点lightSwitch就是一个可触发节点。当然,检测器存在的理由是它被触发时能够引起某种变化,所以在更深入讨论开关节点之前,我们先讨论一下场景变化。2.视点 最常见的变化是视点的变化,在我们的第一个境界中你可能已经体验到 视点变化:当你拖动鼠标或按动箭头键时(按照vrml术语,称为航行),虚拟境界就会旋转或缩放, 这实际上是在调整你的视点位置或视角。在虚拟场景的重要位置可以定义视点节点(Viewpoint), 它们

15、是境界作者给用户推荐的上佳观赏方位,在cosmoplayer浏览器中,用户就可以通过鼠标右键选择作者推荐的各个视点。这里我们定义两个视点节点:DEF view1 Viewpoint position 0 0 20 description view1 DEF view2 Viewpoint position 5 0 20 description view2 我们的潜在目的是使用户可以通过触发开关节点来切换视点。现在先研究一下 这两个视点节点,其中的坐标表示视点在场景中的位置,坐标的单位是米,这 在前面已经提到过,视点的名称将会在浏览器菜单中提示出来供用户选择。把 上述视点说明加入hellowor

16、ld.wrl中(放在Group节点之前),并把其中的方块 节点修改成可触发节点: DEF box Tranform children Shape . Box . DEF touchBox TouchSensor 把修改过的文件另存为“touchme.wrl”。3.事件传递 下面我们把触发(用鼠标箭头按动方块)和场景变化 (视点切换)这两件事情联系起来,在场景图中,除节点构成的层次体系外,还有一个“ 事件体系”,事件体系由相互通讯的节点组成。能够接收事件的节点都应具有事件入口 (eventIn),如果它要接收多种类型的事件(称为入事件),它就应该具有多个事件入口, 也就是说,事件入口象节点的域一

17、样是有类型的。同样,发送事件的节点应有事件出口 (eventOut),事件出口也是有类型的。例如Viewpoint节点就有一个事件入口set_bind, 当向此事件送入一个值“TRUE”(即所谓的入事件)时,该Viewpoint节点成为当前视点。 又如,接触检测器TouchSensor有一个事件出口isActive,当受到用户触发后它就从此出口 送出一个“TRUE”(即所谓的出事件),补充一句,在下一个事件发送之前,此事件一直 保存在事件出口中(作为记录)。 事件出口和事件入口通过路径相连,这就是VRML文件中除节点以外的另一基本组成部分:ROUTE 语句。ROUTE语句把事件出口和事件入口联

18、系在一起,从而构成事件体系。在这里,我们是把 接触检测器touchBox的事件出口isActive连接到视点节点view2的事件入口set_bind: ROUTE touchBox.isActive to view2.set_bind 好了!现在我们得到的VRML文件是:#VRML V2.0 utf8DEF view1 Viewpoint position 0 0 20description view1 DEF view2 Viewpoint position 5 0 20description view2 Group children DEF box Transform translatio

19、n 5 0 0 children Shape appearance Appearance material Material diffusecolor 1 0 0 geometry Box DEF touchBox TouchSensor DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffusecolor 0 1 0 geometry Sphere DEF cone Transform translation -5 0 0 children Shap

20、e appearance Appearance material Material diffusecolor 0 0 1 geometry Cone # end of Group childrenROUTE touchBox.isActive TO view2.set_bind 把这个文件调入浏览器,然后把鼠标指向方块并按下左钮(先别松开!), 可以看到视点已经变为view2,内部的机制我们已经很清楚:左钮按下时方块节点 的接触检测器被触发,接着接触检测器从事件出口isActive送出一个事件“TRUE” ,这个事件通过路由进入视点节点view2的事件入口set_bind,view2收到“TR

21、UE” 后成为当前视点,所以在我们眼前场景发生了变化。 现在松开左钮,可以看到场景恢复到原来方位,这种功能称为视点回跳,其原因是 松开左钮后接触检测器向view2发送了一个“FALSE”事件,这样view2当前的地位被 解除,原来的视点成为系统视点栈的栈顶节点(即当前视点),详细说明可参见标准中对视点节点的专门论述。如果我们不想视点回跳,就想停留在view2视点,那 该怎么办呢?这种非系统缺省功能要自己来定义。利用脚本编写自定义行为在VRML中,利用Script 节点(脚本节点) 定义用户自定义行为,所谓定义即用脚本描述语言(Scripting Language)编写脚 本的过程。VRML97

22、支持的脚本描述语言目前有两种:Java和EMCAScript(这是JavaScript标准化后的名称),关于这两种语言本身,请参考相应参考书,VRML97标准 中定义了它们和VRML的接口方法。应提请注意的是:VRML是基于节点的语言,所以 脚本也是封装在Script这个特殊节点中的。这里我们不过多讨论脚本描述语言的细节,主要讨论把脚本集成到VRML文件中的方法。 上面我们曾把接触检测器touchBox 和视点view2直接通过路径连接起来,现在要定 义我们指定的行为,就需要在二者之间插入一个脚本节点,也就是让路径绕个弯:ROUTE touchBbox.isActive TO touchScr

23、ipt.touchBoxIsActiveROUTE touchScript.bindView2 TO view2.set_bind 其中的脚本节点touchScript有一个事件人口touchBoxIsActive 和一个事件出口bind_view2,前者接收来自接触检测器touchBox的事件,然后经自己的脚本处理后,把结果发送给视点节点view2:DEF touchScript Script eventIn SFBool touchBoxIsActiveeventOut SFBool bindView2urljavescript:function touchBoxIsActive(acti

24、ve) bindView2=TRUE; 关于这个Script节点,请注意一下几点:(1)它的事件入口touchBoxIsActive和事件出口 bindView2是自定义的,其它VRML节点的域和事件都是固定的。(2)事件入口touchBoxIsActive(即入事件)和事件出口bindView2(即出事件)的类型都是SFBool(单值布尔型), touchBox的事件出口isActive和view2的事件入口set_bind的类型也是相同的。(3)“url” 是脚本节点的一个域,可以直接包含脚本,也可以包含一个或多个用url地址指示的脚本, 若有多个地址,则按照先后次序获取第一个可得到的脚本

25、。(4)脚本是以函数(function) 的形式给出的,函数名touchBoxIsActive 与事件入口的名称相同,这是和ECMAScript语言的 接口约定,表示相应事件入口收到事件后调用此函数进行处理。事件流程与小结下面我们整理一下事件流程:(1)用户在方块上按下鼠标左键。(2)接触检测器发出一个“TRUE”事件。(3)此事件进入脚本节点touchScript的事件入口touchBoxIsActive.(4)调用脚本函数touchBoxIsActive(注意函数并没有判断入事件的值)。(5)函数向touchScript的事件出口bindView2发送一个“TRUE”事件(还可以进行其它判

26、断或执行其它事件)。(6)view2节点收到“TRUE”事件,成为当前视点。按照VRML约定,“认为”上述事件是同时发生的,也就是这些事件的时间戳相同。(7)若用户松开鼠标左键,则接触检测器发出一个“FALSE”事件,此事件同样引起脚本函数调用 并发送“TRUE”事件,所以view2仍然保持为当前视点。#VRML V2.0 utf8DEF view1 Viewpoint position 0 0 20 description view1 DEF view2 Viewpoint position 5 0 20 description view2 Group children DEF box Tr

27、ansform translation 5 0 0 children Shape appearance Appearance material Material diffusecolor 1 0 0 geometry Box DEF touchbox TouchSensor DEF sphere Transform translation 0 0 0 children Shape appearance Appearance material Material diffusecolor 0 1 0 geometry Sphere DEF cone Tranform transltion -5 0

28、 0 children Shape appearance Appearance material Material diffusecolor 0 0 1 geometry Cone #end of Group children DEF touchScript Script eventIn SFBool touchBoxIsActiveeventOut SFBool bindView2url javascript :function touchBoxIsActive (active) ROUTE touchBox.isActive TO touchScript.touchBoxIsActiveR

29、OUTE touchScript.bindView2 TO view2.set_bind小结:本节建立的虚拟境界并不复杂,但涉及到了VRML2.0最基础性的功能和概念: 利用检测器产生事件、利用路由传递事件以及利用脚本编写自定义行为,掌握了这 些内容也就掌握了VRML2.0的核心。在后面的几节中,我们将探索一些专题性的有趣 功能,而本节是基础,因而必须透彻理解。邻近检测器本节讨论邻近检测器(ProximitySensor ),当用户进入或离开邻近检测器所划定的区域时就会触发它。 正如你在标准中可以查到的那样,ProximitySensor节点定义为:ProximitySensor expose

30、dField SFVec3f center 0 0 0exposedField SFVec3f size 0 0 0exposedField SFBool enabled TRUEeventOut SFBool isActiveeventOut SFVec3f position_changedeventOut SFRotation orientation_changedeventOut SFTime enterTtimeeventOut SFTime exitTtime 这里稍作介绍。ProximitySensor节点共有三个外露域(exposedField)和五个出事件(eventOut).

31、出事件我们已经熟悉,是节点状态发生改变时用来通知其它节点的,这里的出事件isActive 用于ProximitySensor通报自己已被激活。enterTime和exitTime通报用户(代表用户的用户化身或指示器)进入和退出ProximitySensor检测区的时刻。若用户已在检测器之内,则当用户的位置 或方位发生变化时,送出position_changed和orientation_changed出事件这五个出事件联合起来,就定义了邻近检测器的功能。外露域则集域(Field)、入事件(eventIn)和出事件(eventOut) 三者的功能于一身,也就是说,它既象域一样描述了节点的当前状态,

32、又可以作为入事件由其它节点修改这种状态,并作为出事件把这种改变通知其它节点。这里的enabled外露域是布尔型的,用于ProximitySensor的启用和停用,center和size定义形为长方体的邻近检测区。 我们的出发点是第一节中建造的境界helloworld,它是由方块、球体和圆柱这三个物体构成的静态世界,现在在球体周围增加一个邻近检测区:DEF sphere Transform translation 0 0 0 children Shape .DEF comeCloser ProximitySensor center 0 0 0 size 4 4 4 ProximitySensor

33、的名字为comeCloser,邻近区的中心和球体的球心重合,形状为正方体,边长为4米,是球体直径的两倍。当用户走进球体时就会触发这个邻近检测器,检测器发出isActive事件,我们把这个事件出口通过路由指向Script节点(用来绑定视点2):DEF comeCloserScript Script eventIn SFBool enterProximitySensorIsActiveeventOut SFBool bindView2url javascript :function enterProximitySensorIsActive(active) bindView2=TRUE; 随后,我们

34、在邻近检测器的出事件isActive和脚本节点comeCloserScript的入事件enterProximitySensorIsActive之间建立路由,后者收到事件后执行函数enterProximitySensroIsActive,函数发出bindView2出事件,这个出事件通过路由连接到视点节点view2:ROUTE comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActiveROUTE comeCloserScript.bindView2 TO view2.set_bind 也就是说,一旦用户进入邻近区,境界的

35、当前视点将转换成view2.这个由两个视点、三个物体、一个邻近检测器和一个脚本节点组成的境界的完整代码如下:#VRML V2.0 utf8DEF view1 Viewpoint position 0 0 20description view1 DEF view2 Viewpoint position 0 0 20description view2 Group children DEF box Transform translation 5 0 0children Shape appearance Appearance material Material diffusecolor 1 0 0 g

36、eometry Box DEF sphere Transform translation 0 0 0children Shape appearance Appearance material Materialdiffusecolor 0 1 0 DEF comeColser ProximitySensor center 0 0 0 size 4 4 4 DEF cone Transform translation -5 0 0childrenShape apperance Apperance meterial Meterialdiffusecolor 0 0 1 geometery Cone

37、#end of Group childrenDEF comeCloserScript ScripteventIn SFBool enterProximitySensorIsActiveeventOut SFBool bindView2url javascript :function enterProximitySensorIsActive(active)bindView2=TRUE;ROUTE comeCloser.isActive TO comeCloserScript.enterProximitySensorIsActiveROUTE comeCloserScript.bindView2

38、TO view2.set_bind再稍稍修改一下邻近检测器,把它的中心位置右移了2米:DEF comeCloser ProximitySensorcenter 2 0 0size 4 4 4这样就可以从左边走近球体,但不能从右边走近它。当用户走进房间时开启灯光,当用户离开时关闭灯光,从而建立功能丰富的“智能“空间。连续动画在前面我们已经使用过接触检测器,当我们把鼠标指针放到方块(这个几何节点包含接触检测器)上面时,指针形状发生变化,这意味着我们已经进入检测区,如果按下鼠标左钮,则按照我们的定义,当前视点会发生变化。 现在仍然制作这样一个对接触有反应的方块,只是接触后它会连续不断地转动,动画行为

39、可以用时间检测器(TimeSensor)驱动,而不断变化的旋转值可用脚本节点或朝向插补器(orientationInterpolator)给出。1。接触检测器 作为开始的基本代码是:#VRML V2.0 utf8DEF cube Transform rotation 1 1 1 0children Shapeappearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF TouchS TouchSensor DEF revolver Script eventIn SFBool startRevolvinge

40、ventOut SFRotation revolve field SFFloat angle 0url javascript :function startRevolving () revolve0=1;revolve1=1;revolve2=1;revolve3=angle;angle+=0.1;ROUTE TouchS.isOver TO revolver.startRevolvingROUTE revolver.revolve TO cube.set_rotation 其中,方块cube包含两个子节点,前者定义了它的形态(红色的单位立方体),后者把它定义成接触检测器。注意,cube的类型

41、是Transform节点,它的rotation 域是外露域,指定本组相对于上层坐标系的旋转值,这里指定的初始值是“1 1 1 0 ”,其中前三个数值定义旋转轴,最后一个值定义旋转角。由于它是外露域,因而可以通过入事件(名为set_rotation)进行修改,下面定义的动态行为就是这样实现的。 Script节点revolver的核心是内联的ECMAScript脚本函数。它给定一个不断变化的旋转值。当鼠标指针移动到方块之上时,接触检测器发出isOver,和第一节中采用的isActive事件不同,isOver只有在鼠从而启动函数startRevolving,函数将一个新的旋转值发往事件出口revol

42、ve,这个旋转值通过路由进入cube的外露域rotation,修改了方块的旋转角,引起它的朝向变化。鼠标指针在cube上面的每次方位变化都引起isOver事件发送一次,从而导致方块旋转一次。动态修改场景图场景图是描述境界结构的基本概念,节点是构成场景图的基本单元。组节点是能够包含字节点的节点,组节点本身还可作为其它组节点的子节点,从而形成层次性体系结构。VRML中的组节点包含Anchor(锚)、 Billboard(布告牌)、 Collision(碰撞)、Group (组)、Inline (内联)、LOD(细节层次)、 Switch(开关)、Transform(变换)共八种,除Inline、L

43、OD、Switch这几个具有特殊功能外,它们都定义了入事件addChildren 和removeChildren ,前者用于向组节点的子节点域children 中增加新的子节点,后者用于从中删除子节点,这样就可以动态修改场景图的结构。 下面是我们这一节要建立的境界,开始的时候球体位于左边红色方块的内部,在按动底部的绿色方块后,球体进入右边蓝色方块之内。首先定义三个方块:#VRML V2.0 utf8Viewpoint position 0 0 15 DEF leftBox Transform translation -5 0 0 children Shape appearance Appear

44、ance material Material diffuseColor 1 0 0 geometry Box DEF rightBox Transform translation 5 0 0 children Shape appearance Appearance material Material diffuseColor 0 0 1 geometry Box DEF onoff Transform translation 0 -5 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geom

45、etry Box 其中左边的方块为红色,右边的方块为蓝色,下边的方块为绿色,都是Transform类型,三者都位于场景图的最高层,都是场景图的根节点,都包含一个Box几何体作为子节点。下面为红方块增加一个球体子节点:DEF leftBox Transform translation -5 0 0 children Shape appearance Appearance material Material diffuseColor 1 0 0 geometry Box DEF SphereChild Shape appearance Appearance material Material diffuseColor 1 0 1 geometry Sphere radius 1.2 为了以后引用方便,这里还为球体子节点起了名字:SphereChild .为了让用户能够增删这个儿子,把绿方块定义成接触检测器:DEF onoff Transform translation 0 -5 0 children Shape appearance Appearance material Material diffuseColor 0 1 0 geometry Box

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号