VRML中可见几何形体的基本构成模块是造型。造型由节点和他的域及域值描述组成。
几何造型分为5类:原始几何造型节点(Box、Cone、Cylinder、Sphere),点、线、面节点(PointSet、IndexedLineSet、IndexedFaceSet、Conrdinate),海拔节点(ElevationGrid),挤出节点(Extrusion),文本造型节点(Text)。
几何造型阶段常用域的域值格式有一下几种:
1、field:定义私有域。典型格式为:field 数值类型 域名 默认值。
2、exposedFiled:定义公共域。典型格式为:exposedField 数值类型 域名 默认值。
3、eventIn:定义入事件。典型格式为: eventIn 数值类型 事件名。
4、eventOut:定义出事件:典型格式为:eventOut 数值类型 事件名。
造型节点的语法定义
早定Shape 节点定义了一个VRML造型所具有的几何尺寸和外观,这些特征定义了VRML虚拟空间中创建和放置在虚拟空间中的造型,所有VRML造型均有Shape节点创建,
Shape节点在VRML中是重要的基本节点之一。
语法定义:
Shape{
#appearance 域的域值用于设定一个Appearance节点,该节点定义了物体造型的外观,包括其颜色和表面纹理。appearance域的域值默认为 NULL,表示其外观为白色无光。
exposedFiled SDNode appearance NULL
#gemetry 域的域值用于设定一个几何造型节点,包括简单和复杂的几何造型节点、文本造型节点等,默认值为NULL,表示没有任何几何造型存在。
exposedFiled SFNode gemetry NULL
}
简单几何造型节点
长方体节点
Box{
#size域的域值用于设定一个以原点为中心的三维长方体的尺寸大小。分别问 X Y Z轴的大小(长、宽、高)。
filed SFVec3f size 2.0 2.0 2.0
}
例子
#VRML 2.0 UTF8
Shape{
appearance Appearance { material Material{}}
geomtry Box { size 3 2 1}
}
球形节点
Spere{
#radius域的域值用于设定以原点为球心的球体半径,不能小于 0.0 ,默认值为1.0.
field SFFloat radius 1.0
}
例子
#VRML 2.0 UTF8
Shape{
appearance Appearance{ material Material{}}
geomtry Sphere{radius 1.0}
}
圆锥体节点
Cone{
#bottomRadius 域的域值用于设定以原点为中心、以Y轴为中心轴的圆锥体底部圆的半径。该值需大于0.0,默认值为 1.0
field SFFloat bottomRadius 1.0
# height 域的域值用于设定圆锥体的高。高位于Y轴上,且以原点为中心。不大于0.0 默认值为 2.0
field SFFloat height 20
#side 域的域值用于设定该圆锥体是否有锥面。默认值为 TRUE
field SFBool side TRUE
#bottom 域的域值用于设定是否创建该圆锥体的底部,默认值为 TRUE
field SFBool bottom TRUE
}
例子
#VRML 2.0 UTF8
Shape{
appearance Appearance{ material Material{}}
geomtry Cone{
bottomRadius 2.0
height 4.0
bottom FALSE
}
}
圆柱体节点
Cylinder{
# radius 域的域值用于设定半径
field SFFloat radius 1.0
#height 域的域值用于设定 高度
field SFFloat height 2.0
#bottom 域的域值用于设定是否创建圆柱体的底部。默认为 TRUE
field SFBool bottom TRUE
#side 域的域值 用于设定 是否创建圆柱体的曲面,默认值为 TRUE
field SFBool side TRUE
#top 域的域值 用于设定是否创建圆柱体的顶部 默认值为 TRUE
field SFBool top TRUE
}
例子
#VRML 2.0 UTF8
Shape{
appearance Appearance {material Material{}}
geometry Cylinder{
radius 1.0
height 2.0
}
}
复杂几何造型节点
点集节点
在VRML 中,一个点事置于VRML虚拟世界中的点。点的造型用三维坐标来定位,大小像素为1.
点集就是不同位置空间点的集合。
点集PointSet节点用来创建一系列位置不同的空间点的造型,空间点的造型不受光源的影响,不能在其上粘贴纹理、碰撞检测,通常作为造型节点的geometry域的域值来使用。
语法:
PointSet{
#color域的域值用来为每个空间点着色。域值通常为颜色Color节点。
exposedField SFNode color NULL
#coord域的域值为NULL 或 Coordinate节点,默认为 NULL,表示空的列表,不创建任何点,如果创建离散点造型,必须选择坐标Coordinate节点,用来定位每个点的坐标
exposedField SFNode coord NULL
}
Color{
exposedField MFcolor color[]
}
Coordinate{
#point 域的域值提供一张三维坐标列表,创建一个造型的几何坐标。
exposedField MFVec3f point[]
}
例子
#VRML 2.0 UTF8
Shape{
geometry PoinSet{ #点集节点
coord Coordinate{ #坐标节点列表
point[
0 3 0,3 0 0 ,-3 0 -3, 0 0 3
]
}
color Color{ #颜色节点列表
color[ 1 0 0 ,0 1 0 ,1 1 0 ,1 01 ,1 1 1 ]
}
}
}
线集节点
VRML 中的线是由两个端点连接而成的直线,线集就是不同线段的集合。
确定一条直线,必须指定这条线的起点和终点。
多个端点连接起来就是折线。
浏览器是按点的顺序来连接直线的,在列表前面的点先进行连接。
创建直线和折线需要做两个工作:1、确定连接点的坐标。2、确定连接点的顺序。
语法:
IndexedLineSet{
# coord 域的域值用于设定线段连接点的坐标位置,与PonintSet节点完全一样
exposedField SFNode coord NULL
#cooedIndex 域的域值用来设定一张用来描述一条或多条折线路径的索引列表。
field MFInt32 coordIndex[]
#color colorPerVertex 域的域值用于为所创建的线段着色
exposedField SFNode color
field MFInt32 colorIndex[]
field SFBool colorPerVertex[] TRUE
#set_coordIndex 入事件 和set_colorIndex入事件用于改变坐标索引表和颜色索引表
eventIn MFInt32 set_coordIndex
eventIn MFInt32 ser_colorIndex
}
例子
#VRML V2.0 utf8
Shape{
geometry IndexedLineSet{ #线集节点
coord Coordinate { #坐标节点
point[
0 3 0,3 0 0,0 -3 0,-3 0 0,0 0 3
] #端点坐标
}
coordIndex[
0,3,4,-1, 3,2,4,-1, 2,1,4,-1,1,0,4
] #线段连接顺序索引
}
}
面集节点
平面的创建是由封闭的折线勾画出平面的边界,然后填充而成。
IndexedFaceSet节点通常作为造型节点的geometry域的值。
语法:
IndexedFaceSet {
#coord域的域值设定平面边界线连接点的坐标位置
exposedField SFNode coord NULL
#设定连接线路的索引
field MFInt32 coordIndex []
#texCoord、texCoordIndex 域的域值用来为所创建的平面粘贴纹理。
exposedField SFNode texCoord NULL
field MFInt32 texCoordIndex[]
#color 、colorPerVertex域的域值用来给创建的线段着色
exposedField SFNode color NULL
field MFInt32 colorIndex[]
field SFBool colorPerVertex TRUE
#normal、 normalIndex、normalPerVertex域的域值用来设定平面的法向量,用来控制平面的光线明暗效果。
exposedField SFNode normal NULL
field MFInt32 normalIndex[]
field SFBool normalPerVertex TRUE
#ccw域的域值用来设定面集中的面是按顺时针方向索引,还是逆时针。默认为 TRUE (顺时针)
field SFBool ccw TRUE
#convex域的域值用于设定面集中的面是否都是凸面。默认为TRUE(浏览器不需要对这些面进行分割)
field SFBool convex TRUE
#solid域的域值用于表示面集中的面是否组成一个实体。
field SFBool solid TRUE
#creaseAngle域的域值用于设定一个用弧度表示的折痕的阈值。
#两个相邻面间的夹角如果小于所设定的阈值,那么这两个面的边界就会模糊(平滑绘制)
field SFFloat creaseAngle 0.0
#set_coordIndex、set_texCoordIndex、set_colorIndex、set_normalIndex 是面集节点的4个入事件,分别用于动态设置坐标索引、纹理坐标#索引、颜色索引、法向量索引的域值
eventIn MFInt32 set_coordIndex
eventIn MFInt32 set_texCoordIndex
event MFInt32 set_colorIndex
event MFInt32 set_normalIndex
}
例子
#VRML 2.0 UTF8
Shape{
geometry IndexedFaceSet{
coord Coordinate{
point[ 0 3 0 , 3 0 0 ,0 -3 0 ,-3 0 0 , 0 0 3]
}
coordIndex[0,3,4,-1, 3,2,4,-1, 2,1,4,-1 ,1,0,4,-1, 0,1,2,3]
}
}
海拔珊格节点
VRML中海拔栅格节点专为构造地形、山脉等凹凸不平的平面造型。
它的构建方法是将造型区域划分成很多大小相同的网格,根据实际需要设定网格的个数和尺寸,设定每个网格交点的高度,网格之间自动形成高度不同的平滑过渡的表面。
语法:
ElevationGrid{
#xDimension和zDimension的域值设定X和Z方向网格点的数量,不是网格的数量。
#xSpacing和zSpacing的域值设定X方向的列间距、 Z方向的行间距。不能为负数。
field SFInt32 xDimension 0
field SFFloat xSpacing 0.0
field SFInt32 zDimension 0
field SFFloat zSpacing 0.0
#height的域值设定每个网格点的Y方向的高度。每个高度值与网格点相对应
field MFFloat height [ ]
exposedField SFNode color NULL
Field SFBool colorPerVertex TRUE
exposedField SFNode normal NULL
field SFBool normalPerVertex TRUE
exposedField SFNode texCoord NULL
field SFBool ccw TRUE
field SFBool solid TRUE
field SFFloat creaseAngle 0.0
#set_height入事件用来接收发送过来的高度值,并改变高度列表。
eventIn SFInt32 set_height
}
例子
挤出造型节点
VRML中挤出造型,首先在XOZ平面设定挤出造型的二维截面轮廓线,然后用spine域在三维空间设定挤出造型的牵引轨迹。
挤出造型的截面轮廓线可以是任意形状。设定挤出造型的牵引轨迹可以直线、曲线、折线、开放或封闭的线段。
Extrusion节点通过挤出过程创建物体表面的几何形状,通常作为造型节点的geometry域的域值。
语法:
Extrusion{
#crossSection域的域值设定一系列的二位坐标,定义沿着挤出过程的脊线进行挤出的一个封闭或开放的轮廓
field MFVec2f crossSection [1 1,1 -1,-1 -1 , -1 -1,1 1]
#用于设定一系列的三维坐标,定义了一个封闭或开放的轨迹,造型沿着这条轨迹呗拉动,从而创建了挤出过程。
field MFVec2f spine[0 0 0 , 0 1 0 ]
#设定一系列挤出孔的比例系数对。
field MFVec2f scale 1.0 1.0
#设定沿脊线坐标的挤出孔的旋转情况
field MFRotation orientation 0 0 1 0
#设定在挤出完成后,是否加顶盖和底盖
field SFBool beginCap TRUE
field SFBool endCap TRUE
#设定挤出孔是按顺时针方向坐标来定义还是逆时针。
field SFBool ccw TRUE
field SFBool solid TRUE
field SFBool convex TRUE
field SFFloat creaseAngle 0.0
#入事件用来接收脊线、挤出孔、比例系数和旋转值,并该表域值
eventIn MFVec3f set_spine
eventIn MFVec2f set_crossSection
eventIn MFVec2f set_scale
eventIn MFRotation set-orientation
}
例子:
#VRML 2.0 UTF8
Shape{
appearance Appearance{ material Material{}}
geometry Extrusion{
crossSection[0.6 0.6 , 0 -0.6, -0.6 0.6 , 0.6 0.6]
spine[2 0 0, 0 0 -2 , -2 0 0 ,0 0 2, 2 0 0]
solid FALSE
}
}
文本造型节点及文本外观节点
文本造型节点
VRML中的文本也是一种造型,但不是几何体,是没有厚度的平面造型,不具备三维立体特征。可以设定外观和材质、进行纹理包装。
VRML不支持中文文本字体,要显示中文,可以使用帖图。
文本造型创建在X-Y平面上,Z向厚度为0.0
语法:
Text {
#string的域值设定要创建的文本内容,可一或多行,用逗号或空格分开,用双引号括起来
exposedField MFString string [ ]
#length的域值设定要创建的文本造型的长度。
exposedField MFFloat length [ ]
#maxExtent的域值设定任意行或列的文本造型的最大有效长度。
exposedField SFFloat maxExtent 0.0
#fontStyle的域值设定外观特征,即文本的设置
exposedField SFNode fontStyle NULL
}
例子:
#VRML V2.0 utf8
Shape {
appearance Appearance{
material Material{}
}
geometry Text { #文本造型节点
string ["Welcome" "Color" "Red Clock"] #文本内容
length [6 6 4 ]
}
}
Shape {
appearance Appearance {
material Material{}
}
geometry Box {
size 15 0.02 0.02
} #X轴位置线
}
Shape {
appearance Appearance {
material Material{}
}
geometry Box {
size 0.02 15 0.02
} #Y轴位置线
}
文本外观节点
文本外观FontStyle节点用来控制文本造型的外观特征,通过设定FontStyle节点可以改变由Text节点创建的文本造型的外观。
如文本的语种、字符的大小和形状、字体的风格以及文本的对齐方式、排列方式、行间距或列间距等。
语法:
FontStyle{
#family的域值设定Text节点创建的文本造型使用的字符集,主要有三种:SERIF、SANS、TYPEWRITER。
field SFString family “SERIF”
#size的域值设定创建的文本字符尺寸,水平排列的文本为高度,垂直排列的文本为宽度。
field SFFloat size 1.0
#spacing的域值设定创建的文本字符的行间距,文本水平排列为行间距,文本垂直排列的列间距。
field SFFloat spacing 1.0
#
style的域值设定创建的文本字符的字体风格,常用的字形:“PLAIN”,字形还有:BOLD、ITALIC、BOLDITALIC
field SFString style "PLAIN"
#justify的域值设定创建的文本字符块相对于X轴和Y轴的对齐方式。含有一个或两个域值列表,第一个为主对齐,第二个为次对齐。
field SFString justify ["BENGIN"]
#horizontal的域值设定创建的文本字符排列方式。TRUE水平/FALSE垂直。
field SFBool horizontal TRUE
#leftToRight的域值设定创建的文本块或字符是从左到右排列还是从右到左排列。TRUE沿X轴方向从左到右排列。
field SFBool leftToRight TRUE
#topToBottom的域值设定创建的文本块或字符是从上到下排列还是从下到上排列。TRUE沿Y轴方向从上到下排列。
field SFBool topToBottom TRUE
#language的域值设定创建的文本字符使用的语言,用代码表示,如“zh_CN”,一般情况下最好使用英语。
field SFString language ""
}
例子:
#VRML V2.0 utf8
Shape {
appearance Appearance {
material Material {}
}
geometry Text {
string ["serif"]
fontStyle FontStyle{
family "SERIF"
}
}
}
Transform {
translation 0 -1 0
children [
Shape {
appearance Appearance {
material Material {}
}
geometry Text {
string ["sans"]
fontStyle FontStyle{family "SANS"}
}
}
]
}
Transform {
translation 0 -2 0
children [
Shape {
appearance Appearance {
material Material {}
}
geometry Text {
string ["typewriter"]
fontStyle FontStyle{
family "TYPEWRITER"
size 2
style "BOLDITALIC"
justify["MIDDLE" "MIDDLE" ]
}
}
}
]
}