VRML---第二章(几何造型节点)

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”,字形还有:BOLDITALICBOLDITALIC
     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" ]
				}
			}
		}
	]
}







  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值