我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>培训教程

VRML2.0教程6:简单几何节点

文章来源:第三维度 作者: 发布时间:2012年04月17日 点击数: 字号:

    来源:第三维度
    作者:施寅,周葆芳,赵志勇

    选自《VRML2.0使用速成》第5章 第3节

    Shape(外形)节点像上一章描述的那样, 是构成一个场景的基石。回忆一下, 每个Shape 节点由两部分组成: 外形的几何属性(由geometry 域定义)和外观属性( 由appear-ance 域定义) 。本节在上一章介绍紫色圆柱场景的基础上来进一步讨论几何节点的使用。

    现在, 我们暂时不考虑外观属性, 而把目光集中到几何属性上, 以使你所建的造型更真实生动。

    一些物体的几何属性是以一系列顶点坐标加上描述这些顶点如何连接成这个物体外型的多面体的信息的形式给出来的, 这类几何造型称为基于顶点的几何造型。其他的物体是比较规则的一类, 它们的几何属性用VRML 预定义好的几种基本造型来给出。VRML 浏览器不必知道构成这些物体的每个多边形坐标就能把它画出来。

    简单几何节点

    VRML 中定义好了四种简单的常用几何节点, 所有的VRML 浏览器都支持对它们的显示, 它们是: Box (长方体)、Cylinder (圆柱) 、Sphere (球) 和Cone (圆锥) 。

    (1) 长方体节点

    长方体节点(Box)是最简单的几何节点之一。缺省的Box 节点描述的是一个边长为两米的立方体, 中心在坐标原点。Box 节点的size 域包含三个数, 分别指定长方体在三个坐标轴方向上的边长。图1 所示是一个取缺省值的Box 节点, 附带的坐标系让你能清楚看到长方体的中心在坐标原点。

VRML2.0教程6:简单几何节点Box 在坐标系中
图1 Box 在坐标系中

    长方体是一种很普通的场景构成元素。例如, 建立一个阿兹特克神庙总是从最简单的部分开始———建立支撑所有石柱的长方体基石。为建好第一块基石, 打开你的VRML 文件, 编辑成如下列例中带有黑体字表示新加的行所示的那样。

    [例1 ] 使用Box 节点。

    # VRML V2 .0 utf8 WorldInfo {
    title ″Temple″
    info ″VRML model of an Aztec temple .″
    }
    Group {
    children [
    Transform {
    translation -5 1 .25 -1 .875
    children [
    DEF COLUMN- BASE Shape {
    appearance Appearance { material Material { } }
    geometry Box { size 3 .75 2 .5 3 .75 }
    }
    ] } ] }

    新加的Transform 节点是Group 节点的一个子节点, Transform 节点的translation 域把物体移到适当的位置显示。这些都是前面已学过的, 没什么新东西。Transform 节点的子节点是一个Shape 节点。语句“DEF COLUMN - BASE”给这个外形节点取了个名字, 正像前面讲节点重用时说到的, 后面的节点可以通过这个名字来引用它。这个Shape 节点定义了一个最简单的外观属性———一个空的Mater rial 节点, 它使得这个长方体是可见的。Shape 节点的geometry 域用一个Box 节点定义, Box 节点的size 域指定了长方体在x、y、z 方向上的尺寸。显示的结果是一个稍扁平的正方体, 在水平面上是方形的, 这从文件中size 域的第一个值( 表示x 轴方向)和第三个值( 表示z 轴方向)相等, 而第二个值(表示y 轴方向)比它们略小一些, 这些都可以看出来。长方体的中心位置由Transform 节的translation 域指定, 颜色用的Shape 节点的缺省颜色———一种不很显眼的暗灰色。保存这个新文件并用你的VRML 浏览器看一看你所设计的基石。

    现在, 你可以紧接着在这个Transform 节点后再加一个Transform 节点。

    [例2] 把长方体放在两个不同位置。

    # VRML V2 .0 utf8 WorldInfo {
    title ″Temple″
    info ″VRML model of an Aztec temple .″
    }
    Group {
    children [
    Transform {
    translation -5 1 .25 -1 .875
    children [
        DEF COLUMN- BASE Shape {
        appearance Appearance { material Material { } }
        geometry Box { size 3 .75 2 .5 3 .75 }
        }
        ]
        }
    Transform {
    translation 5 1 .25 - 1 .875
    children [
        USE COLUMN- BASE
        ]
    }    ]    }

    上面你所做的是把基石放在两个不同的地方, 所用的方法是把代表基石的Box 节点放在两个不同的Transform 节点中, 场景框图如图2 所示。

VRML2.0教程6:简单几何节点基石的场景框图
图2 基石的场景框图

    由于我们在定义Box 节点时就很明智地给它取了个名字, 因此后面就可以很简单地用USE 语句在任何地方都可以引用它。当然, USE 语句必须在DEF 语句之后使用, 你不能在定义一个对象之前就想引用它, 这种规定显然是合理的。

    图3 显示的是现在看到的场景中的基石。Box 节点和别的所有VRML 的几何节点一样, 能被赋予各种各样的外观特征———蓝颜色或紫红色, 闪闪发光或毫无光泽。等下面学完Appearance 节点后你将会对现在基石的外观有更清楚的认识。在设计自己的场景时, 你可能会一边建造物体, 一边选择合适的颜色赋予它们, 但在本例中, 你将先建好整个神庙, 再回过头来给每个组成部分涂上颜色。

VRML2.0教程6:简单几何节点灰色基石
    图3 灰色基石

    (2) 对比例变换和物体的尺寸

    再认识前面介绍了如何去建立支撑石柱的基石, 实际上还有另一种方法也能达到同一目的。前面是建立一个定义了三维尺寸的长方体, 也可以先建一个取缺省值的Box 节点(一个立方体) , 再应用比例变换把它变成想要的长方体。

    Transform { scale 1 .80 1 .25 1 .89
    children [
        Shape {
            appearance Appearance { material Material { } }
            geometry Box { }
            }
        ]
    }

    这种方法有一点让人感到拐弯抹角, 因为VRML 中的几种简单的几何节点( 如Box节点)在三个坐标轴方向上的缺省尺寸总是从- 1 到+ 1 , 所以Box 节点size 域的缺省值三个方向都是边长为2 米, 而Transform 节点的scale 域缺省值取1。因此, 如果你最终想要的是一个边长为3 米的立方体, 则你要么用前一种方法定义一个size 域为“3 3 3”的Box 节点, 要么用后一种方法设定Transform 节点的scale 域为“1 .5 1 .5 1 .5”。换句话说就是, 如果你用后面一种方法, 那么对于简单几何节点, 在任一给定坐标轴方向进行比例变换的scale 域的取值是你想要尺寸的一半。细心的读者可能已经从前面两种方法对应的例子中发现了这一规律。

    对于那些中心不在坐标原点的几何模型来说, 进行比例变换就更难掌握一些, 你需要记住比例变换是关于坐标原点进行的( 或者如果在Transform 节点的center 域中指定了中心点坐标, 则变换是关于这个指定点进行的) 。这就是说, 如果一个物体在x 轴方向上尺寸是从- 3~ + 2 的话, 你用3 作为比例系数在x 轴方向进行比例变换, 则在该方向得到的尺寸将是- 9~ + 6———每个点的x 坐标值都乘以比例系数。不仅如此, 如果物体在x 轴方向尺寸为+ 1~ + 2 , 用系数3 做比例变换后, x 轴方向新尺寸为+ 3~ + 6 , 你会发现新物体没有叠加在原位置上, 而是整个地挪了地方。

    为了便于进行物体的构造, 每个物体的基本造型一般都放在坐标原点处, 构造好后再移到恰当的位置去。

    (3) 圆柱体节点

    在前面例子中我们已经为神庙建好了基石, 现在该是把柱子放到上面的时候了。其实很简单, VRML 提供了另外一种简单几何节点———Cylinder (圆柱) , 用它来作为柱子是再合适不过了。如果是一个希腊、罗马或北京故宫的场景, 你能用Extrusion ( 拉伸) 节点或IndexedTaceSet (索引面集)节点(后面将会学到) 来制作精细的各种式样的石柱, 它们和你现在建的阿兹泰克神庙的石柱出自不同的国土, 建筑风格迥然不同。因此, 先做最简单的石柱。

    建造石柱和前面建造基石过程完全一样, 只不过把Box 节点换成了Cylinder 节点:

    Transform { translation - 5 6 .25 - 1 .875
    children [
    DEF COLUMN Shape {
    Shape {
        appearance Appearance { material Material { } }
        geometry Cylinder {
        radius 1 .25 height 7 .5
        top FALSE
        bottom FALSE
                }
        }
        ]
        }

    Transform {
    translation 5 6 .25 - 1 .875
        children [
            USE COLUMN
        ]
    }

    Cylinder 节点的域与Box 节点的域有些不同。一个圆柱由它的底面圆半径( radius)和高( height)决定。Cylinder 节点包含两个圆面片———顶和底, 它们和柱面共同组成一个封闭的圆柱体, 对此, Cylinder 节点包含三个取布尔值的域( side、top 和bottom) , 分别告诉浏览器是否画出柱面、顶和底。布尔值域是一种只能取值TRUE(真)或FALSE( 假) 的域。缺省值是整个圆柱三部分都画出来。在前面例子中设定的是顶和底不画出来, 因为在最终建好的神庙场景中, 石柱的顶和底是看不到的。

    要画用户看不到的物体只会降低你的浏览器渲染的速度。VRML 建立整个实体的外表, 但真正你需要去画的只是实体的那些可见表面部分。把你的场景文件调入浏览器中, 所看到的应该和图4 所示的差不多。

VRML2.0教程6:简单几何节点灰色基石上的灰色柱子
图4 灰色基石上的灰色柱子

    一般来说, 对于构件型物体( 如柱子和基石) , 它们一起构成一个整体, 因此相连部分最好能无缝地接合在一起(举个例子, 假如基石顶面的y 坐标为2 .5 , 就应该让石柱的底面y 坐标也为2 .5)。但是一些渲染系统对不相交的物体比相交物体画得更快; 如果你的物体是由多个组件物体构成, 这种情况下最好让组件之间有一点点缝隙。

    现在, 把一个经过放大的长方体放到柱子顶上作为神庙的天花板。

    DEF LOWER- CEILING Transform { translation 0 10 .625 - 10
    children [
    Shape {
        appearance Appearance { material Material { } }
        geometry Box { size 37 .5 1 .25 20 }
        }
    ]
    }

    由于这个长方体表面的大部分在浏览时是看不到的, 因此把可见的面用Indexed-FaceSet 节点来描述将会提高渲染的速度。另外, 使用IndexedFaceSet 节点还有一个优点是可以为每个面设定不同的颜色( 后面将会专门讨论如何为每个面指定颜色) ; Box 节点的所有面只能指定一种颜色。

    (4) 圆锥节点和球体节点

    余下的另外两个简单几何节点是Cone (圆锥) 节点和Sphere ( 球体) 节点。从语法上看它们和Box 节点及Cylinder 节点非常相似。在阿兹特克神庙的构造中没有用到这两个节点, 这里就不再赘述了。如果你想进一步了解它们的语法细节请参看附录B“节点说明”的有关部分。

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料