《浏览器方的功能扩展技术》由会员分享,可在线阅读,更多相关《浏览器方的功能扩展技术(65页珍藏版)》请在金锄头文库上搜索。
1、浏览器方的功能扩展技术“浏览器服务器”所形成的基本client/server工作方式有三个特点: 简单易行简单易行: : 这使得它很快被实现和接受这使得它很快被实现和接受 有局限有局限 服务器方服务器方: : 功能单一功能单一 浏览器方浏览器方: : 能显示的数据类型有限能显示的数据类型有限 有潜力有潜力. . 在实践中扩充在实践中扩充, , 现代软件技术现代软件技术 ( (对象对象和构件技术和构件技术) ) 的结果的结果服务器方扩充CGIservlet LiveWireActive Server Page (ASP)Enterprise Java Bean (EJB)WAI浏览器方扩充Net
2、scape的plug-in技术, 目前也为IE支持.Microsoft的ActiveX Document技术(ActiveX技术的一部分).MIME数据类型是它们的共同工作基础之一.浏览器和服务器方的共同扩充让程序从服务器迁移到浏览器执行 applet, ActiveX control, applet, ActiveX control, JavaScript, JavaScript, VBScriptVBScript通信和互操作机制的加强: 分布式对象/构件技术 CORBA, DCOMCORBA, DCOM浏览器服务器AppletActiveX ControlJavaScriptVBScrip
3、tHTML DocsCGI ScriptservletLiveWirePluginActiveX DocNetscape的plug-in技术 什么是什么是plug-in ? plug-in ? 一个能和一个能和NavigatorNavigator配合工作的软件配合工作的软件模块模块, , 帮助它帮助它“ “显示显示” ”新的新的“ “数据类型数据类型”, ”, 或者或者以一种新的方式显示某些以一种新的方式显示某些“ “老数据类型老数据类型”. ”. 为什么需要为什么需要plug-in ? “plug-in ? “数据类型数据类型” ”的种类是无限的的种类是无限的, , 浏览器能显示的类型总是有
4、限的浏览器能显示的类型总是有限的. .WEB服务器netscape浏览器plug-inplug-in数据plug-in数据无限多的数据类型 text/plain, text/html, image/text/plain, text/html, image/gifgif, image/, image/jpgjpg, , audio/au, audio/au, audio/audio/ra ra, video/, video/aviavi, message/, extensions/, , message/, extensions/, application/application/msdocms
5、doc, ., . 数据类型数据类型: : 信息的一种编码形式信息的一种编码形式. . 信息的基本种信息的基本种类是有限的类是有限的( (例如文字例如文字, ,图像图像, ,声音声音, , 视频等视频等), ), 但但人们出于不同的应用目的人们出于不同的应用目的, , 总会不断创造新的编总会不断创造新的编码形式码形式. . 例如例如WordWord和和PageMakerPageMaker的文件所采用的编码是不同的的文件所采用的编码是不同的, , 尽管它们都是针对相同的基本信息种类尽管它们都是针对相同的基本信息种类. . 因此它们对因此它们对应不同的数据类型应不同的数据类型. .数据类型和信息的
6、显示一种广义的映射关系一种广义的映射关系, , 非常大的一个概念非常大的一个概念 “ “信息的显示信息的显示” - ” - 不一定是为了给人看不一定是为了给人看 同一种数据类型可以有不同的显示同一种数据类型可以有不同的显示 数据类型还可以是数据类型还可以是“ “嵌套嵌套” ”的的. .浏览器就是实现这种映射的一个程序浏览器就是实现这种映射的一个程序 它要知道所收到数据的类型它要知道所收到数据的类型, , 以及该数据类型设计者以及该数据类型设计者的的“ “显示显示” ”意图意图. .Plug-in 示例Plug-in 示例Plug-in 示例从三个不同的角度看plug-in用户(网页编写者) 的
7、角度: 如何准备plug-in数据, 可以期望什么效果 ? 安装者的角度: 如何将一个plug-in模块加到Navigator中 ?开发者的角度: 如何实现一个plug-in ? 遵照Netscape定义的API和编码规则.在网页中使用一种plug-in (数据类型)保证潜在的浏览器安装了该plug-in. 如果不清楚, 你可以提供一张“bridge page”来提供该plug-in, 使浏览器能首先安装它.通过MIME机构, 配置你的WEB服务器,使其能识别这种plug-in数据.用 . 标记将该数据类型引入你的网页中.EMBED标记的一些主要典型属性 height, width: plug
8、-inheight, width: plug-in在浏览器窗口中的大小在浏览器窗口中的大小 ( (缺省单位缺省单位为象素数为象素数) ) srcsrc: : 一个指向一个指向plug-inplug-in数据的数据的URLURL type: type: 本本 plug-in plug-in 的的MIMEMIME类型类型 hidden: true,false hidden: true,false 指示本指示本plug-inplug-in是否可见是否可见 units: pixel,en, enunits: pixel,en, en为当前字体点大小的为当前字体点大小的1/2.1/2. pluginsp
9、agepluginspage: : 一个指向描述该一个指向描述该plug-inplug-in的的URL.URL. text: text: 可能的文字内容可能的文字内容srcsrc和和typetype之一必须出现之一必须出现; ; pluginplugin开发者可定义其它属性开发者可定义其它属性. .一个例子Plain text isnt very exciting, butpPlain text isnt very exciting, butEMBED can”EMBEDtext as fancy”EMBEDyou like” one.one.txftxf: 001 255 000 000 0
10、00 000 000: 001 255 000 000 000 000 000 two. two.txftxf: 002 128 128 128 000 000 000: 002 128 128 128 000 000 000three.three.txftxf: 003 000 000 255 000 000 000: 003 000 000 255 000 000 000 style red green blue style red green blue xpos ypos xpos ypos factor factor注:在本例中在本例中, , SRCSRC所对应数据文件的扩展名对所对应
11、数据文件的扩展名对应应pluginplugin的数据类型的数据类型. . 根据这个数据类型根据这个数据类型, , 浏览器决定启用哪一个浏览器决定启用哪一个pluginplugin模块模块. .EMBEDEMBED标记的属性和标记的属性和pluginplugin数据的解释关系数据的解释关系由由pluginplugin设计者决定设计者决定在在HTML 4.0HTML 4.0中中, , OBJECT标记作为一种标记作为一种通用描述通用描述, , 取代了取代了EMBED, APPLETEMBED, APPLET等标记等标记How applet is included in HTML 4 documen
12、tJava applet that draws animated bubbles.Plug-in的安装最常见的错误是将它的可执行码放到了不正确的目录中 Windows: “Windows: “pluginsplugins” ” 文件夹文件夹( (folder)folder) Mac: “Plug-ins” Mac: “Plug-ins” 文件夹文件夹 UNIX: /usr/local/lib/UNIX: /usr/local/lib/netscapenetscape/ /pluginsplugins 或或$ $HOME/.HOME/.netscapenetscape/ /pluginsplug
13、ins, , 或由环境变或由环境变量量NPX_PLUGIN_PATHNPX_PLUGIN_PATH指出的目录指出的目录安全问题:plugin一旦安装, 就和浏览器有同样权限.Plug-in工作的生命周期 用户访问一张含有用户访问一张含有pluginplugin数据的网页数据的网页; ; 浏览器加载该浏览器加载该pluginplugin模块模块, , 并生成一个新的运行并生成一个新的运行实例实例; ; 浏览器为该实例提供一个显示区域浏览器为该实例提供一个显示区域 ( (在浏览器窗在浏览器窗口中口中);); 浏览器将浏览器将pluginplugin数据传给该实例数据传给该实例, , 并启动它执行并
14、启动它执行. . PluginPlugin按照它自己的方式显示数据按照它自己的方式显示数据 当用户离开当前网页时当用户离开当前网页时, , 该实例被销毁该实例被销毁. . 如果没有其它实例如果没有其它实例, , 该该pluginplugin模块被卸载模块被卸载. .Plug-in的对象模型 基于编码技术和规则基于编码技术和规则, , 而不是通过语言支持而不是通过语言支持. . 仅考虑实例创建和函数调用等基本机制仅考虑实例创建和函数调用等基本机制. . 面向对象程序设计不一定需要面向对象程序设计语言面向对象程序设计不一定需要面向对象程序设计语言 ? ?class String class Str
15、ing typedef structtypedef struct public: public: constconst char *string; char *string; constconst char *color; char *color; string( string(const const char *s) char *s) String; String; string=s; color = NULL; String * string=s; color = NULL; String *NewStringNewString( (const const char *s) char *s
16、) void void setColorsetColor( (const const char* c) String *char* c) String *objobj=(String *)=(String *) color=c; color=c; mallocmalloc( (sizeofsizeof(String);(String); private: private: objobj-string = s; -string = s; objobj-color=NULL;-color=NULL; constconst char *string; return char *string; ret
17、urn objobj; ; constconst char *color; void char *color; void setColorsetColor(String *(String *objobj, ,constconst char *c) char *c) objobj-color = c; -color = c; 用于开发Plug-in的API16个 NPP_ 函数, 由plug-in实现, Navigator调用;16个 NPN_ 函数, 由Navigator实现, plug-in调用.例如例如NPErrorNPError NPP_ NPP_SetWindowSetWindow(N
18、PP instance, (NPP instance, NPWindow NPWindow *window) *window) PluginInstance PluginInstance *This=(*This=(PluginInstance PluginInstance *) instance-*) instance-pdatapdata; ; This-window = window; This-window = window; NPN_NPN_SetStatusSetStatus(instance, “Creating user interface”);(instance, “Crea
19、ting user interface”); 浏览器调用浏览器调用pluginplugin中实现的函数中实现的函数, , 传给它一个传给它一个pluginplugin数据和一个数据和一个window (window (对应浏览器窗口中的一个区域对应浏览器窗口中的一个区域) ) pluginplugin实例将数据建立在自己的空间中实例将数据建立在自己的空间中 pluginplugin反过来调用浏览器中实现的函数反过来调用浏览器中实现的函数, , 显示状态信显示状态信息息. .NPError NPP_New(NPMIMEType pluginType, NPP instance,NPError N
20、PP_New(NPMIMEType pluginType, NPP instance, uint16 mode; int16 argc, char *argn,uint16 mode; int16 argc, char *argn, char *argv, NPSavedData *saved) char *argv, NPSavedData *saved) int i; int i; instance-pdata=NPN_MemAlloc(sizeof(PluginInstance); instance-pdata=NPN_MemAlloc(sizeof(PluginInstance); P
21、luginInstance *This=(PluginInstance*)instance-pdata; PluginInstance *This=(PluginInstance*)instance-pdata; This-window=NULL; This-instance=instance; This-window=NULL; This-instance=instance; This-mode=mode; This-iteration=0; This-label=NULL; This-mode=mode; This-iteration=0; This-label=NULL; for (i=
22、0;iargc; i+) for (i=0;iiterations=atoi(argvi); This-iterations=atoi(argvi); if (!stricmp(argni,”label”) if (!stricmp(argni,”label”) This-label=NPN_MemAlloc(strlen(argvi); This-label=NPN_MemAlloc(strlen(argvi); strcpy(This-label, argvi); strcpy(This-label, argvi); return NPERR_NO_ERROR; return NPERR_
23、NO_ERROR; Plug-in API中的数据交换部分NPP_NPP_NewStreamNewStream()()NPP_Write() ; NPP_Write() ; plug-in plug-in由此得到数据由此得到数据NPP_NPP_DestroyStreamDestroyStream()()NPN_NPN_NewStreamNewStream()()NPN_Write(); plug-inNPN_Write(); plug-in送数据给浏览器送数据给浏览器NPN_NPN_DestroyStreamDestroyStream()()NPN_NPN_GetURLGetURL(); pl
24、ug-in(); plug-in可以直接和一个远程可以直接和一个远程服务器建立连接服务器建立连接, , 不一定是不一定是HTTP.HTTP.NPN_NPN_PostURLPostURL()()有关plug-in的其它问题 扩散与流行扩散与流行 免费免费, , 或初始版本免费或初始版本免费 plug-inplug-in软件免费软件免费, , 但创建但创建plug-inplug-in数据的工具不免费数据的工具不免费 ( (例如例如ShockwaveShockwave) ) 数据免费数据免费 ( (例如海量天气数据例如海量天气数据, , 历史股票数据等历史股票数据等), ), 但但表现那些数据的表现
25、那些数据的plug-inplug-in收费收费 plug-inplug-in在在intranetsintranets中也许比在中也许比在InternetInternet中更有用中更有用 跨平台性跨平台性: : Win95, 3.x, NT, OS/2, Mac,Win95, 3.x, NT, OS/2, Mac, UnixesUnixes 通常难以做到通常难以做到 性能性能: : 好于好于 Java, JavaScript.Java, JavaScript. LiveConnectLiveConnect: Netscape: Netscape推出的使推出的使plug-in plug-in 与与
26、 Java, JavaScriptJava, JavaScript协同工作的技术协同工作的技术. .ActiveX DocumentsMicrosoft的浏览器方扩充技术 (in a very general way)ActiveX技术的一个方面源于OLE, 但富于OLEInternet Explorer 3.0就是由ActiveX Documents构筑起来的Internet Explorer 3.0将浏览器的通用功能和显示不同对象的具体将浏览器的通用功能和显示不同对象的具体功能分离开来功能分离开来一般功能包括一般功能包括: : navigating to a link, navigatin
27、g to a link, going forward and back, going forward and back, IEXPLORE.EXE, IEXPLORE.EXE, 提供一个基本框架提供一个基本框架SHDOCVW.DLL, Web Browser object, SHDOCVW.DLL, Web Browser object, 提供通用功能提供通用功能, , 作为一个作为一个ActiveX ActiveX Document Container.Document Container.MSHTML.DLL, HTML viewer, an ActiveX MSHTML.DLL, HTM
28、L viewer, an ActiveX Document serverDocument serverInternet Explorer 3.0 (示意)ActiveX/DCOM嵌入在NT 4.0及以后的系统中.德国的Software AG已将DCOM在UNIX上实现 (beta免费可得)从COM到DCOM, 尽管扩充的内容不很多, 但使得“enterprise computing”计算在Wintel结构上成为可能.COM是Microsoft所有技术的根基. 有人比喻, COM对Microsoft相当于粒子物理对整个宇宙.从COM到ActiveX的演变OLE 1 OLE 1 组合文档组合文档
29、( (字处理字处理, ,电子表格电子表格, ,数据库数据库, ,画图画图) )COM COM “ “各种软件构件怎么能够相互提供服务各种软件构件怎么能够相互提供服务 ?” ?”OLE 2 OLE 2 不仅是组合文档技术不仅是组合文档技术, , 而是一种使各种而是一种使各种 软件相互作用的通用技术软件相互作用的通用技术 OLE (OLE (不再是一个缩略语不再是一个缩略语) )19961996.1 .1 ActiveX OLE (ActiveX OLE (还原到还原到“ “组合文档组合文档”)”) DCOMDCOM 构件对象模型Component Object Model (COM)出发点出发点
30、: : 让软件系统让软件系统S S由由构件构件构件构件C1, C2, , C1, C2, , 组成组成 ( (COM object)COM object) 这些构件这些构件C C不一定是专门为不一定是专门为S S所设计的所设计的, , 有些在有些在S S之前已存之前已存在在 为这系统所设计的构件将来可被其它系统所用为这系统所设计的构件将来可被其它系统所用, , 将来设计将来设计的构件还可用来扩充系统的构件还可用来扩充系统S S的功能的功能, , 不需重新编译链接不需重新编译链接. . 构件的内部改变不影响其所参与的系统的功能构件的内部改变不影响其所参与的系统的功能COM:COM: 给出了一个关
31、于什么能被称为构件给出了一个关于什么能被称为构件 ( (COM COM 对象对象) ) 的规定的规定 提供了一种以系统软件形式存在的基础设施提供了一种以系统软件形式存在的基础设施, , 使得满足其使得满足其规定的构件能够规定的构件能够“ “互操作互操作” ” ( (interoperateinteroperate). ).COM对象 多界面多界面( (interfaceinterface), ), 每个界面包含一组方法每个界面包含一组方法 每个界面有两个名字每个界面有两个名字, , 一是供程序员识别一是供程序员识别 ( (如如LookUpWordLookUpWord) ), , 二是二是GUI
32、D (Globally Unique Identifier, GUID (Globally Unique Identifier, 128128位位), ), 特殊生成特殊生成, , 供计算机使用供计算机使用. . 界面通常由界面通常由MicrosoftMicrosoft的的IDL(IDL(界面描述语言界面描述语言) )描述描述 一旦在发布的软件中实现一旦在发布的软件中实现, , 界面就再不许修改界面就再不许修改. . 每个构件必须实现界面每个构件必须实现界面 IUnknown, IUnknown, 其它界面必须从其它界面必须从它继承它继承. .COM对象界面界面界面一个简单界面的描述 obje
33、ct,object, uuid uuid(E7CD0D00-1827-11CF-9946-444553540000)(E7CD0D00-1827-11CF-9946-444553540000)interfaceinterface ISpellChecker ISpellChecker: : IUnkownIUnkown import “unknown. import “unknown.idlidl”; ”; HRESULT HRESULT LookUpWord LookUpWord (in OLECHAR word31, (in OLECHAR word31, out out boolean
34、boolean *found); *found); HRESULT HRESULT AddToDictionary AddToDictionary (in OLECHAR word31); (in OLECHAR word31); HRESULT HRESULT RemoveFromDictionary RemoveFromDictionary (in OLECHAR (in OLECHAR word31);word31); IUnkownIUnkown 界面有三个基本方法界面有三个基本方法QueryInterfaceQueryInterface, , AddRef AddRef, Relea
35、se., Release.ActiveX Document一种特殊的COM object 要满足要满足COM objectCOM object的一些基本要求的一些基本要求, , 例如实现例如实现IUnknownIUnknown等等 有一些特殊的界面有一些特殊的界面, , 例如例如 只能在只能在ActiveX Document ContainerActiveX Document Container中活动中活动(ActiveX Document Container本身又是另一种COM object !)VRML (2.0) The Virtual Reality Modeling Language
36、 (第二版)http:/ (2.0)一种语言, 用于描述三维物体和由它们构成的三维场景; 该场景可以具有现实世界的多种特征、可以是动态的, 也可以和观察者交互作用.它最引人入胜的应用是使人们能够在Web上构建动态的、具有丰富的传感效应的虚拟环境VRML (2.0)不仅是VRML (1.0)的一个扩充. 围绕VRML(2.0)的活动语言的进一步发展,标准化:VRML97VRML浏览器(播放器)的开发CosmoPlayer, WorldView, Liquid Reality, 等VRML应用开发工具www.sdsc.edu/vrml/software/modelers.htmlVRML应用开发剧
37、场订票,商场购物,旅游景点介绍,等VRML的主要能力描述三维物体及由它们构成的场景动画:使物体在三维空间中运动在场景中播放声音和电影使观察者能与场景交互作用:传感与事件通过脚本(用Java和JavaScript写的)使观察者在场景中的感受更加生动。VRML (2.0) 文件的基本格式文件扩展名:.wrl第一行必须是:#VRML V2.0 utf8这也是唯一必须有的内容。后面是关于“节点”(Node)的描述和注释注释用“#”开始,直到本行结束VRML是区分大小写字母的现在的CosmoPlayer对词法, 语法错误的处理非常弱 (难怪免费).例子1: 一个半开口的圆柱体#VRML V2.0 utf
38、8Shape appearance Appearance material Material #用缺省材质和颜色 geometry Cylinder radius 3 height 6 side TRUE top FALSE bottom TRUE 节点(node),VRML世界的基本单位其地位相当于面向对象语言中的对象, 但语义简单许多节点由若干域(Field)描述. 每个域包括域名(也称域的类型)和“值”. 节点的域可能是简单的参数, 如上例中的圆柱体节点有若干描述圆柱体的具体参数.节点的域也可能是另外的节点, 如上例中的Shape节点, 它含有两个域, 名字分别为外观(appearanc
39、e)和几何形状(geometry), 其值都是别的节点.节点描述和域的次序无关从与外界交互的性质上讲, 节点的域分两类: field, exposedField. (见后)VRML的节点 (续)有一些系统已定义的节点, 例如 Box, Cylinder, Shape, Material, SpotLight等它们所含的域(名)是确定的, 例如radius等.VRML文本编写者的任务就是要给这些域设计适当的值系统对这些域有缺省值, 例如Boxsize 2, 2, 2, Sphere radius 1 等.用户也可以自定义非规则几何体节点 (见后)VRML的节点 (续)在文本规范说明中, VRML
40、用特殊的记号表示节点中域的值的数据类型, 例如SFBool表示逻辑量, 取值TRUE或FALSE, SFFloat表示浮点数, SFColor表示3个0-1之间的浮点数, 分别代表RGB而MFFloat表示包括在方括号中的、由逗号或空格分开的多个浮点数这里的SF表示“Single-valued Field”, MF记“Multiple-valued Field”单值域并不一定就是一个数(例如SFColor含有3个数), 多个数的SF被看成一个整体.两个节点定义规范的例子DirectionalLight on TRUE # exposed field SFBool intensity 1 # e
41、xposed field SFFloat ambientIntensity 0 # exposed field SFFloat color 1 1 1 # exposed field SFColor direction 0 0 -1 # exposed field SFVec3f其中给出的值为缺省值, exposed field的基本含义是“可修改”.Inline url # exposed field MFString bboxCenter 0 0 0 # SFVec3f bboxSize -1 -1 -1 # SFVec3f , 缺省指示无界VRML的节点类型形状节点(shape node
42、s) - 描述物体在空间中的几何形状性质节点(property nodes) - 定义形状节点的渲染方式(颜色, 表面纹理等). 成组节点(group node) - 将多个其它节点组合成一个节点, 以便于统一处理.还有环境效果节点, 例如各种性质的光源.描述三维物体及其场景基本几何体geometry: Box, Sphere, Cone, Cylinder表面特性appearance: material, texture, .Shape节点: 通过赋予其一定的表面特性,使几何体可见空间位置右手坐标系统: translation, rotation, scale组合几何体Group, Tran
43、sform, .环境效果DirectionalLight, PointLight, Spotlight例子2: 简单世界#VRML V2.0 utf8Group children DirectionalLight direction 0 0 -1 # the first child Transform # the second child translation 3 0 1 children Shape geometry Sphere radius 2.3 appearance Appearance material Material diffuseColor 1 0 0 Transform
44、# the third child translation -2.4 .2 1 rotation 0 1 1 .9 # 不仅位移, 还要旋转 children Shape geometry Box appearance Appearance material Material diffuseColor 0 0 1 VRML的坐标系统右手坐标系统, 缺省距离单位是米基本几何体的缺省位置是中心位于坐标系统的原点 Box size 2 2 2Box size 2 2 2 Cone Cone bottomRadiusbottomRadius 1 height 2 1 height 2 Cylinder
45、 radius 1 height 2Cylinder radius 1 height 2 Sphere radius 1Sphere radius 1缺省Viewpoint为 (0 0 10).XYZVRML的坐标变换translation x y z translation x y z 将物体平行位移将物体平行位移rotation x y z r rotation x y z r 按右手法则按右手法则, , 将物体将物体围绕由原点和 (x y z)确定的射线旋转r弧度scale x y z, scale x y z, 相对原点相对原点, , 按照给出的比例因按照给出的比例因子在空间三个方向上
46、放大子在空间三个方向上放大( (缩小缩小) )注意注意: : 变换是针对物体上每一个点的变换是针对物体上每一个点的. .在成组节点中在成组节点中, , 变换对组中的节点都有效变换对组中的节点都有效. . 嵌套的变换效果叠加嵌套的变换效果叠加, , 由内向外由内向外变换顺序变换顺序: : scale, rotation, translationscale, rotation, translation还有些可选参数还有些可选参数, , 例如旋转的原点例如旋转的原点, , 放大的放大的中心等中心等表面特性: Appearance节点material域: 值为Material节点, 可有如下域 dif
47、fuseColordiffuseColor, , 颜色的反射与入光角度有关颜色的反射与入光角度有关 shinenessshineness, , 光洁度光洁度, , 取值取值 0.0 - 1.0 0.0 - 1.0 transparency, transparency, 透明度透明度, , 取值取值 0.0 - 1.0 0.0 - 1.0texture域: 值取ImageTexture, MovieTexture, PixelTexture节点之一textureTransform域: TextureTransform节点. 用于在施用前对纹理做空间变换例子3: 图像纹理的应用#VRML V2.0
48、 utf8Shape geometry Box appearance Appearance texture ImageTexture url “ie.gif” 例子4: 构造一个四面体# #VRML V2.0 utf8VRML V2.0 utf8Shape Shape geometry geometry IndexedFaceSetIndexedFaceSet coord coord Coordinate # Coordinate # 给出给出4 4个顶点的坐标个顶点的坐标 point 0 0 1, 1.7 0 -0.5, -1.7 0 -0.5, 0 1 0 point 0 0 1, 1.7
49、 0 -0.5, -1.7 0 -0.5, 0 1 0 # # 用顶点序列来说明用顶点序列来说明“ “面面”, -1”, -1为分隔符为分隔符. .注意底面的注意底面的节点顺序节点顺序, “, “右手法则右手法则” ” coordIndexcoordIndex 0 2 1 -1, 0 1 3 -1, 1 2 3 -1, 2 0 3 -1 0 2 1 -1, 0 1 3 -1, 1 2 3 -1, 2 0 3 -1 color Color # color Color # 造一个颜色表造一个颜色表 color 1 0 0, 0 1 0, 0 0 1, 1 1 0 #color 1 0 0, 0 1
50、 0, 0 0 1, 1 1 0 #红红, ,绿绿, ,蓝蓝, ,黄黄 colorIndexcolorIndex 1, 0, 2, 3 # 1, 0, 2, 3 # 底面底面(0 2 1)(0 2 1)用绿色用绿色, , 等等 colorPerVertexcolorPerVertex FALSE # FALSE # 不要按顶点着色不要按顶点着色 VRML的动画能力 Ability to change the world over timeAbility to change the world over time 不仅几何位置的变化,还包括颜色、光线、声音等。不仅几何位置的变化,还包括颜色、光线
51、、声音等。 具体表现在对有关节点属性值的动态改变具体表现在对有关节点属性值的动态改变 如何启动一个动画过程如何启动一个动画过程 ? - - VRMLVRML提供各种各样的提供各种各样的“ “传感器传感器” ”节点节点, , 响应用户事件响应用户事件. . 如何在时间上控制一个动画过程如何在时间上控制一个动画过程 ?- - TimeSensorTimeSensor节节点点 如何在行为上控制一个动画过程如何在行为上控制一个动画过程 ?- - 各种各样的各种各样的“ “插值器插值器” ”节点节点 通过通过ROUTEROUTE语句进行事件的传播语句进行事件的传播:VRMLVRML动画的基本动画的基本机
52、制机制一个最简单的动画例子 (eg5)# #VRML V2.0 utf8VRML V2.0 utf8Group Group children children DEF DEF PUSHPUSH TouchSensor TouchSensor # # 和下面的节点相联系和下面的节点相联系 Shape Shape geometry Cone geometry Cone appearance Appearance appearance Appearance material Material material Material diffuseColor diffuseColor 1 0 1 1 0
53、1 Sound # Sound # 定义一个音响节点定义一个音响节点 source DEF source DEF BUZZBUZZ AudioClip AudioClip urlurl mssoundmssound. .wavwav maxFront maxFront 50 50 # no sound heard beyond # no sound heard beyond minFront minFront 5 # no change in volume within 5 # no change in volume within ROUTE ROUTE PUSHPUSH. .touchTim
54、etouchTime TO TO BUZZBUZZ. .startTimestartTimeVRML的声音和文字SoundSound节点节点, , 可以定义声源在场景中的位置可以定义声源在场景中的位置, , 以及该声音能被听到的范围以及该声音能被听到的范围AudioClipAudioClip节点节点, , 出现在出现在SoundSound节点的节点的sourcesource域域中中, , 指出声音文件指出声音文件. . 该节点还含有该节点还含有loop, loop, startTimestartTime, , stopTimestopTime等等exposed fieldsexposed fi
55、elds以控制以控制声音播放声音播放TextText节点节点, , 作为一种作为一种geometrygeometry节点节点, , 给出文字给出文字信息信息FontStyleFontStyle节点节点, , 出现在出现在TextText节点的节点的fontStylefontStyle域域中中, , 描述文字的字体等描述文字的字体等文字例子 (eg6)# #VRML V2.0 utf8VRML V2.0 utf8Shape Shape geometry Text geometry Text string Internet and Java Technologies string Internet
56、 and Java Technologies fontStyle FontStyle fontStyle FontStyle size 1.5 size 1.5 family SERIF family SERIF style BOLD style BOLD VRML的事件: 交互与动态的基础事件是某些节点的性质(在VRML的53种节点中, 多数与事件有关)如何知道什么节点与什么事件有关 节点规范中的显示说明节点规范中的显示说明 节点的节点的exposed Fieldexposed Field域隐含相关事件域隐含相关事件ROUTE语句: 让不同节点之间事件相互联系的手段 (起一个类似于赋值语句的
57、作用)接触传感器规范说明的例子TouchSensor TouchSensor enabled TRUE # exposed field enabled TRUE # exposed field SFBoolSFBool FieldFieldenabled enabled 指出该传感器当前是否处于工作状态指出该传感器当前是否处于工作状态 EventsEventsisOver isOver eventOuteventOut, , SFBool SFBool, , 指出鼠标正放在指出鼠标正放在兄弟几何节点兄弟几何节点之上之上isActive isActive eventOuteventOut, ,
58、SFBool SFBool, , 指出鼠标已经按下指出鼠标已经按下touchTime touchTime eventOuteventOut, , SFTime SFTime, , 指出鼠标按下后释放的时间指出鼠标按下后释放的时间hitPointhitPoint_changed eventOut, SFVec3f, _changed eventOut, SFVec3f, 指出位置的变化指出位置的变化hitNormalhitNormal_changed eventOut, SFVec3f, _changed eventOut, SFVec3f, 指出法线的变化指出法线的变化hitTexCoordh
59、itTexCoord_changed eventOut, SFVec2f, _changed eventOut, SFVec2f, 指出纹理坐标的变化指出纹理坐标的变化Transform Transform bboxCenterbboxCenter 0 0 0 # SFVec3f 0 0 0 # SFVec3f bboxSizebboxSize -1 -1 -1 # SFVec3f -1 -1 -1 # SFVec3f translationtranslation 0 0 0 # 0 0 0 # exposed fieldexposed field SFVec3f SFVec3f rotati
60、on 0 0 1 0 # exposed field rotation 0 0 1 0 # exposed field SFRotationSFRotation scale 1 1 1 # exposed field SFVec3fscale 1 1 1 # exposed field SFVec3f scaleOrientation scaleOrientation 0 0 1 0 # exposed field 0 0 1 0 # exposed field SFRotationSFRotation center 0 0 0 # exposed field SFVec3fcenter 0
61、0 0 # exposed field SFVec3f children # exposed field children # exposed field MFNodeMFNode 任何一个任何一个exposed fieldexposed field都隐含对应两个事件都隐含对应两个事件, , 于是于是TransformTransform相当于有事件相当于有事件set_set_translationtranslation ( (输入事件输入事件, , eventIneventIn) )translationtranslation_changed_changed ( (输出事件输出事件, , ev
62、entOuteventOut) )set_rotation, rotation_changed, set_rotation, rotation_changed, 等等等等TimeSensorTimeSensorTimeSensor cycleInterval cycleInterval 1 1 # # exposed exposed 秒为单位的周期长度秒为单位的周期长度 enabled enabled TRUETRUE loop loop FALSE FALSE # exposed # exposed 是否应无限重复是否应无限重复 startTime startTime 0 0 stopTim
63、e stopTime 0 0 还有专门还有专门eventOuteventOut事件事件fraction_changed, fraction_changed, 表示当前表示当前周期周期( (cycleIntervalcycleInterval) )已经完成已经完成. .PositionInterpolator: 位置插值器PositionInterpolator PositionInterpolator key # exposed field key # exposed field MFFloatMFFloat keyValue keyValue # exposed field MFVec3f
64、# exposed field MFVec3f key: key: 从从0 0到到1 1的一个规格化时间表的一个规格化时间表, , 每一项是个每一项是个 fraction.fraction. keyValuekeyValue: 3: 3维空间中的一个位置表维空间中的一个位置表 还有专门还有专门eventIneventIn事件事件set_fractionset_fraction和和eventOuteventOut事件事件value_changed. value_changed. 前者对应已完成的一段时间前者对应已完成的一段时间, ,后者对应后者对应空间位置空间位置# #VRML V2.0 utf
65、8VRML V2.0 utf8Transform # Transform # 利用位置插值器做动画利用位置插值器做动画 eg7eg7 translation -5 0 0translation -5 0 0 children children DEF BUTTDEF BUTT TouchSensor TouchSensor Shape Shape geometry Box size 1 1 1geometry Box size 1 1 1 appearance Appearance appearance Appearance material Material material Materia
66、l diffuseColordiffuseColor 1 0 0 1 0 0 DEF Moving_DEF Moving_ObjObj Transform Transform children children Shape Shape geometry Box # a boxgeometry Box # a box appearance Appearance appearance Appearance material Material material Material diffuseColordiffuseColor 0 1 0 0 1 0 DEF TIMERDEF TIMER TimeS
67、ensor TimeSensor cycleIntervalcycleInterval 1.5 1.5 DEFDEF Obj Obj_MOVER_MOVER PositionInterpolator PositionInterpolator # #在在1.51.5秒里完成秒里完成3 3次移动次移动 key 0, 0.33, 0.67, 1 key 0, 0.33, 0.67, 1 keyValuekeyValue 0 0 0, 1 3 -2, 5 3 -1, 0 0 0 0 0 0, 1 3 -2, 5 3 -1, 0 0 0 ROUTE BUTT.ROUTE BUTT.touchTimeto
68、uchTime TO TIMER. TO TIMER.startTime startTime ROUTE TIMER.fraction_changed TOROUTE TIMER.fraction_changed TO Obj Obj_MOVER.set_fraction_MOVER.set_fractionROUTEROUTE Obj Obj_MOVER.value_changed TO Moving_MOVER.value_changed TO Moving_ObjObj.translation.translation# #VRML V2.0 utf8VRML V2.0 utf8DEF D
69、ELAY Script # DEF DELAY Script # 利用利用ScriptScript延迟事件的发生延迟事件的发生 eg8eg8 eventIn SFTime touchTimeeventIn SFTime touchTime eventOut SFTime startTimeeventOut SFTime startTime urlurl javascriptjavascript: : functionfunction touchTime touchTime ( (timevaluetimevalue) ) startTimestartTime = = timevalue tim
70、evalue + 5; + 5; “ “ Group Group children children DEF PUSHDEF PUSH TouchSensor TouchSensor Shape Shape geometry Box geometry Box appearance Appearance appearance Appearance material Material material Material diffuseColor diffuseColor 1 0 1 1 0 1 Sound Sound source DEF BUZZsource DEF BUZZ AudioClip
71、 AudioClip urlurl mssoundmssound. .wavwav maxFrontmaxFront 50 # no sound heard beyond 50 # no sound heard beyond minFrontminFront 5 # no change in volume within 5 # no change in volume within ROUTE PUSH.ROUTE PUSH.touchTimetouchTime TO DELAY. TO DELAY.touchTimetouchTimeROUTE DELAY.ROUTE DELAY.startTimestartTime TO BUZZ. TO BUZZ.startTimestartTimeHW10完成一个至少包含6个几何体的VRML世界apply other techniques as you like不要用工具产生, 要手工写成在两周内用email提交调试好的世界, 我将随时收集它们并在课程网站上公布出来.