三维图形程序设计内容讲解

一、在屏幕中心绘制雪花
原理:先用drawsnow函数画出雪花的一个单元的一半,在经过六次旋转和镜像对称处理,画出完整的雪花图形。采用的图元是:GL_TRIANGLE_FAN,这个图元可以用于后面实验的色彩填充,glScalef(1.0, 1.0, 1.0);用控制雪花的大小,用glTranslatef(0,0,0)控制雪花的位置,glRotatef控制雪花一个单元的旋转从而绘制出完整的雪花。
二、在屏幕的多个随机位置绘制雪花
原理:这个主要使用glTranslatef函数,首先初始化一个times变量,当times为0时,初始化p,p1,p2数组,这三个数组为雪花X,Y,Z坐标的值,用srand(time(NULL))实现真正的随机,最后在程序中将雪花的位置设置为glTranslatef(p[],p1[],p2[]),则可实现雪花的随机绘制
三、使每个雪花绕自己的中心旋转
原理:主要使用glutMainLoop(); glutIdleFunc(&myIdle);和glRotatef函数,将每次旋转的值设为r,在myIdle函数里,每次讲r的值加一,避免溢出当r大于1000时归零,然后将原来的glRotatef函数更改为:glRotatef(60 * i + r * 0.1, 0.0, 0.0, 1.0);
四、使每朵雪花下降
原理:这里使用的是glTranslatef函数,同样我们设置一个变量TIME,在myIdle中每次加一,当大于12000时归零,同时将原来的glTranslatef改为glTranslatef(p[j], p1[j] - TIME * 0.01, p2[j]);
五、翻页键控制相机视野
原理:用到gluPerspective函数,这个函数的第一个参数的大小控制相机的视野。SpecialKeys实现按键功能,GLUT_KEY_UP表示上键,GLUT_KEY_DOWN下键。设置变量angle,在SpecialKeys函数中每次加减10,使变化更大一些,通过glutSpecialFunc(SpecialKeys)函数调用;再通过glutMainLoop函数实现变化。
六、键盘按键退出绘制
原理:NormalKeys函数,当传入参数的值为27时执行exit(0);退出程序,通过glutKeyboardFunc函数调用,当按下Esc时退出。
七、旋转运动的相机
原理:gluLookAt函数,前三个值表示为相机的位置,通过调整前三个值可以实现相机的旋转,设置参数a5,类型为double,因为我们不需要变化太大,每次增加0.005,这些写在myIdle函数,实现每次刷新时改变a5的值。将原来的gluLookAt改为gluLookAt(5 * sin(a5), 0.0, 5 * cos(a5), 0, 0, 0, 0, 1, 0);
八、窗口缩放时保持场景物体不变形
原理:通过Reshape函数实现,glViewport获取改变后的窗口大小,glMatrixMode函数重新计算矩阵的大小,通过glLoadIdentity将当前矩阵设为单位矩阵,打印在屏幕上。
九、隐藏面消除
原理:主要利用深度缓冲,首先将glutInitDisplayMode (GLUT_SINGLE|GLUT_RGB) 改为glutInitDisplayMode (GLUT_SINGLE|GLUT_RGB| GLUT_DEPTH),glClear(GL_DEPTH_BUFFER_ BIT)将所有像素的深度值设置为最大可能距离,glEnable(GL_DEPTH_TEST) 在 绘制每个像素之前,将场景点的深 度和原像素中存储的深度进行比较, 如果当前场景点在原场景点之前, 则像素取当前场景点的颜色值,glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST);
在初始化函数中加上这两个语句,启动深度缓存。把myDraw函数里的glClear(GL_COLOR_BUFFER_BIT)改为glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
十、为雪花设置材质,设置一个点光源聚光灯
原理:
1.聚光灯:light_position表示灯的位置,light_dir表示灯的朝向glLightfv(GL_LIGHT0, GL_POSITION, light_position);调用light_position设置光源位置glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_dir);设置光源朝向glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 10.0);设置光源角度, glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10);设置光源强度, glEnable(GL_LIGHT0);启动光源。
2.雪花材质:ambient数组表示光反射后的颜色,环境光,diffuse数组表示光漫反射后的颜色,漫射光,specular数组表示光镜面反射反射后的颜色,镜面光,EMISSION,为聚光指数。用:glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emission);
为雪花设置四个值。
十一、绕场景旋转的光源
原理:只要将聚光灯绑定在相机上就可以,由上面的实验可以知道相机的位置为:(5 * sin(a5), 0.0, 5 * cos(a5)),聚光灯的位置由light_position设置,我们将原来light_position的值改为light_position[] = { 3 * sin(a5),b1,3 * cos(a5), 1.0 };就可以了。这里同时更改了
坐标y的值,通过按键实现b1的增减,产生:“太阳东升西落”的感觉,按键的前面叙述过,不多说。
十二、在雪花上贴纹理图。用T键开关纹理映射
配置环境:首先将SOIL.lib, SOIL.h复制到主程序所在文件夹,在工程>设置 >Link>Input 中加入SOIL.lib。
实现:在头文件中添加#include<soil.h>,变量声明 GLuint texture ;
读取图像纹理:texture = SOIL_load_OGL_texture( “crate.bmp”, SOIL_LOAD_RGB, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y );
启动纹理映射:glEnable(GL_TEXTURE_2D);
设置图像纹理参数:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
在drawsnow函数中调用图像纹理映射glBindTexture(GL_TEXTURE_2D, TexID[0]);放在Glbegin之前,glTexCoord2f指定绘制纹理区域通常为:(1,0)(0,0)(0,1)(1,1);增加函数processNormalKeys,通过glutKeyboardFunc(processNormalKeys)调用,根据传入参数的值判断,若为奇数,则flag为1,启动纹理,否则关闭纹理。从而实现用T开关微信里。
十三、程序运行时,部分截图:
1,
在这里插入图片描述

2,
在这里插入图片描述3.在这里插入图片描述

4,在这里插入图片描述

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木得感情的野指针

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值