📄 第十九章 高级外观控制.txt
字号:
和IndexedFaceSet节点相似的是ElevationGrid节点,但是在后者中并没有texCoordIndex域出现。
ElevationGrid节点语法
ElevationGrid {
xDimension 0 #域值类型 SFInt32
xSpacing 0.0 #域值类型 SFFloat
xDimension 0 #域值类型 SFInt32
xSpacing 0.0 #域值类型 SFFloat
height [] #域值类型 MFFloat
color NULL #域值类型 SFNode
colorPerVtex TRUE #域值类型 SFBool
normal NULL #域值类型 SFNode
normalPerVertex TRUE #域值类型 SFBool
texCoord NULL #域值类型 SFNode
ccw TRUE #域值类型 SFBool
solid TRUE #域值类型 SFBool
creaseAngle 0.0 #域值类型 SFFloat
set_height #域值类型 MFFloat
}
texCoord域值通过TextureCoordinate节点给出了一系列的空间点参数。(可以使用事件接口)
texCoord域值所给定的贴图坐标系中的第1个空间点参数和海拔栅格中的第1个栅格点相对应;第2个空间点参数和海拔栅格中的第2个栅格点相对应,其余依此类推。换而言之,就是在海拔栅格中的每一个栅格点都有一个贴图坐标参数与之相对应。这是和前面的IndexedFaceSet节点中需要重新单独给出空间点索引不相同。(可以使用事件接口)
[海拔栅格表面贴图效果.wrl] 一个将表面纹理贴图指定到一个2×2的海拔栅格表面上的效果。
[空间面切割贴图效果.wrl]
2、造型表面明暗控制
在VRML中是根据空间造型表面相对于空间光源的空间相对位置和造型表面的法线方向上的矢量来给出在VRML浏览器中显示的造型表面的明暗程度,通常这些都是由浏览器自动计算所得。而本章节介绍如何通过Normal节点对空间造型表面进行明暗控制,并且可以通过其对空间表面进行有效控制,创建出表面平滑过渡的空间造型。Normal节点生成一个法向量矢量列表并可作为基于坐标几何节点,通常作为IndexedFaceSet和ElevationGrid节点中的normal出现。
Normal节点语法
Normal {
vector [] #域值类型 MFVec3f
}
vector可见域的值指定一个可用作造型法向量的单位法向量矢量列表。每个法向量被说明为3个浮点值,分别为向量的X、Y、Z分量。
法向量索引当被几何节点使用时,Normal节点列表中的第1个法向量索引为0,第2个索引为1,依此类推。(可以使用事件接口)
Normal节点主要是作为IndexedFaceSet节点和ElevationGrid节点中的normal域值。
IndexedFaceSet节点语法
IndexedFaceSet {
coord NULL #域值类型 SFNode
coordIndex [] #域值类型 MFInt32
texCoord NULL #域值类型 SFNode
texCoordIndex [] #域值类型 MFInt32
color NULL #域值类型 SFNode
colorIndex [] #域值类型 MFInt32
colorPerVertex TRUE #域值类型 SFBool
normal NULL #域值类型 SFNode
normalIndex [] #域值类型 MFInt32
normalPerVertex TRUE #域值类型 SFBool
ccw TRUE #域值类型 SFBool
convex TRUE #域值类型 SFBool
solid TRUE #域值类型 SFBool
creaseAngle 0.0 #域值类型 SFFloat
set_coordIndex #输入接口 MFInt32
set_texCoordIndex #输入接口 MFInt32
set_colorIndex #输入接口 MFInt32
set_normalIndex #输入接口 MFInt32
}
normal域值通常是一个Normal节点,用来指定一系列空间面上的单位法向量,缺省值会将normalIndex和normalPerVertex域值都将被忽略。(可以使用事件接口)
normalIndex域值给出的是前面的normal域值中给出的法向量的索引列表,将法向量一一指定到相应的空间面或者空间坐标上去。
normalPerVertex域为TRUE时normal域值中给出的法向量将被指定到空间坐标上去,而当域值为FALSE时这些法向量将不指定到空间平面上去。
[空间面上的明暗控制.wrl] 对一个空间面的法向量控制,在表面形成了不同的明暗效果。例子将索引列表中的0(左下点)和3(左上点)的法向量设置为0.0 0.0 1.0,即正对着浏览者的方向,因此看上去很明亮;而索引列表中的1(右下点)和2(右上点)法向量分别设置为1.0 0.0 0.0和1.0 1.0 0.0,很容易看出两者的明亮程度将低于造型左边。其实人们分辨一个物体的形状通常都是通过这个物体表面的明暗程度来进行的,通过对一个平面法向量的细致调整可以使之“看起来”像其他的空间造型。
[平面上的明暗控制.wrl] 这个“圆柱体”,其实就是对4个空间平面进行法向量的控制而得到的。
[海拔栅格的明暗控制.wrl] 明暗效果同样可以使用到由ElevationGrid节点所创建的海拔栅格的明暗控制上去。
3、细节层次控制
LOD方法可以有效地虚拟系统的运行速度和交互性能。
它的原理就是在不同的空间距离上给出不同细节的空间造型。在VRML文件中可以创建各个不同细节的造型版本,然后根据在虚拟世界中浏览者距离这个空间造型的远近来决定在浏览器窗口中调用不同细节的空间造型。
在VRML中是通过LOD节点将各个细节控制版本组织在一起的。
LOD节点语法
LOD {
center 0.0 0.0 0.0 #域值类型 SFVec3f
level [] #域值类型 MFNode
range [] #域值类型 MFFloat
}
level域值指定了一个包含在组内的子节点的列表。一般的level域值包括了Shape节点和其他编组节点。作为一个整体的组,被假设描绘了一个单一的造型,在level域值中所列出的每一个子节点分别描述了不同的造型版本。第1个子节点提供了造型的最高细节版本,其后的子节点则提供低一级的细节版本。根据从观察者至LOD节点组中心的距离,由当前的坐标系测定,从level域值表中选出单独的子节点将其画出。当观者移近或远离时,不同的子节点被选中。(可以使用事件列表)
center域中的值,指定了LOD节点内建立的造型的中心坐标系中的三维坐标。观者和坐标中心之间的距离,被用于选择level域值表所提供的造型版本。
range域的值说明了一个观察者到造型的距离列表,这些距离用于浏览器从一种细节层次切向另一种细节层次。如果在level域值表中有n中不同的造型细节版本,则在range域中将有(n-1)个范围列表。
在range域中的范值必须是正的,并且必须按增长的顺序列出。当观察者与造型的距离比第1个范围值更小时,则画出level表中的第1个子节点。当观察者在第1和第2个范围值之间时,画出level域表中的第2个子节点等等。如果level域值表中的子节点数少于范围数值数目时,则表中的最后一个子节点用于超出的范围值中。如果level域值表中的子节点数多于范围值数,则超出的子节点将被忽略。
应该选择范围值,以便毫无察觉地从一种细节版本切换到下一种版本。当指定时,范围值总是被作为VRML浏览器的线索处理。浏览器可自由地忽略范围值而用它自己的算法来选择细节版本。为了得到最好的结果,仅在需要时才指定范围值。其余的时间,可使用range域中空的范围值列表,以给浏览器在选择控制细节方面最大的自由度,从而优化绘图速度。
在LOD节点内建立的造型在不当前的坐标系创建。Transform节点平移、旋转和比例缩放的特性会影响造型以及center和range的域值。甚至在它们没有被指定画出时,LOD节点的任何一个子节点仍不断地接收和发送事件。
一个细节控制的例子。创建一个火炬的空间造型,在较远的距离上所看到的只是一个火炬的模糊轮廓;在较近一点的距离上将看到的火炬可以分辨出火炬各个部分;再近一些的距离上将看到多的造型细节;而最后将可以看到一个正在燃烧的火炬造型。首先将一一创建这些不同细节版本的火炬造型,最后再通过Inline节点引入到LOD节点的level域中去。
[最低细节版本的火炬造型.wrl] 最低细节版本的火炬造型,其主要通过空间面造型来创建。
[中等细节版本的火炬造型.wrl] 中等细节版本的火炬造型,其中可以看到大多数火炬的组成部分,并且在其中使用了圆锥体和圆柱体等基本几何造型。
[更多细节的火炬造型.wrl] 更多细节的火炬造型。
[最细致和真实的火炬造型.wrl] 这个是浏览者在浏览器中能看到的最细致和真实的火炬造型,这是一个使用MoiveTexture节点创建的燃烧着的火炬造型。
[浏览细节控制造型效果.wrl] 用LOD节点和InLine节点将它们组织在一起。在这个文件中可以看到VRML文件给出的控制距离列表为[7.5,12.0,20.0],这表明在这些距离上将发生不同细节版本的火炬的切换。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -