作者 吴亚峰 , 于复兴 , 杜化美

2.3 案例的基本框架
Android 应用案例开发大全(第二版)
对本案例中每个类进行详细介绍之前,首先要对本案例的基本框架进行简单的介绍。本节将要介绍案例的框架以及案例中各个类的作用,以及类与类之间的关系,从而使读者在阅读后面的章节时可以更好地理解案例的详细开发过程。

2.3.1 壁纸项目的框架结构
本小节将对3D水族馆动态壁纸的整体框架进行介绍,使读者对本案例的开发过程有深刻的理解,更加熟悉了解壁纸的制作流程,其框架如图2-14所示。




android 开发实例库 android开发实例大全pdf_3D



从图2-14中可以看出,本项目中包含很多不同的类,主要分为5大类。分别是壁纸实现类、绘制类、线程类、工具常量类及辅助绘制类等。这里简单了解一下即可,后面的小节将进一步进行较为详细的介绍。

2.3.2 各个类的简要介绍
为了让读者更好地理解本案例中各个类的作用及各个类之间的联系,本小节将按照上小节划分的5大类对所有本项目中的类一一进行简要介绍,具体内容如下。

1.壁纸实现类
壁纸服务类GLWallpaperService。
该类是3D水族馆动态壁纸的基础类。此类为壁纸项目的开发提供了服务接口,开发人员通过重写该类中的onCreateEngine方法等来实现壁纸功能。

动态壁纸类LiveWallpaper。
该类是实现3D水族馆动态壁纸的重要类。此类继承了壁纸服务类GLWallpaperService,并且重写了onCreateEngine 方法,在该方法内创建了自定义的场景渲染器,并且将该渲染器的渲染方式设置为主动渲染模式。

自定义渲染器类TDRender。
该类是3D水族馆动态壁纸案例中的核心类。在这个类中创建了本案例中需要绘制的所有对象,初始化需要的纹理,设置摄像机位置,设置各个对象的绘制方式等。

2.绘制类
气泡控制类BubbleControl。
该类是所有气泡的控制类。该类定义了所有气泡并将气泡对象添加到气泡列表中,创建并启动气泡移动线程,然后根据气泡的位置对气泡进行排序,最后遍历气泡列表并绘制气泡。

单个气泡类SingleBubble。
该类的作用是绘制场景中的单个气泡。在此类中定义了气泡的所有属性,如气泡的位置、纹理、气泡的最大高度等。每调用一次此类中的bubbleMove方法,气泡就会移动一小段距离,如果气泡的Y位置大于气泡高度的最大值,就会调用newPosition方法重新设置气泡的位置和气泡的最大高度,这里气泡的位置和最大高度是在一定范围内随机给出的。

群鱼控制类FishControl。
该类是群鱼的控制类(群鱼是指不包括鱼群的所有单条鱼的集合)。在该类中定义了群鱼列表,列表中存放着所有的单条鱼对象,创建并启动鱼的移动线程,最后遍历群鱼列表对单条鱼进行绘制。

单条鱼类SingleFish。
该类的作用是绘制单条鱼。在此类中定义了单条鱼的所有属性,包括鱼的位置、速度、外力、鱼食对鱼的吸引力、鱼的质量(力的缩放比)、鱼的旋转角度等。该类中的fishMove方法用来计算鱼的旋转角度,鱼所受到的外力(包括鱼和鱼群之间)和鱼食对鱼的吸引力,这两个力动态改变着鱼的游动速度大小和游动方向。

鱼群控制类FishSchoolControl。
该类是鱼群的控制类。在此类中定义了鱼群中的每条鱼,这些鱼组成了可以一起游动的鱼群,鱼群中的第一条鱼不受到其他任何鱼的外力,只受墙壁作用力。创建并启动鱼群的游动线程,遍历鱼群列表实现对鱼群的绘制。

单个鱼群类FishSchoolSingle。
该类的作用是绘制鱼群里的单条鱼。在此类中定义了鱼群中每条鱼的所有相关属性,具体包括鱼的位置、速度、外力、鱼偏离相对位置(以鱼群中第一条鱼所在的位置为球心,以定长半径确定的球面上的一个点)后受到的向心力、鱼的质量、鱼的旋转角度等。该类中的fishschoolMove方法用来计算鱼的旋转角度和修改鱼的速度。

鱼食类SingleFood。
该类的作用是创建并启动线程,绘制鱼食。在此类中定义了食物的移动线程,计算鱼食对鱼的吸引力线程,食物的y坐标,并创建了启动以上两个线程的方法startFeed,最后绘制鱼食。

喂食类FeedFish。
该类是食物的控制类。此类的startFeed方法用来计算触控点与摄像机所在位置连成的直线与地面交点的世界坐标系坐标,如果是第一次调用此方法,此方法还会调用SingleFood的startFeed方法来启动SingleFood中创建的两个线程。

3.线程类
气泡移动线程类BubbleThread。
该类是气泡的移动线程。在此类中会不断遍历气泡列表调用气泡对象中的bubbleMove方法,从而实现气泡的移动。

群鱼游动线程类FishGoThread。
该类是群鱼游动线程类。在此类中遍历群鱼列表判断两条鱼之间的距离,若距离小于阈值,则两条鱼之间会产生力的作用。对鱼进行碰壁检测,当鱼与墙壁的距离小于阈值时鱼会受到与墙壁垂直的力。然后修改鱼所受到的外力、鱼的速度和位置。

鱼群游动线程类FishSchoolThread。
该类是鱼群游动线程类。在此类中遍历鱼群列表并判断鱼群中的鱼(不包括第一条鱼)与相对位置 (以鱼群中第一条鱼所在位置为球心,以定长半径确定的球面上的一个点)的距离,若距离大于阈值就会对该条鱼产生向心力。然后对鱼群进行碰壁检测,碰壁时鱼群受到一个与墙壁垂直的力。最后修改鱼所受到的外力、鱼群的速度和位置。

鱼食移动线程类FoodThread。
该类是鱼食移动线程类。在此类中只要喂食线程的标志位没有被置成false就会不断修改鱼食的X方向和Z方向的位置使鱼食产生晃动效果。然后定时修改鱼食的Y位置。

鱼食对鱼产生吸引力线程类AttractThread。
该类是鱼食对鱼产生吸引力的线程类。在此类中不断遍历群鱼列表判断鱼是否能看到鱼食,如果鱼能看到鱼食,则该鱼受到鱼食的吸引力作用使鱼向着鱼食游动,当鱼与鱼食之间的距离小于阈值后鱼食消失,认定鱼食已经被鱼吃掉。本案例中鱼食对鱼群中的鱼不产生吸引力作用。

4.工具常量类
常量类Constant。
该类是整个壁纸中用到的所有静态常量集合。将一些常用静态常量定义到常量类Constant中,会降低程序的维护成本,同时会增强程序的可读性。

向量类Vector3f。
该类是本案例中用到的三维向量对象。包含了案例中所有需要的向量算法,具体包括求向量的模、向量的减法、向量的加法,向量的归一化等。

模型加载类LoadUtil。
该类作用是加载obj文件中模型的相关信息,然后生成顶点数据、纹理坐标数据(有时也会生成法向量数据)、最后构造对应的模型对象。

摄像机矩阵类MatrixUtil。
MatrixUtil类的setCamera方法通过调用Matrix类的SetLookAtM方法生成摄像机的观察矩阵。Matrix类的UtilfromGToO方法用于求经指定变换矩阵逆矩阵恢复的点坐标。

屏幕拾取类IntersectantUtil。
该类是和拾取相关的工具类(主要是在对鱼进行喂食的时候会用到该类中包含的相关算法),通过拾取计算获得摄像机位置所在点与屏幕触控点连线和地面交点的世界坐标系坐标。

5.辅助绘制类
背景图辅助绘制类BackGround。
该类的主要作用是构造水族馆背景和地面的纹理矩形。

气泡辅助绘制类Bubble。
该类主要是构造一个纹理矩形并贴上气泡纹理从而用于气泡的绘制。

模型辅助绘制类LoadedObjectVertexNormalTexture。
该类的主要作用是对加载的模型信息进行处理,形成顶点坐标缓冲和纹理坐标缓冲,并将相关的缓冲数据送入渲染管线,用于绘制。