利用OpenGL技术实现网格波动效果界面

    张笑一

    

    摘要:为模拟波涛汹涌的波浪的动画,设计与开发网格波动效果界面;借鉴余弦函数以及相应的变换建立问题解决模型;利用C++的OpenGL开发动画程序;程序实现网格随机摆动。

    关键词:网格波动;余弦函数;OpenGL技术;C++;程序开发

    中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2016)12-0220-02

    Abstract: To simulate the roaring waves animation, design and achieve the grid fluctuation effect interface; Refer to cosine function and some transformations about cosine function to construct the problem solving model; Using of OpenGL of the C++ to develop animation program; The program achieve random fluctuation grid .

    Key words: Grid fluctuation; Cosine function; OpenGL technology; C++; program development

    1 概述

    网格波动界面的探索可以应用于影视、广告以及科研领域的仿真研究上,是一个值得探索的问题。

    文献[1]描述利用海浪频谱和方向函数生成每一张海面图片的高度场。文献[2]研究工作中涉及了波浪和浮体联合作用的研究。文献[3]研究内容涉及对波浪扭曲时的建模方式的探讨。文献[4]研究的内容涉及对海波使用纹理映射的讨论。

    2问题提出

    利用C++的OpenGL渲染技术,通过在事先定义的三维空间的若干顶点上增加随机运动方式算法可在之后程序画图时实现网格波动,利用C++的窗口界面程序的开发方法和引入相关后缀名为“.h”的文件的语法以及OpenGL技术,可实现所开发的界面播放OpenGL动画程序。将这两点有机结合后,提出开发带有网格波动虚拟影像的播放界面。

    3 建立运动方式模型

    倘若定义若干行三维空间中的顶点,可把行数定义为变量n,各行顶点数目与行数相等,则可以在OpenGL程序每回画出一张图画前通过使用循环语句执行算法的途径让各个顶点的空间位置发生变化或者不变。当每次画出图片前顶点可组成多条波动曲线的形状时,则可让这些图片在因为程序执行引起的连续放映形成网格摇摆的动画。本次n取80。

    循环语句所表达的初始顶点在任意单位循环时刻应具备的运动方式模型抽象为如下内容:(1)所有顶点的初始位置都保证它们在三维坐标系中的y为零,第一行第一个顶点处在(0,0,0)点位置,之后的此行中,各顶点与上一顶点相隔长度为m,第二行相隔上一行距离的长度是m,第二行各个邻居顶点间隔都是m,此后各行与上一行间隔是m并且本行邻居位置的顶点间隔也为m,所有顶点构成长宽等距的矩形网格并与负z轴、坐标为(0,0,0)的点和正x轴接壤;(2)假定在单位循环时刻图片画出前都从各行的前m个顶点中随机选取一个顶点放一个带指针的圆形纸片,各指针尾部按在各纸片中心,各针尖最前端与各纸片边缘某处重合,各纸片和坐标轴x平行;(3)各纸片的指针与顶点构成的长宽等距的矩形垂直,各纸片的指针和整个正y轴和负y轴组成的连线平行,指针所指方向所表示的向量和沿着y轴的正无穷远延伸的方向所表示的向量构成的角度为零,并且各纸片的中心位置与选取的随机顶点重合;(4)各纸片以数值一样的转速围着纸片中心匀速原地旋转并且都沿着正x轴朝正无穷远延伸的方向做着相同速度的加速度为0的直线运动;(5)各纸片在每次画出图片前都按相同的规定时间运动;(6)当长宽等距的矩形上某个顶点被某个纸片中心经过时,把指针的针尖与纸片的重合位置的y值作为此刻顶点的y值,这个值可用余弦函数以及相应的三角函数变换根据本次循环中运动开始后当前纸片在此时旋转产生的角度计算;(7)当各行的纸片在规定时间内运动结束,使用OpenGL的语法连线、渲染和画图;(8)下一张图片(也就是下一个单位循环时刻)依然按照前七步绘制。这里m为30。

    4网格波动界面关键内容介绍

    网格波动界面使用C++与用户界面程序开发有关的开发技术进行搭建。在利用C++语法加入OpenGL有关的文件后,将运动方式算法和每一时刻的与画图有关的语句放到合适的位置进行使用。由此,可以实现网格波动界面的动画。

    网格波动界面程序逻辑上分为三大部分,第一部分为网格波动界面的处理用户与界面交互主函数,第二部分为网格波动界面的交互信息处理函数,第三部分是与画每一张图片有关的函数。建立三部分之间联系的方法是在处理用户与界面交互主函数中利用while循环去检测预先定义的交互信息结构体有无内容,有就用C++自带的处理交互信息的函数发送到交互信息处理函数处理,处理后,程序将继续执行处理用户和界面交互主函数的那个循环,这由运行该波动界面的电脑自身控制,没有交互发生就执行画图函数的调用语句。在处理用户与界面交互主函数中,涉及的内容从上到下接连为:初始化网格波动界面语句块,加载波动界面画图设备函数体的调用语句,循环检测(这是之前提到的while循环),界面销毁句块。交互信息处理函数使用C++的分叉条件判别语法编写,它处理用户按下键盘、按紧和松开鼠标、手握鼠标滑动、网格界面大小变化、销毁网格波动界面的交互信息。

    网格波动界面的关键部分起到的作用的阐述如下:(1)处理用户与界面交互主函数的初始化网格波动界面语句块包含对波动界面的属性的定义、交互信息结构体的定义以及注册波动界面和与建立波动界面相关的操作。其中,波动界面的属性和交互信息的定义都是通过声明拥有与网格波动界面程序中的界面执行相关联属性的结构体的变量来在程序中使用它们。(2)处理用户与界面交互主函数的加载波动界面画图设备函数体的调用语句调用的是开发波动界面时编写的与向系统申请画图环境有关操作的函数,它的内容概括起来是利用windosws用户界面开发中需要的相关描述表去在一个操作系统的存储区域内分配一个用于进行OpenGL画图动作的工作区。(3)当处理用户与界面交互主函数的循环检测发现交互信息结构体有内容,如之前所说,交互信息处理函数使用的C++的分叉条件判别语法会根据判别条件到相应的位置去操作预先定义的全局变量或执行C++自带的会最终通知系统结束波动界面运行的语句。比如,当判定交互信息是销毁波动界面时,程序就会执行这个最终将结束波动界面运行的语句。交互信息处理函数中的全局变量被执行后,并且当循环检测执行到相应的画图函数时,画图函数根据它们的某些元素影响这个函数中相应分叉判别语句内部的OpenGL函数的生效,这实现了用户和波动界面的交互产生时应当引发的内容。当没有交互信息时,循环检测执行相应画图函数的调用语句,这个调用语句所关联的函数体也是波动界面的开发中自行编写的。它解释OpenGL在波动界面每一张图片绘画时起到怎样的作用,就是说怎样利用该技术提供的函数来刻画图片呈现给用户的效果。不仅如此,这个自行编写的函数体还将上一节的模型通过程序实现。(4)循环检测的终止条件是当交互信息结构体的message属性收到离开循环的信息。当离开循环检测,程序就执行界面销毁句块。它包含释放界面和绘画的工作区工作时所占的存储空间。

    5 效果展示

    6结束语

    1) 如图1所示,在波动界面的运行场所中点击启动调试后,可看到网格的波浪随机摆动的动画;

    2) 如图2所示,由于用户按下相应键盘,切换效果;

    3) 如图3所示,用户利用鼠标改变网格波动界面大小;

    4) 如图4所示,网格波动界面的画面可以随着用户鼠标的滑动而变换视角;

    5) 虽然实现了波涛汹涌的效果,但是,图2效果不够美观,这是不足之处,可通过改进3节模型规则后经过程序实现来改善放映效果。

    参考文献:

    [1] 罗玉. 3D海浪动画模拟技术研究[D]. 武汉理工大学,2008:3.

    [2] 邹耀斌. 风浪的行为特征建模[D]. 武汉理工大学, 2007:5.

    [3] 曾建英. 海浪的行为特征建模与实时绘制研究[D]. 武汉理工大学,2009:6.

    [4] 贾佳. 海面建模与绘制技术研究[D]. 天津大学,2011:12.

相关文章!
  • 融合正向建模与反求计算的车用

    崔庆佳 周兵 吴晓建 李宁 曾凡沂<br />
    摘 要:针对减振器调试过程中工程师凭借经验调试耗时耗力等局限性,引入反求的思想,开展了

  • 浅谈高校多媒体教育技术的应用

    聂森摘要:在科学技术蓬勃发展的今天,我国教育领域改革之中也逐渐引用了先进技术,如多媒体技术、网络技术等,对于提高教育教学水平有很

  • 卫星天线过顶盲区时机分析

    晁宁+罗晓英+杨新龙<br />
    摘 要: 分析直角坐标框架结构平台和极坐标框架平台结构星载天线在各自盲区状态区域附近的发散问题。通过建