1、Vega海洋模块开发 (场景的初始化 Vega Marine模块、) Vega海洋模块(即Vega Marine模块)是Vega系统的一个可选开发模块,主要用来进行海洋环境和海事行为的仿真。该模块主要包括:动态和静态海洋模型、域矢量、海洋特效等部分。另外还包括Correlated Host Dynamics ,主要用于分布式仿真。 Vega中的每个海洋实例都包含两部分:动态海洋和静态海洋。动态海洋用来在当前观察者周围产生滚动波。静态海洋产生在动态海洋的外周,表示观察者视力所及的范围中除去动态海洋的部分。如下图所示: Vega Marine提供了6个海洋状态,用来展示不同
2、的海洋表面效果。在海洋状态确定以后,一个二维的纹理将映射到三维的动态海洋表面上。 Vega中动态海洋表面波动效果的本质是把海面上某一点的波动η用多个传播方向上的多个随机余弦波的叠加来表示,如下所示: 其中,Tide为世界坐标系中平均海平面高度, 为平均振幅,为某个海洋状态下的波高。 为第i个组成波的深水传播系数 ,其中,为重力加速度;为波的方向,数值从0到2;为第i个组成部分的非空间角频率;,为海洋状态的角频率,为重复海洋状态的周期 为第i个组成波的相位角,度数为弧度。 在Vega的Lynx面板中,提供了给、、、等参数的输入框。 域矢量(Field Vectors)
3、主要用来控制:漩涡的长度和方向、船舷旗的方向、浪花、flotsam、foam等。域矢量是专门用来模拟打转效果的,是力和速度的矢量,位于XY平面内,在世界坐标系下是常量。当在一个较大的区域内模拟风力的时候,水流是变量,是水域宽度、潮汐和其他因子的一个函数。多个域矢量可以模拟多个方向上的海风,而且这些海风会影响场景中的一些其他海洋特效,例如漩涡、漂浮物、浪花等,这样使得虚拟海洋更加逼真。 Vega为复杂海事行为提供了一系列海洋特效,例如拍岸浪、船首浪、船尾浪、转向关节、漩涡、浮标、等长线、悬挂线、落水船员、升信号旗、浪端的白泡沫、漂浮物、水沫、浮木等等。 Lynx为Ocean、Field Ve
4、ctors、Marine Effects等都提供了设定面板。 在Ocean面板中,Vega为生成静态和动态面板提供了一系列参数:开启关闭控制、观察者参照、波浪纹理、海洋状态、海事效果添加等。 Ocean面板的内容取决于海洋是二维的还是三维的。三维海洋的面板如下: 接下来是二维海洋的面板: 在面板中,Enables Buttons用于指定某个海洋实例是否被渲染。 每个海洋实例都需要指定观察者。海洋实例指定观察者以后,海洋实例才能在观察者的通道中渲染。 每个海洋实例有三种渲染方法:二维、3D Sinusoidal、3D Trochoidal。 用户可以指定海洋波浪的纹理以及纹
5、理应用的参数,例如纹理重复、纹理运动调整以及纹理基色等。海洋环境的纹理有四种类型:调制纹理、混合纹理、透明纹理和无纹理。在Modulate调制情况下,海洋基色将和海洋纹理的颜色进行融合。Blend混合模式下,海洋纹理和天空或者可见环境颜色进行融合,而且这种融合取决于雾模式是否开启。Alpha透明模式下,纹理功能仅仅作用于纹理的Alpha成分。缺省的纹理类型为Modulate。 环境映射。当映射选定为None的时候,海洋表面的纹理坐标将由Marine的软件自动计算。在Sphere模式下,利用观察者的视向量和海洋表面的顶点法线运算纹理坐标。环境映射使得海洋表面纹理具有某些金属质感效果,一般用来模
6、仿云和总体环境效果。 Base Texture基本像素用来指定海洋表面几何体的纹理类型,如:*.int, *.inta, *.rgb, 或者 *.rgba。 Tile,用来指定波浪纹理在X和Y方向上的重复次数。这个数值从0到5000. Color 用来指定海洋的基色。 Motion Factor:为了获取接近于现实的效果,动态海洋的纹理一般具有固定的运动。Motion Factor用来指定纹理运动的幅度。 Options选项,包括波浪朝向(Wave Heading)、海平面基高(Tide Height)、预定义海洋状态(State)、预定义海洋状态值之间的切换时间(Transitio
7、n Time)。 Ocean Positioning 海洋定位 海洋定位选项板。Ocean Center 列表用来选择定位方法。其中,在Use Channel Frustum 模式下,利用海洋实体的观察者的第一个通道来定位静态海洋。Use Observer Position 选项,海洋以观察者为中心进行定位。如果一个观察者有多个相邻的通道,一般使用Use Channel Frustum进行定位。 Wave Components(波浪成分)选项卡 波浪成分的缺省值是对海洋表面的能量进行光谱分析得到的。用户可以通过上面的菜单来改变预先确定的缺省的波浪成分。但是这个更改需要慎重
8、因为容易出现异常的视觉效果。 三维波浪成分(3D Wave Components) 当定义三维波浪成分的时候,还可以使用其他选项,包括方向偏移、波幅和波幅比例等。 偏航(Heading Offset) 对于每个波浪成分可以以弧度定义方向或者方向偏移(Heading Offset),该参数为波浪成分定义传播的方向。在二维海洋中,所有波浪成分具有相同的传播方向。 波幅(Amplitude) 以英寸为单位的每个波浪成分都需要指定波幅(Amplitude),这个参数定义波浪成分的最大和最小的高度值。 波幅比例成分(Amplitude Scale Scale) Amplitude S
9、cale Scale用于定义每个波浪成分,该参数定义一个比例系数,使用该比例系数在不改变每个波浪成分波幅的同时,可以调节波浪成分的高度。 三维波浪成分的参数设定界面如下。 9,定义海洋状态(Sea State Definition)键 用户可以通过定义海洋状态键来改变海洋状态所定义的预设值和缺省值。这个操作由Sea State Definition按钮中选择Sea State Definition键完成。但是,实践中发现,随意改变这些缺省值会导致不可预料的结果。对于三维海洋状态来讲,该界面提供专门的表示海洋状态的纹理。 10,海洋效果的附件(Marine Effect
10、 Attachment) 海洋效果不是独立存在的,海域效果必须要对海洋的波浪运动做出反应。典型的海洋效果包括:船只尾迹、翻浪、漩涡、浮标以及落水船员等。Marine Effect Attachment是一个附件列表,该列表列举了附属到某海洋实例的所有海洋效果,用户可以自行增删。 11,海洋相交矢量类(Isector Class) 该面板用于海洋实例的相交矢量掩码。如果海洋实例的相交矢量掩码与某其他实例的掩码相交不为空,则两者之间可以进行相交矢量检测。该面板如下所示。 12,静态海洋(Static Ocean) 静态海洋需要设定半径(Radius)和开启标记(Enabled)。
11、静态海洋半径缺省值为5000米,有效半径范围为0到50000米,用户可以自行设定。开启标记用于控制静态海洋是否被绘制。 13,二维动态海洋(2D Dynamic Ocean) 当海洋渲染模式为二维时,会出现2D Dynamic Ocean(二维动态海洋)标记,涉及的参数主要包括打开控制、半径、采样速率(Oversample)和波浪多边形个数。其中,打开控制用于激活海洋状态。在一个既定的海洋状态下,主要涉及三个变量,即用于创建动态海洋的多边形数量、采样频率以及环观察者的动态海洋半径。这三个变量决定海洋状态的波浪成分,当海洋面积较小 的时候,一般使用波幅和周期较小的波浪成分。对于多边形数量的计
12、算,Vega提供了三种求解方法:按照多边形个数求解(Solve for Number of Polygons)、按照采样频率求解(Solve for Oversample)和按照半径求解 (Solve for Radius)。Solve for Number of Polygons是保持观察者的观察半径和采样频率不变,此时增加多边形数量会减弱海洋状态;按照采样频率求解是保持多边形数量和观察者观察半径不变,此时增加波浪块会减弱海洋状态效果,也会减弱采样频率。按照半径求解的方法是保持多边形数量和采样频率不变,此时如果海洋状态较小,观察者周围的动态海洋半径也会变小。 波浪多边形的计算等式为:
13、 其中,为多边形数量,为每段波长的采样数;为动态海洋半径,为波长,,其中,为波浪周期。 动态海洋半径的缺省值为500米,有效值为0到1000米。 采样频率代表波浪成分波峰之间的采样点数量,缺省值为10,有效值为1到50。 多边形个数的有效数值范围为1到50。 14,三维海洋模型 三维海洋模型需要的信息更为丰富一些,需要输入Detail Texture、Thread、3D Dynamic Ocean等信息。 Detail Texture(细节纹理)表示在一个贴过纹理的表面上在近处观看所看到的效果。一般的,缺省纹理是一个高频率的斑驳纹理,用来表示具有波动效果的波形外观。 Thread
14、线程)用来指定CPU的个数和海洋线程的优先级。在CPU=-1的情况下,不创建线程,但在应用程序的线程中进行海洋计算。在Vega的APP线程中,如果没有计算完当前帧下的海洋效果,不允许对下一帧进行海洋计算。这一点体现了海洋线程与应用线程的同步性。如果APP线程渲染时间很短,则使用Ocean线程的意义不大。如果APP线程和Ocean线程的计算时间都超过所需帧的时间,则两个线程并行的优越性就会体现出来。 三维动态海洋(3D Dynamic Ocean)的控制参数包括:细节纹理、线程设置、开关控制、海洋半径、网格设置和静态顶点密度的计算等。其中,开关控制(Enabled)如果开启,则计算其动态海洋
15、高度,利用3D方式绘制动态海洋;如果关闭,则动态海洋的高度将固定在Tide Height的位置上。动态海洋半径(Radius of Dynamic Ocean)的缺省数值为250米,有效数值范围为0到50000。最大网格行数(Max Mesh Rows)和最大网格列数(Max Mesh Cols)用来控制动态海洋表面的离散化程度,缺省值为50米,有效范围为0到10000米。静态顶点密度(Static Vertex Density)用来控制动态和静态海洋之间的变换效果。静态海洋并非完全固定不动,某些静态海洋的顶点也会被视为动态海洋的一部分。静态海洋中的顶点是使用行来排列的,这些行中的列是通过一定
16、的比例来确定的。这个比例就是静态顶点密度,它控制了静态海洋中各“行”的“列”的数量。这个数值越大,则静态海洋和动态海洋之间的区别越大。这个比例缺省值为0.5,这种情况下,静态海洋的渲染负担大约是动态海洋的15%。如果比例达到0.75,则负担比例会达到30%。 下图为3D海洋的计算面板。 这里面有很重要的一个参数是法线计算(Normal Calculations)。法线计算的目的是为了控制计算量。法线计算有None、Fast和High Quality三种选项。在None情况下,不计算法线,每个顶点被固定在(0,0,1)点上;在Fast情况下,每个顶点的法线使用两个最相邻的顶点计算;在Hi
17、gh Quality模式下,每个顶点法线使用8个相邻的顶点进行计算。 照明效果计算(Lighting Effects)位于Lighting FX Calculation选项菜单中,有None、Fast、High Quality三个选项。None模式使用图形加速卡照明;在Fast和High Quality模式下,海洋顶点将被照明涂成阴影。 域矢量(Field Vector)面板 域矢量(Field Vector)是力和速度的矢量。域矢量一般位于XY平面内。Lynx提供了专门的域矢量(Field Vector)面板来定义各类域矢量。 域矢量面板中的参数主要包括大小(Magnitud
18、e)、方向(Heading)等。Magnitude参数的有效范围为0到10000。Heading参数的有效取值范围为0到360度。 海洋效果面板 海洋效果(Marine Effect)用来模拟海洋动态效果的外观,而且所模拟的海洋效果是使用一般标准数据库很难模拟的。在应用中,用户可以指定一个海洋效果的类,来指定效果类型,然后,指定其位置或者关联到Object以及Player上,则可以完成相应的渲染。海洋效果的主要参数包括:开启控制、类型识别、引用观察者、引用位置和图形组成等。 所有的海洋效果都可以使用Vega世界坐标中的位置进行定位。用户可以给海洋效果直接指定位置,也可以通过附
19、属对象、运动体等方法来指定位置。 各类海洋效果的定位方法如下所示。 海洋效果 X轴 Y轴 Z轴 偏航 俯仰 滚动 船尾尾迹(Stern Wake) YES YES NO NO NO NO 翻浪(Bow Wave) YES YES YES NO NO NO 浮标(Buoy) YES YES NO YES NO NO 漩涡(Eddy) YES YES NO NO NO NO 等长线(Constant Tension Line) YES YES YES NO NO NO 悬挂线(Constant Length L
20、ine) YES YES YES NO NO NO 落水船员(Crew Overboard) YES YES NO NO NO NO 升信号旗(Hoisted Flags) YES YES YES YES YES 转向开关(Knuckle) YES YES NO NO NO NO 浪端泡沫(Whitecaps) YES YES NO YES NO NO 悬浮物(Foam) YES YES NO YES NO NO 泡沫(Foam) YES YES NO YES NO NO 浮木(Log) YE
21、S YES NO NO NO NO 拍岸浪(Surf) YES YES NO YES NO NO 由于本次毕业设计没有用到相关的海洋特效,因此不再一一详细介绍。 Vega海洋模块的开发 为了编写Vega海洋应用程序,Vega海洋模块包括了“vgMarine.h”头文件和创建仿真所必须的库文件。Vega图形引擎所提供的海洋模块开发链接库为psVgMarineD.dll、psVgMarine.dll、psVgMarineSD.lib、psVgMarineS.lib。其中,前两者为动态链接库,后两者为静态链接库。 Vega API为每个Marine、Ocean
22、Field Vectors和Marine Effects类都提供了访问方法。这些API的函数名的前两个字母都为vg,一般涉及到5种类管理方法:New、Find、GetNum、Get和Delete。 应用Vega API进行海洋模块开发,主要涉及的工作有: 海洋模块初始化 Vega海洋模块和特效的初始化通过vgInitMarine、vgInitFx函数来实现。典型的Marine模块初始化代码如下: main() { /* 初始化Vega系统*/ vgInitSys(); /* 初始化Vega海洋模块*/ vgInitMarine();
23、 /* 初始化Vega特效模块*/ vgInitFx(); /* 使用ADF配置初始化系统*/ vgDefineSys("mymarine.adf"); /* 对配置文件中的系统和实例进行注册*/ vgConfigSys(); /* 仿真循环*/ while ( 1 ) { vgSyncFrame(); vgFrame(); /* 其他操作的函数放置位置*/ } } Marine类接口 Marine类为Vega海洋模块中各类提供了一个容器。一
24、般的一个应用程序只有一个海洋类实例。 Marine类事件可以通过vgGetMarine来获取。各种Ocean、Field Vector、Marine Effect等实例可以通过vgPrint来打印。 Ocean类接口 Vega海洋的可视化效果是以观察者为中心展开的。因此,一个Ocean实例必须要关联一个观察者,并且可以关联多个海洋特效。海洋实例、观察者实例、海洋特效实例之间的关联关系如下所示 vgProp可以给海洋实例赋予属性。例如下面的代码用于指定Ocean的状态。 vgOcean *ocean; vgProp( ocean, VGOCEAN_STATE, VG_
25、ON ); 也可以通过vgGetProp取得当前海洋实例的状态,例如 vgOcean *ocean; float ocean_state; ocean_state = vgGetProp( ocean, VGOCEAN_STATE ); 典型的海洋属性列表如下: 属性 说明 VGOCEAN_STATE 海洋开启状态,一般取值VG_ON或者VG_OFF VGOCEAN_DYNAMIC_STATE 动态海洋状态,一般取值VG_ON或者VG_OFF VGOCEAN_WAVE_HEADING 以正北为正,定义波浪的传播方向。 取值(0.0 - 360.
26、0) VGOCEAN_SEA_STATE 海洋状态 (1 - 6) VGOCEAN_STATIC_RADIUS 静态海洋半径, 取值为大于0的浮点数 VGOCEAN_TIDE_HEIGHT 海洋波浪高度,取值为浮点数 VGOCEAN_WAVE_TEX_TILEX 波浪传播方向上的纹理片个数,一般取值为大于0的浮点数。 VGOCEAN_WAVE_TEX_TILEY 波浪传播垂直方向上的纹理片个数,取值为大于0的浮点数。 VGOCEAN_WAVE_MOTION_FACTOR 波浪纹理的谐波运动系数,取值为正的浮点数。 VGOCEAN_STATIC_STATE 定义静
27、止海洋状态的开启关闭。取值为 VG_ON 或者VG_OFF VGOCEAN_CENTER 基于观察者位置的观测中心 VGOCEAN_TRANSITION_TIME Time used to transition between seastates (float > 0) The following property only applies to 2D oceans: VGOCEAN_Y_RADIUS_SCALE Scale factor for the ocean "y" axis, this helps to hide the boundary between the
28、dynamic and static oceans. (float > 0) The following properties only apply to 3D oceans: VGOCEAN_AMPLITUDE_SCALE Overall scaling factor applied to 3D wave component amplitudes. This makes it easier to maintain desired waveheight while adding and removing transient wave components. (float >= 0)
29、 (default 1.0) VGOCEAN_TYPE VGOCEAN_2D or VGOCEAN_3D (default VGOCEAN_2D) VGOCEAN_CPU CPU assigned to compute Ocean calculations (1 means unused, 0 to ncpus-1 is valid range) VGOCEAN_PRI Priority of ocean calculation process (89 >= int >= 0) (default 49) VGOCEAN_MESH_RADIUS The radius of
30、 the dynamic ocean. (float > 0) VGOCEAN_MESH_ROWS Number of rows in dynamic ocean mesh. (int >= 2) Note: more rows increase calculation time VGOCEAN_MESH_COLS Number of cols in dynamic ocean mesh. (int >= 2) Note: more cols increase calculation time. VGOCEAN_WAVE_SHAPE Controls the shape
31、of the ocean waves. Sinusoidal waves are smoother, rounder waves. Trochoidal waves are choppier, pointier waves. VGOCEAN_SINUSOIDAL or VGOCEAN_TROCHOIDAL (default VGOCEAN_SINUSOIDAL) VGOCEAN_NORMAL_CALC Controls the normal calculations VGOCEAN_NORMAL_DISABLED or VGOCEAN_NORMAL_FAST or VGOCEAN_NO
32、RMAL_HIGH_QUALITY (default) VGOCEAN_DEPTHFX Controls the depth effects calculations VGOCEAN_DEPTHFX_DISABLED (default), VGOCEAN_DEPTHFX_FAST or VGOCEAN_DEPTHFX_HIGH_QUALITY VGOCEAN_LIGHTFX Controls the lighting effects calculations VGOCEAN_LIGHTINGFX_DISABLED (default), VGOCEAN_LIGHTINGFX_FAST o
33、r VGOCEAN_LIGHTINGFX_HIGH_QUALITY VGOCEAN_TEXTYPE Determines the texture environment type that is used for ocean geometry. VGOCEAN_TEXTYPE_NONE, VGOCEAN_TEXTYPE_MODULATE (default), VGOCEAN_TEXTYPE_BLEND or VGOCEAN_TEXTYPE_ALPHA VGOCEAN_ENVMAP Determines how environment mapping is used. VGOCEAN
34、ENVMAP_NONE (default), VGOCEAN_ENVMAP_SPHERE VGOCEAN_DEEP Highest elevation or "depth" value at which the ocean is considered to be completely deep water. Any depth more negative is also considered deep. (float -3) default = -50 VGOCEAN_DEEP_ALPHA Transparency of ocean at depth VGOCEAN_DEEP.
35、0.0 float 1.0) default 1.0 VGOCEAN_STATIC_VERTEX_DENSITY Ratio of the number of vertices in between rows of the static ocean. Increasing this number increases the cost of the static ocean but hides the transition between the dynamic and static oceans more effectively. (0.1 float 0.75) default 0.5.






