1、第三章虚拟现实技术VRML的空间造型3.13.1 空间变换空间变换 利用利用Transform Transform(变换)节点可以在(变换)节点可以在VRMLVRML空空间创建新的坐标系,可以随意间创建新的坐标系,可以随意translationtranslation(平(平移)、移)、rotationrotation(旋转)和(旋转)和scalescale(缩放)。(缩放)。坐标变换语法DEF和USEVRMLVRML提供给我们两个避免重复劳动的工具提供给我们两个避免重复劳动的工具:DEFDEF和和USEUSEDEFDEF为节点定义名称为节点定义名称USEUSE重新使用节点重新使用节点这两个说明
2、符可以放在任何允许节点名的地方。在定这两个说明符可以放在任何允许节点名的地方。在定义了义了节点名字节点名字之后,就可在同一文件中用之后,就可在同一文件中用USEUSE语句通语句通过名字引用它。过名字引用它。USEUSE语句并不是复制该节点,而是把语句并不是复制该节点,而是把该节点再次插入它所在的场景图。节点名只在本文件该节点再次插入它所在的场景图。节点名只在本文件范围内有效。范围内有效。例3_1 使用相同的外部特征创建一个蓝色立方体和一个蓝色圆柱思考:在上述基础上设计图示的场景图。提示:利用transform语句,将圆锥的y坐标上移。例3-2 制作茶几本例采用一个圆柱体和两个立方体构成一个简易
3、茶几,其中两个立方体分别沿X轴的正反方向移动了一段距离,分别沿Z坐标轴旋转了一定的角度。如图:制作茶几环境光线漫反射镜面反射发光强度制作茶几接上页:接上页:茶几的另一条腿使用了use语句,引用了已定义的茶几腿的全部特性。茶几的桌面形状为椭圆形,所以使用了scale语句,在X方向的比例为1.5,其它方向的比例为1.透明度练习:制作书柜VRML的空间造型的空间造型3.23.2 文本造型文本造型TextText(文本)(文本)节点用来创建文本造型,通常使用Shape节点的geometry域的域值。VRMLVRML文本造型文本造型是一个没有厚度的平面造型,但也可以具有不同的外观和材质属性。Text节点
4、语法节点语法:Text exposedField MFString string exposedFied SFNode fontStyle NULL expvsedField SFFloat maxExtent exposedField MFFlaat length FantStyte节点语法:FantStyle field SFFloat size 1.0 field SFString family SERIF“#SANS,TYPEWRITER field SFString style PLANE#BLOD,ITALIC field SFBool horizantal TRUE field
5、SFBool leftToRight TRUE field SFBool topToBottom TRUE field SFString language“field MFString justify BEGIN#MIDDLE,END,FIRST field SFFLoat spacing 1.0例3_3 文本节点本例由一个文本节点和一个立方体节点构成,其中文本节点是主节点,立方体是子节点,而且造型有空间变换,因此使用了childrenchildren语句。运行结果如下图:思考:请修改原程序,使之运行的结果如下图所示:例例3-4 使用内联节点使用内联节点可以使用插入内联节点的方法,将指定的VR
6、ML程序插入到当前场景。内联节点 例例3-4a 3-4a 请修改上述程序,呈现以下场景图请修改上述程序,呈现以下场景图 作业:设计如图所示的桌子的空间造型再见第四章第四章 复杂造型复杂造型虚拟现实技术第4章 场景中的复杂造型场景中的复杂造型学习目标学习目标 1 1了解在场景中构建复杂造型的基本方法了解在场景中构建复杂造型的基本方法2 2掌握点、线以及面集合节点的使用及其基掌握点、线以及面集合节点的使用及其基本域值的基本含义本域值的基本含义3 3会使用地表节点创建相应的造型会使用地表节点创建相应的造型4 4掌握挤出节点创建复杂造型的建模方法掌握挤出节点创建复杂造型的建模方法几何节点类型4.1 构
7、造离散点的集合造型 点集合节点PointSet 在VRML虚拟环境中创建离散的点,用PointSet。PointSet是geometry域的一个域值,其作用是在空间构造、定义一系列与色彩相关联的点的集合。使用语法使用语法 PointSet coord NULL#SFNode color NULL#SFNode 4.2域值说明域值说明 coord 包含一个 Coordinate 节点,用来给出一些列空间坐标点。color 包含一个Color节点,Color节点包含一个color域,使空间的点与颜色联系起来。例例1 点的集合点的集合#VRML V2.0 utf8#VRML V2.0 utf8Sha
8、pe Shape appearance Appearance appearance Appearance geometry PointSet geometry PointSet coord Coordinate coord Coordinate point 0 2 0,-1 1 0,0 1 0,1 point 0 2 0,-1 1 0,0 1 0,1 1 0,1 0,-2 0 0,-1 0 0,0 0 0,1 -2 0 0,-1 0 0,0 0 0,1 0 0,0 0,2 0 0,-1-1 0,0 2 0 0,-1-1 0,0-1 0,1-1 0,-1 0,1-1 0,0-2 0 0-2 0
9、color Color color Color color 1 1 1,1 1 1,1 1 1,color 1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1,1 1 1 1 1 1 运行效果图运行效果图4.3 构造空间折线造型空间的任意两个点可以构成一根直线,多根线在空间中相互连接可以构成各种封闭线或者折线。在VRML中,也是采用这样的思想构造空间的直线段、折线或者封闭线。节点用来构建各种线造型
10、。节点是域的值,共有5个域域,以及两个描述事件的接口。4.3.1 构造空间折线造型构造空间折线造型2 域值说明 用来提供空间线段的顶点的点坐标。其域值是Coordinate节点,Coordinate 节点的域 给出这些点坐标的列表。这些点的列表按照先后顺序每一个分配一个,后面的域 coordIndex引用的时候直接针对索引值。对应Coordinate节点的 point域的坐标列表的一个索引列表,按给定的索引顺序连接坐标点形成线段或者折线。2域值说明 域值是 Color 节点,Color 节点的域值也是 color,它列出了用于作为每个线段的顶点的坐标点着色的一个颜色列表。这些颜色值也同 coo
11、rd情况一样按照先后顺序从 0 开始分配一个索引,以后按照索引引用相应的颜色。对应Color节点的 color 域值的索引列表。按照这里给出的顺序为线段的顶点着色或者线段着色。如果是给顶点着色,在两个顶点之间的线段的颜色是顶点颜色的过渡色。如果在color域有一个Color节点给出了颜色列表,则这个域的域值指明是把对应的颜色赋给每个还是每条。域值设置为TRUE则表示为线段的顶点着色;如果域值设置为FALSE则表示为线段着色。例2.构造图示的五面体显示效果图例例2.构造图示的五面体构造图示的五面体坐标值和索引坐标值和索引 按索引构建封闭线框按索引构建封闭线框 4.3 构造空间平面集合造型构造空间
12、平面集合造型 VRML中构造空间的用节点 IndexedFaceSet,面集合节点 IndexedFaceSet 同样是Shape 节点中geometry域的域值。一系列空间点按一定关系集合构建VRML的平面以及平面的集合。创建的平面的样子完全由各个顶点确定。4.3 构造空间平面集合造型构造空间平面集合造型4.3 构造空间平面集合造型构造空间平面集合造型 coordcoord 这个域的用法同线集合节点 IndexedLineSet 情况类似,只是这个域用来提供空间平面多边形的顶点的点坐标。其域值是Coordinate节点,Coordinate节点的域 point 给出这些点坐标的列表。这些点的
13、列表按照先后顺序从0开始每一个分配一个索引值,用域coordIndex直接针对索引值引用各个坐标点。coordIndexcoordIndex 对应 Coordinate 节点的 point 域的坐标列表的一个索引列表,按给定的索引顺序连接坐标点形成空间的多边形。由于其是多域值的,也就相当于提供了一个索引列表,要创建的每个多边形通过一组指向Coordinate节点中的顶点索引来指明。4.3 构造空间平面集合造型构造空间平面集合造型 texCoord 这个域包含一个 TextureCoordinate 节点,指明将一幅纹理图片纹理图片映射到面集表面上。texCoordIndex 对应Texture
14、Coordinate节点的索引列表。color 域值是 Color 节点,Color 节点的域值也是 color,它列出了用于为每个面的顶点的坐标点着色的一个颜色列表。这些颜色值也同 coord 情况一样按照先后顺序从 0 开始分配一个索引,以后按照索引引用相应的颜色。它列出了用于为每个顶点或每个面着色的颜色列表。colorIndex对应Color节点的 color 域值的索引列表。按照这里给出的顺序为面的顶点着色或者面本身着色。4.3 构造空间平面集合造型构造空间平面集合造型 如果在color域有一个Color节点给出了颜色列表,则这个域的域值指明是把对应的颜色赋给每个顶点,还是赋给每个表面
15、。域值设置为TRUE则表示为平面的顶点着色;如果域值设置为FALSE则表示为平面着色。这个域含一个Normal 节点,给出了给表面指定法线向量的值。法向量并不是必须指定的,不指定情况下,浏览器会计算缺省的法向向量。这里指定的是一系列的多组值,每一组值对应了一个从0开始的索引,针对每一个构造面。对应于Normal节点的索引的列表,由索引的排列顺序决定了表面法线向量的方向排列。4.3 构造空间平面集合造型构造空间平面集合造型 指明是否已为每个顶点还是给每个表面确定了法向量。如果 normal域为空,该域被忽略。如果 normalPerVertex域为TRUE,则给每个顶点确定法向量。反之,如果 n
16、ormalPerVertex域为FALSE,则表示给每个表面确定法向量。(11)ccwccw 按照右手螺旋法则指明每个表面上的顶点的排列走向。当确定了拇指方向为正方向时,构成表面的各顶点遵从四指绕行的方向即逆时针方向排列,则此域值为 TRUE,如果与四指绕行方向相反即顺时针方向排列,则域值为FALSE。比如,在XOY平面的一个平面,当 ccw 为TRUE时,平面正面面向屏幕;当为FALSE时,所画平面背面面向屏幕。这个域和solid域共同决定了构建的表面是否两面都能看到。4.3 构造空间平面集合造型构造空间平面集合造型(12)solid 指定用户是否能看见表面的背面。默认情况下,该域值为 TR
17、UE,表明构建表面的正面,即在ccw 中逆时针绕行构建的表面的正方向确定的表面,如果设定为FALSE,则也能够看到背面。在构建表面时,应当根据需要设定这个域的域值,如果并非要使一个平面的两个面都可见,比如,构建一个封闭的多面体,则内部的面没有必要可见,则应该取默认值,以减少浏览器计算的负担。(13)Convex Convex 设定所构建的表面是凸的还是凹的。如果取 TRUE,则表面是凸的,否则,表面为凹的。多数浏览器可以优化运算过程,不必设置这个域。4.3 构造空间平面集合造型构造空间平面集合造型(14)creaseAngle 确定一个转折角,当相邻两个表面的夹角小于这个角度的时候,则相邻两表
18、面间的边界平滑过渡,即棱角看起来不那么尖锐。例例3 构造平面集合造型构造平面集合造型思考:将colorPerVertex属性改为 FALSE分析下列程序,找出对应各个顶点的着色分析下列程序,找出对应各个顶点的着色的规律,再分析底面的着色分布。的规律,再分析底面的着色分布。每个面的法向量是指向外面;Color 域为每个索引顶点着色分别是:白、黄、红、蓝、绿底面各顶点着色的顺序由colorIndex确定,分别为:白、黄、红、绿,对应的索引值为:0 1 2 44.4 创建复杂表面的方法创建复杂表面的方法对于一些的造型,比如山峦起伏的景象如果用前面的节点组合构造,能够想象到要用许多个节点,并且还要考虑
19、到坐标系的变换等一系列的问题。在VRML中,解决类似于这样的问题有对应的节点,称为地表节点节点 。地表节点的基本使用在很大程度上使得那些表面凹凸不平的造型的创建得以简化。4.4 创建复杂表面的方法地表节点也称为,是 geometry域的节点域值,它可以用来描述地表特征,比如高山、丘陵、平地等地表面的不规则变化。构建的是将某个要描述的地表区域分割成许多,定义网格的数目、长度和宽度,最后定义高度,就可以描述要表达的地表的表面形状。4.4 创建复杂表面的方法创建复杂表面的方法4.4 创建复杂表面的方法创建复杂表面的方法 X方向上的顶点数,不能为负值。这个值相当于在X方向上所取的坐标点数目。X方向的顶
20、点之间的距离,不能为负值。这个值相当于在X方向上相邻的两个坐标点之间的间距。Z方向上的顶点数,不能为负值。这个值相当于在Z方向上所取的坐标点数目。Z方向的顶点之间的距离,不能为负值。这个值相当于在Z方向上相邻的两个坐标点之间的间距。上面四个域值共同决定了在浏览器中 XOZ 平面上的网格。显然,网格的数目等于(xDimension-1)和 (zDimension-1)的乘积。在建模的时候应该注意这一点。4.4 创建复杂表面的方法 定义对应于前面的顶点一系列的高度值(即Y坐标值)。需要注意的是,这是一个Y值的列表,按行排列,依次每个值对应xDimension的每个顶点值。在书写的时候是依次逗号或者
21、空格隔开的一串数值。比如,X、Z方向各取3个点,意即xDimension 和zDimension均等于3,形成有四个格子的网格。height 应该对应为 9 个数值:h1、h2、h3、h4、h5、h6、h7、h8、h9。则 h1、h2、h3对应第一行的x1、x2、x3。依次类推。4.4 创建复杂表面的方法 域值是一个 Color 节点,如果想为每个四边形或每个顶点添加颜色,可以使用这个节点设置一个颜色列表。需要注意的是,如果 colorPerVertex 域是 TRUE,表明给网格即每个四边形着色,那就必须提供至少(xDimension-1)*(zDimension-1)种颜色。如果 colo
22、rPerVertex 域值是FALSE,是给每个顶点着色,而网格上的颜色是顶点之间颜色的过渡,那就需要列表提供xDimension*zDimension种颜色。4.4 创建复杂表面的方法 确定是否为每个顶点还是为每个四边形添加颜色。TRUE 表示是为每个顶点着色,而FALSE则为每个四边形添加颜色。这个域值和 color域是相关的。如果color 域没有设置颜色,域是空的,则 colorPerVertex无论选取什么值均可以忽略。如果 color域指定了一个Color节点,设置了颜色列表,这个域值才起作用。表面法线向量是用来确定表面的朝向的,如果希望为网格定义法向量,可包含一个向量节点Norm
23、al,该节点包含一个vector域,用来给定向量值。如果没有定义法向量,浏览器会自动生成。4.4 创建复杂表面的方法 包含一个TextureCoordinate节点,用来将一个贴到网格上。注意同 IndexFaceSet 节点情况类似,在 TextureCoordinate节点的域 point 中,是一个二维坐标值(s,t),意味着是纹理坐标。例4 构造复杂造型4.5 构造空间挤出造型在VRML中,可以用Extrusion来解决问题。挤出节点也称为“”,相当于以一个2D图形为边界、且沿一个预先设计好的路径向一个方向挤压而形成的造型。4.5 构造空间挤出造型构造空间挤出造型4.5 构造空间挤出造
24、型构造空间挤出造型 该域实际上定义了一条沿挤压方向上的主干线,通称为龙骨折线。它是由一系列三维点构成的,依次连接相邻点就得到一条折线,挤压就沿着这条线进行。根据二维形状 crossSection确定的挤压轮廓得到所需要的造型。该域的坐标值在节点的局部坐标系上定义。由一系列二维坐标点依次连接相邻的坐标点来定义一个二维折线,作为挤压过程中的。该折线在节点的局部坐标系 XOZ 平面中定义,二维的坐标的第一个数是X坐标,另一个是Z坐标。因而这个二维折线是一个2D图形。二维坐标取X、Z两个坐标值,只是借助于该坐标描述挤压的二维轮廓。这个域和 spine 域共同决定了最终挤压成型的造型的轮廓和走向。4.5
25、 构造空间挤出造型4.5 构造空间挤出造型构造空间挤出造型 物体造型的轮廓在挤压的过程中是变化的,比如花瓶,有些地方凸出,有些地方凹下。这个域定义二维折线的尺度沿 spine挤压过程中缩放变换参数。在节点局部坐标系的XZ平面内,尺度变换以平面的坐标原点为参照点,值的第一个数对应X轴的变换,第二个数对应Z轴。在这里,X 和 Z依然应该同上面 crossSection 一样理解。尺度变换参数值必须大于零。一般该域值的个数与 spine 域一样,顺序对应着每个龙骨构造点处的二维折线的尺度变换。如果该域只指定了一个值,每一处的二维折线都使用这个值进行变换。这个域值改变 2D 图形的尺寸,使得在挤出过程
26、中根据需要变化,得到所需要的造型。4.5 构造空间挤出造型构造空间挤出造型 该域定义三维旋转变换参数。一般该域值的个数与 spine 域一样,顺序对应着每个龙骨构造点处的二维折线的旋转变换。如果该域只指定了一个值,每一处的二维折线都使用这个值进行变换。注意这个旋转变换并不在节点的局部坐标系上定义,而是对应着 crossSection 的方位变换。4.5 构造空间挤出造型 该域确定挤压成型的造型是否有起始端面(对应spine 的第一个值)。如果 beginCap设置为FALSE,则不产生起始端面,否则,起始端面是将 crossSection 域中的二维折线首尾相连构成的多边形表面。该域确定挤压成
27、型的造型是否有终止端面(对应 spine的最后一个值)。如果endCap设置为FALSE,则不产生终止端面,否则,终止端面是将 crossSection 域中的二维折线首尾相连构成的多边形表面。4.5 构造空间挤出造型构造空间挤出造型 Extrusion节点自动生成几何面的法线,该域决定法线方向与二维折线走向的关系。当ccw=TRUE 时,二维折线走向(由折点定义的顺序指定)、龙骨走向(由龙骨构造点定义的顺序指定)与法线方向应成右手螺旋关系;反之,当 ccwFALSE 时,二维折线走向、龙骨走向与 法线方向应成左手螺旋关系。如果域 solid 设置为 TRUE,只有逆着法线方向观察,才可以看到
28、几何面。对于一个几何体的面,法线方向的表面被认为是“外”表面,与此相反的是“内”表面,当 solid 域为 TRUE 时,只显示“外”表面,“内”表面并不显示着色。当几何体是闭合的时候,该域用于浏览器实现优化,因为内表面不用生成,节省了浏览器的计算时间。如果 solid设置为FALSE,则意味着“内”、“外”表面都要显示,浏览器必须计算两个表面,这时如果使用材质、贴图等等,面上的某点在两个表面使用材质图像上的同一像素点,即内外是相同的。4.5 构造空间挤出造型构造空间挤出造型 该域确定挤压成型的几何体的起始端面和结束端面是凸起还是凹下。如果该值为 TRUE,则端面是凸起的,否则,则表示端面为凹
29、下的。这个域值只有设置了端面才有意义,也就是说,beginCap 和 endCap的值设置为TRUE。该域确定一个角度。决定浏览器对几何体相邻表面之间棱的处理。如果相邻表面法线之间的夹角的绝对值小于这一角度,浏览器对相邻表面做平滑处理,棱是圆滑的,不能被明显地察觉到。相反的情况,如果相邻表面法线之间的夹角的绝对值大于这一角度,则浏览器就不作平滑处理。例例5 挤出造型设计挤出造型设计例例6 设计代码,完成下面挤出造型设计设计代码,完成下面挤出造型设计例例6 设计代码,完成下面挤出造型设计设计代码,完成下面挤出造型设计如图所示,例 6 创建了一个以X轴为中心的环状造型,造型的截面为一个正方形,在程
30、序中可以看到,边长为 0.5。而spine 为一个绕着X轴的正方形,边长为 4.0。可以看到,实际上挤出的过程中挤出的2D图形并非只是位于XOZ平面内,而是作为一个挤压轮廓。同样的放样图形,不同的龙骨(spine),则结果也不相同。例例7 编写代码,完成下列挤出造型设计编写代码,完成下列挤出造型设计酒瓶设计代码练习题1、用离散点集合构造北斗七星图练习题2.用线集合构建如图所示的造型。(注:不一定要与图例完全相同,允许按自己的想法设计。)练习题3.用面集合节点IndexedFaceSet 和线集合节点IndexedLineSet 分别创建两个模拟建筑物。练习题4、用面集合和挤出造型设计椅子造型。练习题5.利用挤出节点创建一个横截面为扁圆的瓶子,如图所示,可以先不加颜色。