计算机图形学大作业
题目要求
使用openGL实现旋转的正方体。
过程步骤
主要分为搭建环境和完成代码编写两部分。
搭建环境
首先下载并安装Dev C++,我使用的版本是:Dev-Cpp 5.11
自带的编译器版本是:TDM GCC 4.9.2
安装完成后,我们可以创建OpenGL的demo过程如下:
文件 -> 新建 -> 项目 -> Multimedia -> OpenGL
直接编译运行Demo,将会展示一个旋转的三角形如下图所示:
另外如需使用其他OpenGL库,需要自行配置:
将相关.dll文件拷贝到C:\windows\system32目录下
将相关.lib文件拷贝到D:\Program Files\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib32 目录下
将相关.h文件拷贝到D:\Program Files\Dev-Cpp\MinGW64\include\GL目录下
最后在编译选项中添加相应的链接,在Linux下及在Makefile中设置相应的编译选项。
绘制立方体
编写void cube()
函数,函数体中配合使用glBegin()
和glEnd()
,绘制正方体,一共有6个面,每个面需要使用glColor3f()
和glVertex3f()
来进行点的描述及颜色的填充。
void cube(){glBegin(GL_QUADS);glColor3f(1.0,1.0,0.0); glVertex3f( 1.0, 1.0,-1.0); glColor3f(0.0,1.0,0.0); glVertex3f(-1.0, 1.0,-1.0); glColor3f(0.0,1.0,1.0); glVertex3f(-1.0, 1.0, 1.0); glColor3f(1.0,1.0,1.0); glVertex3f( 1.0, 1.0, 1.0); glColor3f(1.0,0.0,1.0); glVertex3f( 1.0,-1.0, 1.0); glColor3f(0.0,0.0,1.0); glVertex3f(-1.0,-1.0, 1.0); glColor3f(0.0,0.0,0.0); glVertex3f(-1.0,-1.0,-1.0); glColor3f(1.0,0.0,0.0); glVertex3f( 1.0,-1.0,-1.0); glColor3f(1.0,1.0,1.0); glVertex3f( 1.0, 1.0, 1.0); glColor3f(0.0,1.0,1.0); glVertex3f(-1.0, 1.0, 1.0); glColor3f(0.0,0.0,1.0); glVertex3f(-1.0,-1.0, 1.0); glColor3f(1.0,0.0,1.0); glVertex3f( 1.0,-1.0, 1.0); glColor3f(1.0,0.0,0.0); glVertex3f( 1.0,-1.0,-1.0); glColor3f(0.0,0.0,0.0); glVertex3f(-1.0,-1.0,-1.0); glColor3f(0.0,1.0,0.0); glVertex3f(-1.0, 1.0,-1.0); glColor3f(1.0,1.0,0.0); glVertex3f( 1.0, 1.0,-1.0); glColor3f(0.0,1.0,1.0); glVertex3f(-1.0, 1.0, 1.0); glColor3f(0.0,1.0,0.0); glVertex3f(-1.0, 1.0,-1.0); glColor3f(0.0,0.0,0.0); glVertex3f(-1.0,-1.0,-1.0); glColor3f(0.0,0.0,1.0); glVertex3f(-1.0,-1.0, 1.0); glColor3f(1.0,1.0,0.0); glVertex3f( 1.0, 1.0,-1.0); glColor3f(1.0,1.0,1.0); glVertex3f( 1.0, 1.0, 1.0); glColor3f(1.0,0.0,1.0); glVertex3f( 1.0,-1.0, 1.0); glColor3f(1.0,0.0,0.0); glVertex3f( 1.0,-1.0,-1.0); glEnd(); }
立方体绕轴旋转
在OpenGL中通过glRotatef()
函数实现转动特定角度,但是要实现旋转,就要不停改变其转动角参数,这里我们通过设置三个静态变量及让其自增的方式来控制立方体的绕三个轴的旋,通过改变增量以控制转动速度。
static float xrot = 0.0; static float yrot = 0.0; static float zrot = 0.0; glRotatef(xrot, 1, 0, 0);glRotatef(yrot, 0, 1, 0);glRotatef(zrot, 0, 0, 1);cube();xrot = xrot + 0.01;yrot = yrot + 0.01;zrot = zrot + 0.01;
立方体沿轴运动
在OpenGL中通过glTranslatef()
函数指定立方体在三维坐标系中的位置。这里我们以z轴为例,让立方体来回运动,其中h用于控制运动速度:
static float z=-5;static float h=-0.001;glTranslatef(0, 0, z);z=z+h;if(z<-10)h=-h;if(z>-5)h=-h;
至此完成立方体简单的旋转与沿轴运动。
问题
计算机中丢失OPENGL.dll
编译通过以后,一直无法执行,困扰了很久,最终找到答案:
主要是编译选项中同时引用了glut.lib和glut32.lib,而且在编译选项中-lglut
在-lglut32
前面,这个时候链接器首先寻找OPENGL.dll而没有寻找opengl32.dll,此时我们进入DEV C++的项目配置里面对其进行修改:
项目->项目属性->参数->链接
-lopengl32
-lglut32 //放在前面
-lglut
-LGLU
-lglu32
最终编译正确,并按照预期结果运行:
心得体会
历时一个星期终于完成计算机图形学这样一个简单的大作业——实现立方体的旋转。
在代码层面上来说,确实很简单,因为涉及的内容不多,并且OpenGL提供了很好的函数封装,网上也有很多的类似的示例。
最麻烦的部分还是环境的搭建,由于OpenGL是一个开源项目,并没有非常权威的手册指南,所以网上的案例也是良莠不齐,学习起来效率很低。
比如说,最开始找到一个项目,用到Glaux
的东西,折腾了半天终于可以编译却发现无法运行,后来网上又有人说Glaux
基本弃用,并且Win7好像并不支持,不得不从头开始。