首页 理论教育 Android游戏开发:实现摄像机和雾特效效果

Android游戏开发:实现摄像机和雾特效效果

时间:2023-10-22 理论教育 版权反馈
【摘要】:摄像机和雾特效是三维世界中的常见效果,使用OpenGL ES也可以实现摄像机和雾特效的功能。在自然界中,雾是用来描述自然界中的大气现象的。在雾特效中还可以控制雾的浓度,它决定了物体随着距离的增加而融入雾颜色的速度。■定义方法onSurfaceCreate(),实现不同场景的光照、材质和雾化效果。此时整个实例的主要代码介绍完毕,执行后将显示一个用摄像机和雾特效实现的场景,如图5-10所示。

Android游戏开发:实现摄像机和雾特效效果

摄像机和雾特效是三维世界中的常见效果,使用OpenGL ES也可以实现摄像机和雾特效的功能。

1.摄像机

摄像机是指将三维空间中的场景呈现在二维显示屏幕上,在3D游戏中,玩家所看到的场景就是玩家通过摄像机观察到的游戏场景。摄像机在三维世界中至关重要,如果没有正确的设置,摄像机将会在屏幕上呈现错误的场景,甚至会出现黑屏。

在没有摄像机的情况下,摄像机的默认位置是在原点(屏幕中心处),方向沿Z轴负方向沿屏幕向里)。但在很多实际应用中都需要根据程序运行情况来修改摄像机的位置、朝向和Up方向。这三个概念的具体说明如下。

■ 摄像机的位置:是摄像机的X、Y、Z轴坐标,也就是观察者眼睛的位置。在默认情

况下,摄像机的位置是坐标原点。

■ 摄像机的朝向:是观察者眼球目光的方向。在默认情况下,摄像机的朝向为沿Z轴负

方向。

■ 摄像机的Up方向:是观察者头顶法线的指向。在默认情况下,摄像机的Up方向为

沿Y轴正方向。

上述摄像机的位置、朝向、Up方向可以有多种组合,例如同样的位置可以有不同的朝向Up方向,这与现实世界中人观察世界的情况非常相似。

为了获得场景中的某个想要的视图,我们开发人员可以把摄像机从默认位置移动,并让其指向特定的方向。在OpenGL ES系统中,可以使用类GLU中的方法gluLookAt()来设置摄像机,此方法有10个参数,使用此方法的语法格式如下。

978-7-111-54543-9-Part02-224.jpg

各个参数的具体说明如下。

■ arg0:表示画笔

■ argl~arg3:依次表示摄像机位置的X、Y、Z坐标。

■ arg4~arg6:依次表示摄像机朝向上某一指定点(在下面称之为目标点)的X、Y、Z

坐标,该指定点由开发人员自定。

■ arg7~arg9:依次表示Up方向向量的X、Y、Z分量。

2.雾特效

雾特效是指使远处的物体看上去逐渐变得模糊。在自然界中,雾是用来描述自然界中的大气现象的。在三维世界中,“雾”用来描述一些类似的大气效果。雾可以用于模拟模糊、薄雾、烟或者污染。雾在其本质上是一种视觉模拟应用,用于模拟具有有限可视性的场合。

在三维世界中,有时候由于过于清晰和锐利,整个场景反而显得不太逼真。我们可以用抗锯齿处理使物体的边缘显得更为平滑,这样便增加了逼真感。另外,还可以通过添加雾特效,使三维世界变得更加逼真。在很多情况下,计算机图像的轮廓会过于鲜明,显得不够真实。在开发3D应用时,可以加入雾效果将物体融入到背景中,这样使整个图像显得更为自然

当开启雾特效之后,距离摄像机较远的物体开始融入到雾的颜色中。在雾特效中还可以控制雾的浓度,它决定了物体随着距离的增加而融入雾颜色的速度。由于雾是在执行了矩阵变换、光照和纹理之后才应用的,因此它对经过变换、带光照和经过纹理贴图的物体产生影响。雾可以提高性能,因为它可以选择不绘制那些因为雾的影响而不可见的物体。雾的应用广泛,可以应用于所有类型的几何图元(包括点和直线)。

在下面的实例中,演示了在Android屏幕中实现雾特效和摄像机效果的方法。

978-7-111-54543-9-Part02-225.jpg

本实例的实现流程如下所示。

1)编写文件jinzita.java实现一个金字塔场景的绘制类,此文件的具体实现流程如下

■ 声明数据缓冲用于导入顶点坐标数据和纹理坐标数据。

■ 设定四面体顶点坐标数据来构造四面体。

■ 分别设定四面体各个顶点对应的着色数据。

■ 设定四面体各个顶点对应的纹理坐标数据。

文件jinzita.java的主要代码如下。

978-7-111-54543-9-Part02-226.jpg

978-7-111-54543-9-Part02-227.jpg

978-7-111-54543-9-Part02-228.jpg(www.xing528.com)

978-7-111-54543-9-Part02-229.jpg

(2)编写实例文件ddd.java,在此文件中定义了一个名为ddd的类,主要功能是在场景中实现太阳的东升西落的效果。文件ddd.java的具体实现流程如下。

■ 定义类SceneRenderer,通过线程Thread()实现旋转阳光效果,对应代码如下。

978-7-111-54543-9-Part02-230.jpg

978-7-111-54543-9-Part02-231.jpg

■ 定义方法onDrawFrame(),设定光源后分别实现金字塔、沙漠和星空场景。对应代码

如下。

978-7-111-54543-9-Part02-232.jpg

978-7-111-54543-9-Part02-233.jpg

■定义方法onSurfaceChanged(),当窗口的大小发生改变时调用onSurfaceChanged()方法。

无论窗口的大小是否已经改变,在程序开始时至少运行一次,所以在该方法中需要设

置OpenGL场景的大小。对应代码如下。

978-7-111-54543-9-Part02-234.jpg

■定义方法onSurfaceCreate(),实现不同场景的光照、材质和雾化效果。对应代码如下

978-7-111-54543-9-Part02-235.jpg

978-7-111-54543-9-Part02-236.jpg

978-7-111-54543-9-Part02-237.jpg

■定义方法dx(),实现太阳东升西落的效果,对应代码如下

978-7-111-54543-9-Part02-238.jpg

■定义方法initFog()来初始化雾效果,分别设置雾的颜色、浓度、开始距离和结束距离

等参数,对应代码如下。

978-7-111-54543-9-Part02-239.jpg

978-7-111-54543-9-Part02-240.jpg

(3)编写实例文件xingkong.java,在此定义一个表示星空天球的类xingkong。此文的实现原理是在地球的外围包裹上一个半径远大于地球,并且在其上面绘制有不同大小的白色点的球来作为星空天球,并用线程控制该天球逆时针缓慢地旋转,这样做的目的是在场景中观察到比较真实的效果。文件xingkong.java的主要代码如下。

978-7-111-54543-9-Part02-241.jpg

978-7-111-54543-9-Part02-242.jpg

978-7-111-54543-9-Part02-243.jpg

(4)编写实例文件shamo.java,在此定义一个表示沙漠的类shamo,其实现原理和实现金字塔的基本类似。主要实现代码如下。

978-7-111-54543-9-Part02-244.jpg

978-7-111-54543-9-Part02-245.jpg

978-7-111-54543-9-Part02-246.jpg

此时整个实例的主要代码介绍完毕,执行后将显示一个用摄像机和雾特效实现的场景,如图5-10所示。

978-7-111-54543-9-Part02-247.jpg

图5-10 执行效果

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈