基于C++OpenGL实现的小桌茶壶图形绘制
实验目的和要求
在模型变换实验的基础上,通过实现下述实验内容,掌握OpenGL中三维观察、透视投影、正交投影的参数设置,并能使用键盘移动观察相机,在透视投影和正交投影间切换,验证课程中三维观察的内容;
进一步加深对OpenGL三维坐标和矩阵变换的理解和应用。
实验内容和原理
使用Visual Studio C++编译已有项目工程,并修改代码生成以下图形:
添加键盘对茶壶的控制,主要是茶壶沿着桌面的平移操作(如下图中绿色和蓝色标示)和茶壶绕自身轴(如下图中红色标示)的旋转操作;按键为:l, j, I, k, e。具体对应关系可查看参考答案中的操作指南。
主要仪器设备
Visual Studio C++
glut.zip
Ex3-vs2010 工程
操作方法和实验步骤
键盘操作:视角的设置与桌子的平移
首先先在updateView()函数中设置在‘P’操作后转换为透视投影的部分:采用gluPerspective()函数:
借用这个定义和参数的意义,修改此处的代码:
下面修改key()函数中对于各个按键的操作,首先先实现视角的移动,关于茶壶的移动放在一边稍后再修改:
此处借助了提示中给出的数组eye[]和center[]参数,结合后面出现的gluLookAt()函数,可以确定下来每一个参数对应的变化:
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); 该函数定义一个视图矩阵,并与当前矩阵相乘。第一组eyex, eyey,eyez 表示相机在世界坐标的位置;第二组centerx,centery,centerz表示相机镜头对准的物体在世界坐标的位置;第三组upx,upy,upz 表示相机向上的方向在世界坐标中的方向。所以在桌子平移操作的过程中,只需要调整对应的eye值(相机世界坐标)以及center值(物体世界坐标)即可。
键盘操作:茶壶的坐标设定与茶壶的运动
基本上确定好了桌子整体的运动操作,我们来关注茶壶的位置固定与运动操作。首先根据提示,我们要在全局变量中设定好一些茶壶位置相关的变量以及判断状态的布尔量:
teapot数组来存放位置,tAnim仿照bAnim,是控制转动与否的判断值。fRotateT仿照fRotate,是控制茶壶旋转的参数。
为了让茶壶和桌子可以分离运动,在绘制的过程中(即在Draw_Scene()函数里),需要对做出相应的调整与修改:将平移设定为相对的,新设定茶壶的glRotatef函数。
然后到key()函数中补全有关茶壶运动的操作:
最后,在redraw()函数中补全有关茶壶的旋转控制:
实验数据记录和处理
关于数据的选取,我基本上都是先瞎设置一个差不多的值,然后跑起来打眼看一看。看完了觉得哪里不对劲的再调整数据直到看起来差不多为之。比如控制茶壶不要移出桌面的部分,就是通过估计的方法来看的。这么做的原因是懒得看具体的桌子长度参数,于是猜一下。再比如茶壶放置的相对位置,是根据原工程中的数据改变的。
实验结果与分析
正投影,只能上下左右移动,无法前后。原因后面会分析。
透视投影,旋转调整后的某一个位置。
透视投影,线框模式,茶壶单独旋转到某一个位置。
茶壶的平移
讨论、心得
整体函数调用步骤(main函数的安排)
初始化显示模式——初始化窗口大小——绘图——自适应屏幕窗口函数——键盘回调函数——全局回调函数——事件处理循环
在正交投影下前后平移没有效果的原因探讨
正交投影的效果可以理解为三视图的主视图(正面),我们结合下图回顾工程中的编写:
在沿z方向的平移时,从正交视点里是看不出来的。
资源下载地址:https://download.csdn.net/download/sheziqiong/85628081
资源下载地址:https://download.csdn.net/download/sheziqiong/85628081
shejizuopin: 文末可加
2301_80656038: 你好,请问有语音识别分类垃圾桶的代码事例吗
xiang098: 兄弟提供参考一下吗?390945099@qq.com
seven的便签: 5个人的,与文本有关的,说话人识别好做吗,一般用哪些模型做
普通网友: 阅读这篇博文真是一次愉快的体验!作者的文字真是动人心弦,语言精准而生动。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】