123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 程序功能
- 模拟场景漫游;可交互光源,雾,物体材料;碰撞检测等
- 编译环境
- Ubuntu 19.04
- Linux 5.0.0-37-generic
- gcc version 8.3.0
- 使用说明
- 需要正确安装OpenGL,freeglut,GLEW,并且动态库在LD_LIBRARY_PATH中
- 需要模型文件在运行路径
- gc_tex.obj
- gc_tex.ppm
- cow.obj
- 编译运行
- 直接编译运行
- g++ main.cc InitShader.cpp -I. -lGL -lGLEW -lglut -o main.out
- ./main.out
- 使用cmake
- ./build_run.sh
- 操作
- w,a,s,d:控制观察者x,y位置(和看的方向等没关系)
- 9,6:控制观察者z位置(升降)
- 8,5:控制看的俯仰
- 1,3:控制观察者的侧看
- f:切换雾开关
- 实现技术
- 地形绘制
- 使用了gc_tex,把坐标缩小到1/50,地形没有颜色,有纹理
- 纹理坐标存在glBuffer里
- 飞行模拟
- 没有设置自动飞行,使用键盘控制位置和观察角度(见使用说明-操作)
- 在host端维护飞机坐标x,y,z以及观察的方向theta,phi,侧看的角度tau
- 在cpu端用lookat和Frustum计算model_view和projection,使用uniform传给gpu
- 物体绘制
- 设置了物体cow,把坐标缩小到1/50,物体没有纹理,没有颜色,
- 物体的纹理坐标都设成一个特殊坐标,
- 在片段着色器中增加判断(区分地形和物体),如果纹理坐标是特殊坐标,则涂特殊的颜色
- 光照
- 光照1:随飞机移动,点光源
- 光照2:在地图中心上方,平行光源
- 顶点法向用cpu预先计算,存在glBuffer里,
- (在每个三角形的顶点法相是相同的,但计算镜面光时的向量对于每个顶点是不同的)
- 光的参数,材料参数写在片段着色器里,
- 假设材料参数对两种光相同,其中地形没有镜面光,牛有较高的镜面光
- 雾
- 使用uniform变量,传输是否有雾(int),及眼睛位置(vec3)到顶点着色器,
- 在顶点着色器里根据距离(的平方)计算雾化参数(使用指数),若没雾直接输出雾化参数1
- 在片段着色器里计算雾化效果,雾的颜色写在片段着色器里
- 模型的数据结构,效率和交互
- 对于顶点,纹理坐标,纹素,颜色的数据上面已经说明
- 对于碰撞检测使用cpu计算,在二维数组[128][256]中存放地形高度z,
- 判断当前位置x,y,z是否陷入地下,z取值上选用最近nearest,
- 如果陷入地下,则恢复原位。对于飞机的实际大小,不做考虑。
- 在x和y方向上,如果飞机飞出地形上空,则也会恢复原位。
- 对于xy方向的碰装,和物体的碰撞,不做考虑。
|