VRML2.0教程2:内联节点使用外部资源
来源:第三维度
作者:施寅,周葆芳,赵志勇
选自《VRML2.0使用速成》第四章第二节
1、利用内联节点使用外部文件
你可能经常想要把通过别的来源得到的造型融入你自己的场景中, 最好的办法是将这些造型仍保留在它们各自的文件中, 你只是在你的场景文件中引用它们。你可以把Inline节点看成一个很快捷的文件拷贝方式, 它把原文件中的相关部分拷贝到你的场景中。Inline 节点允许你通过指定URL 来引用外部资源。
[例1] 使用Inline 节点。
Inline { url "tlalocStatue .wrl"}
Inline 节点还允许你把自己的文件分成容易管理的几个大块。如果你还没有指定协议(如http:// ) 的话, 浏览器假设这个外部文件的路径就是当前文档的URL。
注意: 你必须清楚, 外部文件引用需要浏览器做额外的工作, 要求浏览器去连接相关服务器并获取数据, 这就增加了整个场景下载的时间。因此, 如果要引用的造型的数据量不是很大的话, 你最好直接把它放在你的场景文件中, 而尽量不使用外部引用方式。
2 使用一个对象的多个实例
如果你打算在场景中对同一节点进行多次使用的话, 你最好在第一次说明这个节点时就给它命名, 这样在后面你就可以借用这个名字多次引用它。这种引用技术除了能使VRML 文件更短更易读外, 它还节省场景的下载时间并提高了总体性能, 所以你应该尽可能地利用这一技术。
这种建立一个节点并在多个地方通过名字引用就称为建立节点的多个实例, 或简称为节点实例化。如果你改变了最初的那个节点, 那么它的所有实例也自动跟着改变。
正如前面提到过的, 有时你想把一个几何造型在场景中多次使用, 但每次颜色和纹理有所不同。在这种情况下, 你可以先说明几何节点并给它命名, 在重新引用时可以包括不同的材质节点和纹理节点来改变外观特征。
给节点命名使用的语句是DEF(“define”的缩写) , 例如, 你想为会兹拉波切特里神庙门上的横梁定义一幅纹理图, 并在多个地方使用它, 那么就应该在文件中第一次出现这个纹理节点时给它起一个名字。
[例2] 定义一个节点。
Appearance { texture DEF BOWS ImageTexture { url "http: . . ."}
# Names the texture map "BOWS"
}
接下来就可以使用这个定义好的对象。
[例3] 重用节点。
Appearance { texture USE BOWS # Use Huitzilopchtli bows texture map}
这个Appearance 节点包含了一个前面定义好的图片纹理节点的实例。
下面介绍在阿兹特克场景中大金字塔顶上的多个火盆是怎样用实例来实现的。
[例4] 火盆的多个实例。
DEF BothBraziers Transform { children [
DEF Brazier Group {
children Inline {
url "TMBrazierTlaloc .wrl"
bboxCenter 799 .5 127 .01 - 1187 .5
bboxSize 124 5 5
}
},
Transform {
children USE Brazier
translation 54 .5 0 0
}
]
translation 0 -1 .43 0
}
3 连接别的对象
在VRML 定义的几十种节点中, Anchor ( 锚) 节点算是最灵活的节点之一, 它提供了到万维网上任何别的场景、HTML 页面甚至声音、影像文件的超连接( 这些特性类似于HTML 的links/ anchors 链节定位特性) 。如果你指定了一个VRML 文件, 它将取代当前的VRML 场景; 如果你指定一个声音或影像文件, 浏览器就知道如何去播放它。
Anchor 节点的url 域指定要进行超连接的文件地址, 文件地址既可以是URL, 也可以是本地机上的文件路径。在children 域中指定用以激活超连接的对象, 用户点击它就能建立这个超连接。如果你想向用户描述一个超连接的内容, 你可以在description 域中填入说明的文字, 这样, 当你的鼠标光标停留在激活超连接的物体上时, 浏览器将会显示这些说明信息。
下面的例子介绍在阿兹特克场景中怎样用Anchor 节点来超连接一个讲述泰诺切蒂特兰城的HTML 文档。在这个场景中, 当用户的光标移到单词“Tenochtitlan”上时, 单词将以高亮方式显示。如果点击它, 相连接的HTML 文档将显示出来。
[例5] 使用Archor 节点。
DEF Title Anchor { url "Tenochtitlan .html"
description "The Aztec City of Tenochtitlan"
children [
Inline {
url "TitleText .wrl"
bboxSize 5 .8 .75 0
bboxCenter 0 .37 0
}
]
}
如果把多个物体连接到同一个文件, 那么你只需简单地把这些物体全部列在Anchor节点的Chidlren 域中即可。用户点击其中任何一个物体都将自动激活这一连接。这些物体可以是Inline 节点, 也可以是在你的VRML 文件描述的带有几何造型、表面特征以及空间位置的物体。
[例5] 带有多个子节点的Anchor 节点。
DEF Title Anchor { url "Tenochtitlan .html"
description "The Aztec City of Tenochtitlan"
children [
Inline {
url "TitleText .wrl"
bboxSize 5 .8 .75 0
bboxCenter 0 .37 0
}
Transform {
children Shape {
geometry Box { size 1 1 1 }
}
translation 0 1 0
}
]
}