Advanced Computer Graphics
coursework exp3

CHEN Yihui 37f4222dab readme 4 tahun lalu
.gitignore b8e0fb8e95 light 4 tahun lalu
Angel.h 80db8450da vex 5 tahun lalu
CMakeLists.txt eacac71baa cmake 5 tahun lalu
InitShader.cpp 80db8450da vex 5 tahun lalu
build_run.sh b8e0fb8e95 light 4 tahun lalu
cow.obj 1a5261d1b2 cow 5 tahun lalu
fshader71.glsl c9d086a021 finish 4 tahun lalu
gc_tex.obj 188c5fb120 init 5 tahun lalu
gc_tex.ppm 188c5fb120 init 5 tahun lalu
main.cc c9d086a021 finish 4 tahun lalu
mat.h 80db8450da vex 5 tahun lalu
readme.txt 37f4222dab readme 4 tahun lalu
vec.h 80db8450da vex 5 tahun lalu
vshader71.glsl c9d086a021 finish 4 tahun lalu

readme.txt

程序功能
模拟场景漫游;可交互光源,雾,物体材料;碰撞检测等
编译环境
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位置(和看的方向等没关系)
q,e:控制看的水平方向
9,6:控制观察者z位置(升降)
8,5:控制看的俯仰
1,3:控制观察者的侧看
f:切换雾开关
G:雾模型距离衰减系数变大(能看见的范围变近)
g:雾模型距离衰减系数变小(可以看见远一点的地方)
l:开关飞机上的灯
k:减小物体(牛)的高光系数
K:增大物体(牛)的高光系数
实现技术
地形绘制
使用了gc_tex,把坐标缩小到1/50,地形没有颜色,有纹理
纹理坐标存在glBuffer里
飞行模拟
没有设置自动飞行,使用键盘控制位置和观察角度(见使用说明-操作)
在host端维护飞机坐标x,y,z以及观察的方向theta,phi,侧看的角度tau
在cpu端用lookat和Frustum计算model_view和projection,使用uniform传给gpu
物体绘制
设置了物体cow,把坐标缩小到1/50,物体没有纹理,没有颜色,
物体的纹理坐标都设成一个特殊坐标,
在片段着色器中增加判断(区分地形和物体),如果纹理坐标是特殊坐标,则涂特殊的颜色
物体材料属性:
光照
光照1:随飞机移动,点光源,使用l键开关
光照2:在地图中心上方,平行光源
顶点法向用cpu预先计算,存在glBuffer里,
光的参数,地形的材料参数写在片段着色器里,
牛的高光系数可以配置,通过kK键调整

使用uniform变量,传输是否有雾(int),及眼睛位置(vec3)到顶点着色器,
在顶点着色器里根据距离(的平方)计算雾化参数(使用指数),若没雾直接输出雾化参数1
在片段着色器里计算雾化效果,雾的颜色固定写在片段着色器里
雾的距离衰减参数可以配置
模型的数据结构,效率和交互
对于顶点,纹理坐标,纹素,颜色的数据上面已经说明
对于碰撞检测使用cpu计算,在二维数组[128][256]中存放地形高度z,
判断当前位置x,y,z是否陷入地下,z取值上选用最近nearest,
如果陷入地下,则恢复原位。对于飞机的实际大小,不做考虑。
在x和y方向上,如果飞机飞出地形上空,则也会恢复原位。
对于xy方向的碰装,和物体的碰撞,不做考虑。