基于android手机系统的3d桌面主题开发毕业论文(编辑修改稿)内容摘要:

的法向量。 但很多情况下一个顶点并不只属于 一个三角形面,而可能属于多个三角形面。 而在OpenGL ES 中不能给一个顶点分配多个法向量,因此一般采用的处理方法是此处的顶点属于几个面就在此处放置几个位置相同的顶点,并为这几个顶点分别指定属于面的法向量。 点平均法向量指当同一点隶属于多个面时,为其分配的是各个面法向量的平均值。 如立方体中每个顶点属于 3个面,因此每个顶点的法向量就是 3 个面法向量的平均值。 面法向量和点平均法向量各有其不同的使用场合。 面法向量棱角分明,更适合实现本身就棱角分明的三维物体,如立方体,四棱锥等。 点平均法向量过渡平滑,比较适合表面平 滑、没有棱角的物体,如茶壶、圆柱面、球等 ②。 物体的材质 设置材质的主要工作就是设置材质对于环境光、散射光、镜面光的发射能力,也就是说此安置能反射什么颜色的光。 例如,白色的材质能发射所有颜色的光,红色的材质只能 ① 吴亚峰 苏亚光 .Android 3D 游戏开发技术详解与典型案例 [M].北京 :电子工业出版社 .2020:P121 ② 吴亚峰 苏亚光 .Android 3D 游戏开发技术详解与典型案例 [M].北京 :电子工业出版社 .2020:P143– P146 ()。 // 打开 0号灯 float ambientParams[] = { , , , }。 // 环境光设置 (, , ambientParams, 0)。 float diffuseParams[] = { , , , }。 // 散射光设置 (, , diffuseParams, 0)。 float specularParams[] = { , , , }。 // 反射光设置 (, , specularParams, 0)。 float positionParams[] = { cameraX, 0, cameraZ, 0 }。 // 最后的参数表示定 向光( 0)或定位光( 1) (, , positionParams, 0)。 } 基于 Android手机系统的 3D桌面主题开发 16页 发射红色光。 代码 在本论文的工程开发中,设置物体材质的代码如代码。 纹理贴图 在三维场景中,经常需要把图片等图像信息显示出来,因此需要有一个机制能使二维图像在三维场景中展现,这就是纹理贴图。 纹理映射允许 将指定的纹理素材映射到三维物体指定的多边形面上。 但 OpenGL ES 中仅支持三角形,因此指定纹理坐标时需要对图像进行切割。 物体上的每一点对应一组纹理坐标 s、 t,在对纹理进行粘贴之前要根据其所应用的片段进行排列。 对于二维的纹理图,纹理坐标在 S 和 T 方向上的范围是 ~,但是进行纹理贴图的物体没有坐标范围的限制。 但在应用开发中,有时候需要把一幅纹理图拉伸或缩小到目标面上,在目标面很大的情况下有三种解决方案: 将纹理拉大,这样的缺点是纹理显得非常不清楚,失去了原来清晰的效果,甚至可能变形。 将目标 面分割为多个与纹理大小相似的矩形,再将纹理重复贴到被分割的目标上。 这样做的缺点是不仅浪费了内存(需要额外存储大量的顶点信息),也浪费了开发人员宝贵的精力。 使用合理的纹理拉伸方式,使得纹理能够根据目标平面的大小自动重复,这样既private void initMaterialWhite(GL10 gl) { float ambientMaterial[] = { , , , }。 //环境光为白色材质 (, ,ambientMaterial, 0)。 float diffuseMaterial[] = { , , , }。 //散射光为白色材质 (, ,diffuseMaterial, 0)。 float specularMaterial[] = { , , , }。 //高光材质为白色 (, ,specularMaterial, 0)。 float shininessMaterial[] = { }。 // 高光反射区域,数越大高亮区域越小、越暗 (, ,shininessMaterial, 0)。 } 基于 Android手机系统的 3D桌面主题开发 17页 不失去纹理图的效果,也节省了内存,提高了开发效率。 这种方案在很多情况下无疑是最好的解决办法,要想实现这种纹理粘贴方式,只需要做以下两方面工作: ( 1) 将纹理的 GL_TEXTURE_WRAP_S 与 GL_TEXTURE_WRAP_T 属性值设置为 GL_REPEAT而不是 GL_CLAMP_TO_EDGE。 ( 2) 设置纹理坐标时纹理坐标的取值范围不再是 0~1,而是 0~n, n表示希望纹理重复的次数 ①。 在本论文的工程开发中,就是使用了第三种解决方案,具体代码如代码。 代码 ① 吴亚峰 苏亚光 .Android 3D 游戏开发技术详解与典型案例 [M].北京 :电子工业出版社 .2020:P170– P171 /** 获得纹理图 ID*/ private int initTexture(GL10 gl, Bitmap bitmap) { int textures[] = new int[1]。 (1, textures, 0)。 // 获得未使用的纹理对象名称 int currentTextureId = textures[0]。 (, currentTextureId)。 //创建和使用纹理对象 (, , )。 // 指定放大缩小过滤方法 (, , )。 (, , )。 (, , )。 (, 0, bitmap, 0)。 return currentTextureId。 } 基于 Android手机系统的 3D桌面主题开发 18页 第 3 章 开发模拟 3D 主题样式 说明与概述 图 模拟 3D 主题样式 如图 是模拟 3D 主题样式,模拟 3D 主题样式实现的效果是通过取得前后两个子视图的图像,根据触摸点的 x 坐标,在屏幕上以固定的夹角、不同的视觉方向来绘制两幅图像,从而模拟真 实世界的 3D 效果。 因此, 实现上述效果的主要难点在于:如何在同一屏幕中绘制这两幅图像。 解决方案 在绘制图像之前,必须获取图像,目前要获取的图像是 Workspace每个子视图的 Bitmap图像。 首先,由于 Workspace 中每个子视图都有可能不同,而且随时可能发生变化(如:用户在子视图中增加了图标等),因此必须计算出要获取的是 Workspace 中的哪个子视图图像,然后获取特定子视图图像。 代码 Workspace 获取其下特定的子视图图像。 基于 Android手机系统的 3D桌面主题开发 19页 代码 然后,调用 Workspace 的 invalidate()方法,触发其重绘屏幕。 即触发其调用dispatchDraw(Canvas)方法 ①。 当方法 dispatchDraw(Canvas)检测到当前的触摸状态为SCROLLING 时,就立即调用自定义方法 startRotate(Canvas, float)。 此方法定义了如何在屏幕上绘制 固定的夹角、不同的视觉方向的两幅图像。 主要代码为代码。 ① Workspace 的 dispatchDraw(Canvas)方法继承自 ViewGroup,负责 ViewGroup 的重绘 private void calculateRotate() { „„ 省略部分代码 /** * 依据第一次手势移动的方向,判断转屏时需绘制的两个图像( View)即屏幕。 */ if (!isGetPage) { if (mdirection == DIR_RIGHT) { page1 = (currentScreen + screenCount 1) % screenCount。 page2 = currentScreen。 } if (mdirection == DIR_LEFT) { page1 = currentScreen。 page2 = (currentScreen + 1) % screenCount。 } isGetPage = true。 } /** 转屏期间,一次获得图像便可 以 */ if (!isGetBitmap) { isGetBitmap = true。 wallpaperDrawable = () .getFastDrawable()。 (page1).setBackgroundDrawable(wallpaperDrawable)。 (page2).setBackgroundDrawable(wallpaperDrawable)。 /*** 获得 workspace下的相应直接子 View图像,即屏幕截图 */ (page1).buildDrawingCache()。 bitmaps[0] = (page1).getDrawingCache()。 (page2).buildDrawingCache()。 bitmaps[1] = (page2).getDrawingCache()。 } „„ 省略部分代码 } 基于 Android手机系统的 3D桌面主题开发 20页 代码 其中, doDraw()方 法包含了模拟 3D效果的核心代码,它定义了如何利用矩阵来修改图像的大小、方向等。 mMatrix 是类中定义的矩阵对象,它能对多边形进行各种的变形。 在上述代码中, mMatrix 把图像看做一个矩形,源矩形四个点的二维坐标存储在 src浮点型数组中,而目标矩形四个点的二维坐标存储在 dst 浮点型数组中, mMatrix 依据源矩形和目标矩形的变化规则,在屏幕中源图像就被绘制成目标图像(即方向、大小等都改变后的图像)。 优化方案 由于模拟 3D效果需要对图像进行处理,而 cpu 进行图像处理时耗时较多,占用资源也较多。 因此 ,需要对此部分代码逻辑进行相应的优化。 在整个转屏阶段,只涉及 Workspace 中的两个特定子视图而已。 因此,没必要在每次转屏前都获取 Workspace 中所有子视图的图像。 所以,在获取子视图图像时,定义了一个布尔类型的标识量 isGetBitmap,用于判断是否已经获取了图像,如已获取,则不再获取/** * 转屏时,绘制模拟 3d图形 .绘制两个有一定角度的屏幕 */ private void startRotate(Canvas canvas, float x) { „„ 省略部分代码 doDraw(canvas, bitmaps[0],new float[] { 0, 0, width, 0, width, height, 0, height }, new float[] { 0, height * (1 / value), x, 0, x, height, 0, height * (6 / + value) })。 doDraw(canvas, bitmaps[1], new float[] { 0, 0, width, 0, width, height, 0, height }, new float[] { x, 0, width, height * (1 / + value), width, height * (63 / value), x, height })。 „„ 省略部分代码 } private void doDraw(Canvas canvas, Bitmap bp, float src[], float dst[]) { ()。 (src, 0, dst, 0, 1)。 (mMatrix)。 (bp, 0, 0, null)。 ()。 } 基于 Android手机系统的 3D桌面主题开发 21页 图像。 因此,即使每次转屏 calculateRotate()方法 会被多次调用,但只一次性获取了两幅图像,之后不再获取,减少了 cpu的计算量和内存的占用量。 基于 Android手机系统的 3D桌面主题开发 22页 第 4 章 开发 Opengl ES 3D 主题样式 说明 与概述 图 Opengl ES 3D 主题样式 图 Opengl ES 3D 主题样式 基于 Android手机系统的 3D桌面主题开发 23页 图 Opengl ES 3D 主题样式 如上三图是 Open。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。