如何在vrml中坐漫游,动画交互
展开全部
2 实现动画的方法2.1 视点移动
景物不变视点是人们在三维世界中观察场景时眼睛所在的位置和所看的方向、视角等。ViewPoint节点为所有这些变量提供初始值。当进入一个世界后,把化身放在文件中遇到的第1个ViewPoint节点中。由于绑定的存在,可以通过将能够控制用户视点的事件发送给ViewPoint。随着视点的变化,化身的位置也发生变化,因此观察到的场景也不断变化,从而实现了动画。
用此方法实现动画,需定义1个ViewPoint(VP)节点,用于移动对象的插值器PositionInterPolator(P)节点,用于旋转对象的插值器OrientationInterPolator(O)节点,以及作为set_fraction eventIn资源的TimeSensor(Time)节点。建立的主要路由如下:
ROUTE Time.fraction_changed TO P.set_fraction
ROUTE Time.fraction_changed TO O.set_fraction
ROUTE P.value_changed TO VP.set_position
ROUTE O.value_changed TO VP.set_orientation
这里用OrientationInterPolator和PositionInterPolator共同工作,使得当化身绕对象转身时,保证化身始终面对它们。这种实现动画的方法,比较适合动画中包含的立体景物较多的情况。
2.2 视点不变
景物移动这是一种与视点有关的实现动画的方法,它将用户绑定到固定的视点,通过物理对象位置的移动或旋转实现动画。位置移动的对象定义在Transform(T)节点中。为实现对象的移动或旋转,也需定义OrientationInterPolator(O)或PositionInterPolator以及TimeSensor(Time)节点。建立的主要路由如下:
ROUTE Time.fraction_changed TO O.set_fraction
ROUTE O.value_changed TO T.set_rotation
这种实现动画的方法,比较适合动画中包含的立体景物较少的情况,如球体的转动等。
2.3 使用纹理坐标的动画
在VRML中可以用ImageTexture节点为对象添加纹理。一般是采用缺省设置添加纹理,但也可以对纹理进行缩放、平移、旋转,这些操作通过TextureTransform节点实现,即通过这个节点控制纹理到对象映射的s和t坐标(纹理坐标)。
另外一种方法是:通过TextureCoordinate节点在1个形状的每一个顶点控制s和t坐标。只有IndexedFaceSet和ElevationGrid节点允许使用该节点。这些形状中的每一个顶点都有1个texCoord域,其中可放入TextureCoordinate节点。TextureCoordinate节点定义如下:
TextureCoordinate{
ExposedField MFVec2f Point[]
}
point域中的值是在每一个坐标处使用的s和t值。如果使用1个路由到set_point eventIn的插值器,便可以选择纹理坐标。这个EventIn是1个MFVec2f。VRML并没有1个内部节点用于执行这种插值,因此,只能用Script节点完成。下面是实现水上波纹动画的程序清单:
Group{
children Shape{
appearance Appearance{
texture ImageTexture{ur1″Water.gif″}
}
geometry IndexedFaceSet{
coord DEF C Coordinate{
point[-5 -9 1,5 -9 1,5 3 1,-5 3 1]
}
coordIndex[0,1,2,3]
texCoord DEF TT TextureCoordinate{}
}
}
}
DEF TS TimeSensor{
cycleInterval 15
stopTime -1
loop TRUE
}
DEF S Script{
eventIn SFFloat fraction
eventOut MFVec2f translation
field SFVec2f tt1 0 0
field SFVec2f tt2 0 0
field SFVec2f tt3 0 0
field SFVec2f tt4 0 0
url″vrmlscript:
function fraction(value){
tt1[1]=9*value;
tt2[1]=6*value;
tt3[1]=3*value;
tt4[1]=1*value;
translation[0]=tt1;
translation[1]=tt2;
translation[2]=tt3;
translation[3]=tt4;
}″
}
ROUTE TS.fraction_changed TO S.fraction
ROUTE S.translation TO TT.set_point
可以用类似的方法使用TextureTransform节点,模拟具有纹理的瀑布。
2.4 使用BackGround节点创建动画
VRML中的Background(B)节点为虚拟世界提供背景颜色或图像。通过颜色插值器ColorInterpolator(CI)在1组颜色关键码值之间进行插值,产生value_changed事件,将变化后的颜色路由到BackGround节点的skyColor或groundColor域,形成动画效果。
为了接收颜色插值器value_changed事件产生的颜色值,定义1个Script节点如下:
DEF S Script{
EventIn SFFloat fraction
EventOut MFColor color
Field SFNode CI USE CI
url ″vrmlscript:
function fraction(){
color[0]=CI.value_changed;
color[1]=CI.value_changed;
}″}
ROUTE TS.fraction_changed TO CI.set_fraction
ROUTE TS.fraction_changed TO S.fraction
ROUTE S.color TO B.set_skyColor
2.5 帧动画
利用VRML中的角色(1个平坦的始终面向用户的图像)和Switch节点便可在VRML中实现帧动画。具体做法为首先创建一系列图像;用它们制作一些角色,使这些角色成为Switch的子节点;当在这些子节点之间快速切换时,便形成动画。这种切换完全由创作者控制,这就必须用Script节点对它进行编程来完成某一特定的任务。例如:要播放由10个角色组成的动画,所需定义的Script节点如下:
DEF Myscript Script{
eventIn SFFloat fraction
eventOut SFInt32 whichChoice
url″vrmlscript:
function fraction?value(){
whichChoice=value *9;
}″
}
然后通过如下路由实现动画:
ROUTE TS.touchTime TO Time.startTime
ROUTE Time.fraction_changed TO MyScript.fraction
ROUTE MyScript.whichChoice TO MySwitch.whichChoice
其中的MySwitch定义了包括各个角色的Switch节点。
景物不变视点是人们在三维世界中观察场景时眼睛所在的位置和所看的方向、视角等。ViewPoint节点为所有这些变量提供初始值。当进入一个世界后,把化身放在文件中遇到的第1个ViewPoint节点中。由于绑定的存在,可以通过将能够控制用户视点的事件发送给ViewPoint。随着视点的变化,化身的位置也发生变化,因此观察到的场景也不断变化,从而实现了动画。
用此方法实现动画,需定义1个ViewPoint(VP)节点,用于移动对象的插值器PositionInterPolator(P)节点,用于旋转对象的插值器OrientationInterPolator(O)节点,以及作为set_fraction eventIn资源的TimeSensor(Time)节点。建立的主要路由如下:
ROUTE Time.fraction_changed TO P.set_fraction
ROUTE Time.fraction_changed TO O.set_fraction
ROUTE P.value_changed TO VP.set_position
ROUTE O.value_changed TO VP.set_orientation
这里用OrientationInterPolator和PositionInterPolator共同工作,使得当化身绕对象转身时,保证化身始终面对它们。这种实现动画的方法,比较适合动画中包含的立体景物较多的情况。
2.2 视点不变
景物移动这是一种与视点有关的实现动画的方法,它将用户绑定到固定的视点,通过物理对象位置的移动或旋转实现动画。位置移动的对象定义在Transform(T)节点中。为实现对象的移动或旋转,也需定义OrientationInterPolator(O)或PositionInterPolator以及TimeSensor(Time)节点。建立的主要路由如下:
ROUTE Time.fraction_changed TO O.set_fraction
ROUTE O.value_changed TO T.set_rotation
这种实现动画的方法,比较适合动画中包含的立体景物较少的情况,如球体的转动等。
2.3 使用纹理坐标的动画
在VRML中可以用ImageTexture节点为对象添加纹理。一般是采用缺省设置添加纹理,但也可以对纹理进行缩放、平移、旋转,这些操作通过TextureTransform节点实现,即通过这个节点控制纹理到对象映射的s和t坐标(纹理坐标)。
另外一种方法是:通过TextureCoordinate节点在1个形状的每一个顶点控制s和t坐标。只有IndexedFaceSet和ElevationGrid节点允许使用该节点。这些形状中的每一个顶点都有1个texCoord域,其中可放入TextureCoordinate节点。TextureCoordinate节点定义如下:
TextureCoordinate{
ExposedField MFVec2f Point[]
}
point域中的值是在每一个坐标处使用的s和t值。如果使用1个路由到set_point eventIn的插值器,便可以选择纹理坐标。这个EventIn是1个MFVec2f。VRML并没有1个内部节点用于执行这种插值,因此,只能用Script节点完成。下面是实现水上波纹动画的程序清单:
Group{
children Shape{
appearance Appearance{
texture ImageTexture{ur1″Water.gif″}
}
geometry IndexedFaceSet{
coord DEF C Coordinate{
point[-5 -9 1,5 -9 1,5 3 1,-5 3 1]
}
coordIndex[0,1,2,3]
texCoord DEF TT TextureCoordinate{}
}
}
}
DEF TS TimeSensor{
cycleInterval 15
stopTime -1
loop TRUE
}
DEF S Script{
eventIn SFFloat fraction
eventOut MFVec2f translation
field SFVec2f tt1 0 0
field SFVec2f tt2 0 0
field SFVec2f tt3 0 0
field SFVec2f tt4 0 0
url″vrmlscript:
function fraction(value){
tt1[1]=9*value;
tt2[1]=6*value;
tt3[1]=3*value;
tt4[1]=1*value;
translation[0]=tt1;
translation[1]=tt2;
translation[2]=tt3;
translation[3]=tt4;
}″
}
ROUTE TS.fraction_changed TO S.fraction
ROUTE S.translation TO TT.set_point
可以用类似的方法使用TextureTransform节点,模拟具有纹理的瀑布。
2.4 使用BackGround节点创建动画
VRML中的Background(B)节点为虚拟世界提供背景颜色或图像。通过颜色插值器ColorInterpolator(CI)在1组颜色关键码值之间进行插值,产生value_changed事件,将变化后的颜色路由到BackGround节点的skyColor或groundColor域,形成动画效果。
为了接收颜色插值器value_changed事件产生的颜色值,定义1个Script节点如下:
DEF S Script{
EventIn SFFloat fraction
EventOut MFColor color
Field SFNode CI USE CI
url ″vrmlscript:
function fraction(){
color[0]=CI.value_changed;
color[1]=CI.value_changed;
}″}
ROUTE TS.fraction_changed TO CI.set_fraction
ROUTE TS.fraction_changed TO S.fraction
ROUTE S.color TO B.set_skyColor
2.5 帧动画
利用VRML中的角色(1个平坦的始终面向用户的图像)和Switch节点便可在VRML中实现帧动画。具体做法为首先创建一系列图像;用它们制作一些角色,使这些角色成为Switch的子节点;当在这些子节点之间快速切换时,便形成动画。这种切换完全由创作者控制,这就必须用Script节点对它进行编程来完成某一特定的任务。例如:要播放由10个角色组成的动画,所需定义的Script节点如下:
DEF Myscript Script{
eventIn SFFloat fraction
eventOut SFInt32 whichChoice
url″vrmlscript:
function fraction?value(){
whichChoice=value *9;
}″
}
然后通过如下路由实现动画:
ROUTE TS.touchTime TO Time.startTime
ROUTE Time.fraction_changed TO MyScript.fraction
ROUTE MyScript.whichChoice TO MySwitch.whichChoice
其中的MySwitch定义了包括各个角色的Switch节点。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询