VrmlPad工作环境的配置与使用()
作者:明明 阅读:483 次 时间:2005-9-17 来源:虚拟天堂
VrmlPad ParallelGraphics公司开发的一款专业的VRML编辑工具,它的2.1版具有:
  智能自动完成;
  动态错误检测;
  语法强调显示;
  场景树的可视化显示;
  多文档同时编辑;
资源文件管理;
自动化操作与自定义脚本操作;
整合脚本调试器;
预览节点缩略图;
发布;
等一系列功能(请参看附文浏览VrmlPad的具体特性)。
 下面开始给大家讲讲VrmlPad的配置和使用。
第一、工具栏:
 
 
 
 

上图中标出了几个“极端”重要的按钮(命令),他们能把我们的工作效率很好提高起来哦,但是这些东西需要大家在自己的工作中慢慢体会,在此不作详细介绍。工具栏的本意便是要我们能够快捷的使用一些命令,因此,善待工具栏吧!
第二、其他几个很很很有用的命令
1Edit | Fold | Expand AllCollapse All
  当你打开一个大场景时,可能你会发现,整个代码有几千甚至几万行,你若需要查修改其中某些对象时,你很难到他们,或在他们之间跳转,这时,你需要先用这个命令将所有的节点折叠起来,先看看其总体结构。当然,可能还是会有很长,没有关系,后面我们还会介绍更多的解决办法。
2File | Download
  这个功能可以说真的是VrmlPad最体贴的一个设计了,初学者手中可能素材太少,难以进阶,或创作者难以触发艺术的灵感,这时可能想去看看别人的作品,看看别人是怎么样实现“炫”的效果的。这个命令能帮你方便快捷下载网络上的资源。当然,请尽量不要抄袭别人的创意成果。
3View | Window | Split
把整个工作区域分成两个部分,若要同时对两个地方进行处理,这个命令将帮助我们实现最便捷的跳转(根本不用“跳”)。
3File | Save As
Gzip格式的高比率文件压缩,一般可达到1/6`1/10
4Tools | To FaceSet Tools | ScaleFaceSets
如果在安装VrmlPad 时安装默认的宏和插件,在Tools菜单中应该有这项。
前面的是将基本几何体BoxConeCylinder转换为面片模型以加快渲染速度。后面的命令则可以将面中坐标值进行整体的放缩,免去手工计算的烦恼。
第三、选项配置
现今大部分软件都可以自定义软件工作环境,VrmlPad 也不例外哦。
菜单Tools | Options可以打开选项对话框,主要讲一下其中几项的配置。
1General
    ASystemAssociate VrmlPad with VRML files设置VrmlPad关联到VRML文件,即VRML文件的打开方式,勾选后可设置关联的关系。
              Include VrmlPad in the start menu  VrmlPad快捷方式添加到启动菜单中。
              Include VrmlPad on the desktopVrmlPad快捷方式添加到桌面上。
   
VRMLJAVA在网络课件中交互运用分析
作者:不详 阅读:276 次 时间:2005-10-27 来源:86vr
虚拟现实建模语言(Virtual Reality Modeling Language VRML)和Java语言都是 可执行的代码技术,通过网络传输的只是一个很小的描述文件(指令性数据集),客户端通过本地的VRML浏览器、JAVA虚拟机交互地访问这些文件并解释执行。将JavaVRML结合,能够很好地实现网络多媒体课件技术:使用VRML进行场景构造,内嵌用Java编写的程序设计实现对象的编程行为。这使VRML在网上创建充满真实感的三维虚拟世界,为用户提供一种自然的、身临其境的体验方式,包括交互性、动态效果、连续性及参与感,而这将是未来网络教学的主要形式之一。[1]
1 VRML简单交互
VRML简单交互,VRML空间中各节点间数据交互。VRML有统一的数据传输接口和完善的属性集合和事件集合,可接收传感器节点发送过来的数值,并根据所对应的接口属性域设置提取数据、改变自身的属性值、触发事件进而改变自己在空间中的位置、外型和显示效果,还可以将处理后的数据送到输出域,传递给其他模型节点。各节点通过接口域的相互路由(route to)实现数据传输,路由的映射关系自由,但接口域的数据规格必须严格一致。
2VRML扩展交互
VRML本身交互机制是无法构建一个大型多媒体课件的,因为VRML本身不能完成普通程序设计中的转折、分支、循环等基本特征。因此实际系统设计中,可利用Java语言提供的强大网络编程能力,编写与远程系统通信和共享能力处理等功能的应用程序。JavaVRML的所有支持都通过附加的封装类实现。通过这些类,Java程序就能够访问VRML场景、接受和发送事件、从页面上得到VRML对象等,实现对VRML场景的完全控制。[2]根据访问方式的不同,又可分为:脚本编程接口SAI(Script Authoring Interface) 交互与外部编程接口EAI(EAI External Authoring Interface) 交互。
2.1脚本编程接口SAI交互
SAI交互即使用事件机制和路由利用Script节点实现VRML Java(JavaScript)的交互。首先,通过eventIn将事件传至Script节点中的脚本;其次,在Script节点中的脚本中调用相应的Java(JavaScript)进行处理;最后,通过eventOut将结果送回到VRML场景以实现动画或交互。[3]
VRMLScript节点是一种控制传感器和内插器的节点,通过它可以定义和改变场景中对象的外观和行为。Script节点的URL域可以包含一段JavaScript程序或者是链接的一个JavaClassSCRIPT节点可放置在场景的任何地方,用DEF命名它,从而完成事件的删除成传递。[4] SCRIPT节点的字段是由用户延伸的,到达这些字段的字段会自动移到和SCRIPT节点相关程序中。另外,SCRIPT节点也能够通过编写合适程序脚本,动态生成(改变)三维造型并绑定合适的感应器和内插器。[5]
2.1. 1Java通过Script(de)Script结点建立联系,控制VRML结点[6]
首先,定义Script节点中的各域域值,设置路由(Route)使VRML中的其它节点与Script节点联系起来。当与Script节点有联系的节点发生事件时,事件通过路由传给Script节点的eventIn域,Script节点则通过url域中指定的地址到java类。
然后,Java类开始工作,最先执行的是initialize()方法:在initialize()方法中必须获得Script节点中eventInfield域的值,或者把java中的值返回给Script中的eventOut域。Script类提供的方法有: getFieldfieldName); getEventIneventInName); getEventOuteventOutName); 作为参数的fieldNameeventInNameeventOutName要与Script节点中定义的名称相符合,对应的Field类的子类(vrml.filed包)与Script节点中定义的各种Type类型一致。它提供getValue()和setValue()方法。
再则,通过Script类提供的processEventEvent p0)或processEventsint p0, Event[] p1)方法来捕获Script节点传递的事件。processEventprocessEvents方法是所有外部事件公共的输入点。Java程序通过替代这两个方法对事件做出相应的处理。Vrml包中Event类的getName()方法返回事件名称(该名称与Script节点中发生该事件的eventInName相同),确定发生的事件,从而做出相应的处理;Event类的getValue()方法则返回一个ConstField类的实例 (它是Script节点中发生该事件的eventIn域),ConstField快捷指令url代码大全类是Field类的子类,它没有setValue()方法,因而只能取出Script节点中eventIn域的值,而不能修改。
最后,所有事件处理完后,程序就调用Script类中的eventsProcessed()方法,在这儿可以加入用户想要实现的动画、交互等各种效果。Script类中的shutdown()方法实现离开VRML文件的方式。
通过Script节点,能java程序处理过的数据返回给VRML文件。通过初始化时getEventOut()得到的变量的setValue()方法将值传递给Script节点的eventOut域,再通过路由传递给VRML中的各类节点,完成整个通信过程。
2.1.2 Java通过Script节点和Node(de)直接修改VRML节点
通过Script节点和路由,同时又必须在Script节点的eventOut域设置控制点,java程序才能改变VRML文件中节点值。当有大量数据需要传送时,这种给每个数据设置一个eventOut域加一个路由的方法显然是相当麻烦的。因此java,提出直接修改节点的方法。
Java直接修改场景中的节点,仍然要用到Script节点。首先在定义Script节点时,将eventOut域改为field域,fieldType定义为SFNode,具体格式如下:
“field SFNode fieldname USE nodeName” “nodeName”为要修改的节点名称(在VRML中由DEF语句命名),产生一个指向名为nodeName节点的指针。执行初始化时通过getField()方法得到相应的SFNode类的一个实例,通过getValue()方法得到该类的值,这里它的值恰好是名称为nodeNameNode类的实例,
然后通过Node类提供的方法直接修改节点。getExposedFieldString p0)、getEventInString p0)方法,分别得到节点的fieldeventIn域,并把结果作为Field类;再通过各Field类的子类提供的方法读取和设置值,将设置结果直接返回节点,不用再设置路由,从而达到了直接修改节点的目的。
Node类还提供了getEventOutString p0)方法,用它可以得到节点的eventOut域,与前两个方法不同,它得到的结果是一个不能修改的Field类,即Field类的子类ConstField类。 使用改进后的方法,可以有效的缩减代码长度,节省VRML文件的计算时间,提高VRML场景的生成速度。
2.1.3 Java通过Script节点和Browser(vrml)直接创建VRML场景
设置Group节点的addChindrenremoveChindren的值来可添加和删除具体节点,但还无法操作路由。当有大量不同的并相互关联的节点要通过javaVRML中创建时,工作量是难以想象的。为了满足这一要求,Script类继承BaseNode(vrml)类,
BaseNode类中定义了两个方法:getBrowser()和getType()。getBrowser()方法将会返回BaseNode类所处的浏览器。Browser类存在于vrml包中,它提供了一系列方法来对整个VRML文件进行控制。 如:
1)、添加和删除路由:addRouteSFNode fromNodeSFString fromEventOutSFNode toNodeSFString toEventIn),deleteRouteSFNode fromNodeSFString fromEventOutSFNode toNodeSFString toEventIn
2)、直接创建VRMLcreateVrmlFromStringSFString vrmlSyntax)(把要创建的节点语法以字符串的方式作为参数写入)
3)、在VRML中建立相应节点:createVrmlFromURLMFString urlSFNode nodeSFString event)(该方法的提供节点语法的参数是放在url地址所指出的VRML文件中,浏览器通过url到要加入的节点,把它加入到node参数指定的节点中event参数指定的eventIn域中)
4)、用指定的节点来替换整个VRML文件:replaceWorldMFNode nodes
url指定的另一个VRML文件来替换当前的文件:loadURLMFString urlMFString parameter)。
Script类执行initialize()方法时,得到浏览器实例,然后processEventEvent e)方法执行时使用上述方法建立、修改VRML场景。 通过改进,不仅VRML文件代码长度缩减,java程序代码也大大减少,进一步提高了VRML场景的生成速度。
2.2外部编程接口(EAI)交互
SAI交互VRML离不开Script节点和Script(de)。为了实现通信功能编写的java类都必须继承自Script类。但java不支持多继承,如果用Applet操控VRML场景, java程序要继承Script类的方法相当复杂。特别是要把VRML文件与Applet集成在同一个HTML页面时,用Script类来实现颇为困难,而且程序代码冗长、可扩展性差。[6]
VRML97标准提供的EAI定义了外部环境怎样通过VRML现存的事件驱动模式来访问VRML内部的节点的一系列方法,实现了AppletVRML场景的通信。EAI包含浏览器脚本接口的全部功能,例如查询浏览器的状态,增加或删除路由,生成新的节点等功能。[7]
Java主要使用BrowserNode两个类(al包),以及其它一些如处理eventIn域和eventOut域的各个属性类(EventIn*EventOut*)和处理例外的各种*Exception类完成对EAI的描述。
Browser类提供了三个方法:getBrowserApplet pApplet)、getBrowserApplet pAppletString frameNameint index)和getNodeString name)方法。前两个方法是静态方法,直接在Applet类中使用这两个方法得到Applet类和VRML所在的浏览器类的实例。getNode()方法可以直接得到VRML文件的具体节点(Node类)的实例,
InLine语句嵌入在VRML文件中的各个节点是用getNode()方法是无法得到的。这里的Node类与方法一的Node类是完全不同的,它用自己的getEventIn()和getEventOut()方法来得到VRML节点的各个域。然后使用返回的Event*的实例的getValue()和setValue()方法来控制具体的值。EventIn*类仅提供了设置值的setValue()方法;EventOut*类相对复杂,不仅提供了getValue()方法来获得当前值,还提供了监听EventOut域的接口??EventOutObserver,随时监听VRML节点中是否有新的EventOut事件发生,一旦有新事件发生,通过替代该接口提供的callbackEventOut valuedouble timeStampObject data)方法响应事件。
通过BrowserNode类,可以抛弃Script节点和Script类甚至路由而现实对VRML文件的各种节点即Node类的各个实例直接操控。但getBrowser()方法的参数必须是Applet的实例,因而该方法只能通过Applet来控制VRML
3.总结:
VRML与其它实现三维场景的技术手段(如OpenGL,Cult3D,3DSMAX,Viewpoint)相比,具有语法简单、三维建模功能强大、便于网上发布等优点。但由于VRML本身仅仅是一种标准,不可能满足各行各业的所有需要。所以,高级交互功能的实现必须借助于Java等功能强大的高级语言。这样,可以有效地弥补VRML本身的一些不足(例如逻辑判断、文件操作、键盘输入、精确控制场景等),进而完善与HTML等其它媒体的交互,也可实现复杂的虚拟环境系统网络课件。
作者:TGTT 阅读:599 次 时间:2005-11-18 来源:vker (已逝)
VrmlScript语言继承了JavaScript的大多数特性,而且使用JavaScript的基本语法,不同之处在于VrmlScript内建了针对VRML而设计的JavaScript对象.JavaScript中若要访问VRML节点中的某个值,Y轴坐标,必须要用数组才能实现.而在VrmlScript中要实现这个功能,呵呵,那就方便多了,可以将它当作对象的属性,position.y来调用.
如果你看了上面的东西,觉得一头雾水,那我就只能猜测你的
JavaScript没过关了,,没关系,挑一本JavaScript教程去补一补吧.补了之后再来看这个VrmlScript教程,记住,补了之后再来看哟,因为我不打算讲Vrml的基础东西,这些和JavaScript的是同一回事.
VRML中使用VrmlScript的基本结构为:
Script{
eventIn SFBool input
eventOut SFBool output
url"vrmlscript:
function input(value)
{output=value;
}
"
}
在这里,eventIn SFFloat input中的input代表的事件输入,也就是触发程序执行的源动力, SFFloat代表的是这个源动力的数值类型,常见的input可以是时间,布尔值等,而相应的数值类型是SFTime,SFBool.同理,eventOut SFBool output指的是事件输出,也就是你这个程序所要达到的目的.往下看,就是程序的内容了.
url"vrmlscript:
function input(value)
{output=value;
}
"
其中vrmlscript代表的是你这个程序所使用的语言是vrmlscript,当然,你也可以改成其他的,javascript,下面的function input(value)是这个程序的响应函数.output=value;是这个函数的语句,在实际使用中你只需将这个语句改成你自己的语句就行了.在这里有一点大家务必要注意,那就是,VrmlScript中要调用输入值时必须要通过一个与事件输入同名的函数来实现,不允许直接调用.如下例:
Script{
eventIn SFTime touch
eventOut SFInt32 choice
field SFTime touchTime 0 //定义了一个变量.
url"vrmlscript:
function calculate(input){
//use=touch; //错了,不能直接调用,记住!
use=touchTime; //通过一个临时量来调用,可以.
return(input+1)%3;
}
function touch(t,timestamp){ // touch中的第一个参数t就代表事件输入.
touchTime=t; //将事件输入保存在touchTime临时变量中.
choice=calculate(choice);//事件输出.
}
"
}
touch函数中有两个参数,第一个是事件输入,第二个是时戳.无论你给第一个参数取什么名字,它所代表的永远是事件输入.而时戳是系统自己生成的用于来安排事件执行顺序的,可以不用.
其实基本结构还可以这样:
Script{
eventIn SFFloat input
eventOut SFBool output
url"www.vker/myini.vs"
}
其中myini.vs中保存的就是你的程序代码.这样更有助于代码重用.
,现在举一个实际的例子.
#VRML V2.0 utf8
DirectionalLight {
ambientIntensity 0.5
intensity 0.5
}
DEF Shower Switch {
choice [
Shape{
appearance Appearance {
material Material {diffuseColor 1 0 0}
}
geometry Sphere {}
}
Shape{
appearance Appearance {
material Material {diffuseColor 0 1 0}
}
geometry Box{}
}
Shape{
appearance Appearance {
material Material {diffuseColor 0 0 1}
}
geometry Cone{}
}
]
whichChoice 0
}
DEF Sensor TouchSensor {}
DEF Computer Script{
eventIn SFTime touch
eventOut SFInt32 choice
url "vrmlscript:
function calculate(input){
return(input+1)%3;
}
function touch(){
choice=calculate(choice);
}
function initialize(){ //初始化.
choice=2;
}
"
}
uchTime uch
ROUTE Computer.choice TO Shower.whichChoice
程序通过uchTime也就是传感器的触发时间来触发VrmlScript运行,然后通过VrmlScript的运行结果来改变Shower的选择.
这个例子有两个讲点,
1),TouchSensor,先看一看它的定义:
TouchSensor{
exposedField SFBool enabled TRUE
eventOut SFVec3f hitNormal_changed
eventOut SFVec3f hitPoint_changed
eventOut SFVec2f hitTexCoord_changed
eventOut SFBool isActive
eventOut SFBool isOver
eventOut SFTime touchTime
}
有好多的输出噎,我们可以根据需要调用相应的输出.例如如果我们想知道鼠标在物体上接触的位置,可以用hitPoint_changed,如果我们想知道鼠标是否在物体上,可以用isOver等等.如上例就是用的触发时间touchTime.
2),initialize,这是VRML2.0规定的三个例程之一,还有两个是shutdowneventsProcessed;它们有什么用呢?
如果大家用过javascript的话就应该知道loadunload,而这里的initializeload意思差不多,就是指开始时要执行的代码,shutdownunload差不多,就是指结束时执行的代码.至于eventsProcessed就比较特殊,它在一个或者多个事件输入被处理完后执行,用于集中处理一系列不必考虑次序的事件输入带来的总的变化,这样就可以减少浏览器的工作量,提高浏览器质量.
VrmlScript 教程系列()---实战 (2)
作者:TGTT 阅读:600 次 时间:2005-11-18 来源:vker (已逝)
今天给各位分析一个简单的例子
这个例子中有三个球体,中间的是开关可以控制两边球体颜变换.
#VRML V2.0 utf8
DEF switcher Transform { #定义的是作为开关的一个球体.
children [
DEF t1 TouchSensor {}
Transform {
children Shape {
appearance Appearance {
material Material {
ambientIntensity 0.25
diffuseColor 1 0.45 0.4
specularColor 0.7 0.4 0.4
emissiveColor 0 0 0
shininess 0.9
transparency 0
}
}
geometry Sphere {
radius 0.3
}
}
}
]
translation 0 -1 0
}
DEF light3 Transform { #其中一个被控制的球体.
children Shape {
appearance Appearance {
material DEF m1 Material {
ambientIntensity 0.14
diffuseColor 0.44 0.44 0
specularColor 0.74 0.76 0.53
emissiveColor 0.18 0.18 0
shininess 0.11
transparency 0
}
}
geometry Sphere {
radius 0.8
}
}
translation -3 -1 -3
}
DEF light1 Transform {  #另一个被控制的球体.
children Shape {
appearance Appearance {
material DEF m2 Material {
ambientIntensity 0.14
diffuseColor 0.44 0.44 0
specularColor 0.74 0.76 0.53
emissiveColor 0.18 0.18 0
shininess 0.11
transparency 0
}
}geometry Sphere {
radius 0.8
}
}
translation 3 -1 -3
}
DEF switch Script { #要运行的程序.
eventIn SFBool boolIn
eventOut SFColor colorOut1
eventOut SFColor colorOut3
field SFBool onOff FALSE
field SFColor oldColor 0.5 0.5 0.5
field SFColor lightColor 0.9 0.6 0.4
url "vrmlscript:
function boolIn(value,timestamp)
{if (value){
if (onOff){
colorOut1=lightColor;
colorOut3=oldColor;
}
else {
colorOut1=oldColor;
colorOut3=lightColor;
}
onOff=!onOff;
}
}
"}
ROUTE t1.isActive TO switch.boolIn
#开关被点击的事件触发程序有了输入,开始运行
lorOut1 TO m1.set_diffuseColor
lorOut3 TO m2.set_diffuseColor
#程序的输出结果传送给两个球体,让它们改变颜.

看一看脚本的程序:
DEF switch Script {
eventIn SFBool boolIn
#boolIn是作为输入的布尔值,本例子中是通过中间球体的传感器触发.
eventOut SFColor colorOut1
eventOut SFColor colorOut3
#有两个输出值分别输出给两个不同的球体.
field SFBool onOff FALSE
#这只是用来记录开关运作的临时变量,分辨下一步是开还是关.
field SFColor oldColor 0.5 0.5 0.5
field SFColor lightColor 0.9 0.6 0.4
#定义了两个颜常量.
url "vrmlscript:
function boolIn(value,timestamp)
{if (value){ #如果输入是真,也就是指如果鼠标点击了开关.
if (onOff){ #如果onOff的值等于TURE.
colorOut1=lightColor;
colorOut3=oldColor;
#输出颜.
}
else { #如果onOff的值不等与TURE
colorOut1=oldColor;
colorOut3=lightColor;
#则输出另一种颜.
}
onOff=!onOff;
#如果onOff的值是TURE,则改为FALSE;如果值是FALSE则改为#TURE,以使下一次点击产生另一种效果.
}
}
"}
VrmlScript 教程系列()---实战 (3)
作者:TGTT 阅读:602 次 时间:2005-11-18 来源:vker (已逝)


这次准备谈一谈VrmlScript的直接输出问题,以前的例子都是通过ROUTE TO来间接控制脚本外的物体.其实可以在VrmlScript中直接控制外部事物,我们还是从例子入手 .这是一个模拟物体重力的例子.

#VRML V2.0 utf8
DirectionalLight {#灯光
ambientIntensity 0.5
intensity 0.6
direction 0 -0.707 -0.707
}
Transform { #地面
translation 0 -1.05 0
children [
Shape {
appearance Appearance {
material Material {diffuseColor 1 1 1}
}
geometry Box {size 50 .1 50}
}
]
}
DEF myTime TimeSensor {loop TRUE }
#将时间传感器定义成一个对象
DEF Sphere Transform { #将被控制的球定义为一个对象
children [
DEF Sensor PlaneSensor{
autoOffset FALSE
}
Shape{
appearance Appearance {
material Material {diffuseColor 1 0 0}
}
geometry Sphere{}
}
]
}
DEF myScript Script {
directOutput TRUE
//如果要在脚本内控制外部对象,上一句必须有.
eventIn SFTime time
field SFNode Object USE Sphere
//引用球体
field SFNode Sensor USE Sensor
//引用时间传感器
field SFTime lastTime 0
field SFVec3f offset 0 0 0
url"vrmlscript:
function time(time){
if(Sensor.isActive){#如果鼠标按在了球体上
t=offset.anslation_changed);
//变量t的位置等于鼠标现在的位置
if(t.y<0) t.y=0;
//如果t的高度小于地面,则将它的高度设为地面的高度(因为它不是人参果:))
anslation=t;
//引用的球体的位置等于t的位置.
}
else{//如果鼠标松开
anslation;
if(offset.y>0){//如果变量offset的高度在地面以上
offset.y-=time-lastTime;
//offset的高度随时间的变化减小
anslation=offset;
//引用的球体的位置等于offset的位置.
}
}
lastTime=time;
}
"
}
ROUTE myTime.time TO myScript.time
#用时间传感器触发脚本运行

我们可以发觉,VrmlScript中所直接控制的并不是外面的物体本身,而是它的引用,DEF,USE有一个特点就是引用的变化将促使源物体的变化.打个比方,如果你的名字是VKER,而你的外号是Killer,如果人家骂Killer是个白痴,那你会有什么反应?

看来是讲得太详细了,居然没人提问,,下次讲得要具有跳跃性:).
VrmlScript 教程系列()---实战 (4)
作者:TGTT 阅读:603 次 时间:2005-11-18 来源:vker (已逝)

VrmlScript中的数学运算
VrmlScript,如果要生成较为复杂的地面,丘陵等如果借助数学对象,则可事半功倍.
VrmlScript中主要有以下一些数学对象的方法:
abs(n):n的绝对值.
acos(n):n的反余弦值.
asin(n):n的反正弦值.
atan(n):n的反正切值.
ceil(n):n进位取整.
sin(n):n的正弦值.
cos(n):n的余弦值.
tan(n):n的正切值.
exp(n):自然对数的n次幂.
floor(n):n去尾取整.
log(n):n的对数值.
max(n1,n2):取两者较大的数.
min(n1,n2):取两者较小的数.
pow(base,exponent):baseexponent.
random():0.01.0间的随机数.
round(n):接近n的整数.
sqrt(n):n的平方根.

注意:所有的角度都是用弧度表示的.
在实际使用这些方法的时候,应该用Math.方法名(n)的方法,如下面这个曲面就是用数学方法生成的.

#VRML V2.0 utf8
DirectionalLight {
ambientIntensity 5
intensity 2
}
NavigationInfo {
type"EXAMINE"
}
Transform {
translation -4 0 -4
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0 1 0
}
}
geometry DEF Shower ElevationGrid {
#建立标高网格
creaseAngle 7
solid FALSE
height[
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
]
#初始化400个高度点
xDimension 20
zDimension 20
xSpacing .5
zSpacing .5
}
}
]
}
Script {
directOutput TRUE
field SFNode node USE Shower
url"vrmlscript:
function initialize(){
#初始历程
t=new MFFloat();#定义t为一个数组
for(i=-4;i<3.9;i+=0.4)
for(j=-4;j<3.9;j+=0.4){
v=Math.sqrt(i*i+j*j);
t[t.length]=s(v*3)*p(-v/3);
}
#用数学方法生成t中的各个值
node.set_height=t;
#将标高网格的各高度值改为t数组中的值
}
"
}
当然这个例子中使用的数学方法生成的网格并不是特别有用,如果你有一定的数学想象能力还可以生成更为美妙实用的曲面

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。