glVertex2f(0.9,0.8);
glColor3f(0.8,0.5,0.2);
glVertex2f(1.0,0.5);
glEnd();
//虚线
glLineWidth(3.0);
glEnable(GL_LINE_STIPPLE);
glLineStipple(2, 0x0F0F);
glBegin(GL_LINES);
glColor3f(0.0,0.0,1.0);
glVertex2f(-0.5f, 1.0f);
glColor3f(1.0,1.0,1.0);
glVertex2f(-0.5f,-1.0f);
glEnd();
//线
glLineWidth(0.5);
glDisable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glColor3f(1.0,0.0,0.0);
glVertex2f(0.5f, 1.0f);
glColor3f(1.0,1.0,1.0);
glVertex2f(1.0f, 0.5f);
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(0, 0);
glutInitWindowSize(600, 600);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
/*GL_POINTS 单个顶点集
GL_LINES 多组双顶点线段
GL_POLYGON 单个简单填充凸多边形
GL_TRAINGLES 多组独立填充三角形
GL_QUADS 多组独立填充四边形
GL_LINE_STRIP 不闭合折线
GL_LINE_LOOP 闭合折线
GL_TRAINGLE_STRIP 线型连续填充三角形串
GL_TRAINGLE_FAN 扇形连续填充三角形串
GL_QUAD_STRIP 连续填充四边形串
*/
6、 修改绘图函数 myDisplay 中的内容,自由发挥并绘制一些简单的三维图形;
7、 调试程序并使得效果最好;
8、 完成实验报告并提交程序源代码。
实验二 OpenGL 三维投影变换
一、实验目的和要求:
1、 进一步熟悉 OpenGL 三维绘图操作;
2、 理解三维物体的平行投影方式和透视投影方式;
3、 了解 OpenGL 的投影变换操作。
二、实验内容:
1、 使用 Visual C++ 6.0 和 OpenGL 进行简单的三维绘图,并设置不同的投影方式。
三、实验步骤:
1、 下载 glut 包,复制 glut32.dll 到 winnt/system32 文件夹下,复制 glut32.lib
到 vc98/lib 文件夹下,复制 glut.h 到 vc98/include/gl 文件夹下;
2、 创建 VC 工程:选择菜单 File 中的 New 选项,弹出一个分页的对话框,选中页
Projects 中的 Win32 Console Application 项,然后填入你自己的 Project name,
如 Test,回车即可。VC 为你创建一个工作区(WorkSpace),你的项目 Test 就放
在这个工作区里;
3、 为项目添加文件:为了使用 OpenGL,我们需要在项目中加入三个相关的 Lib 文件:
glu32.lib、glut32.lib、opengl32.lib,这三个文件位于 VC 安装目录下的 lib 目
录(如 c:\program files\ devstudio\vc\lib)中。选中菜单 Project->Add To
Project->Files 项(或用鼠标右键),把这三个文件加入项目,在 FileView 中会
有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到
Project->Setting->Link-> Object /library Modules 即可。点击工具条中 New
Text File 按钮,新建一个文本文件,存盘为 Test.c 作为你的源程序文件,再把它
加入到项目中,然后就可以开始编程了;
4、 请将下面的程序写入源文件 Test.c;
#include
static int angle = 45; //定义旋转角度
void reshape(GLsizei w,GLsizei h)
{
// 视口变换
glViewport (0,0,w,h); //使用glViewport来定义视口。其中前两个参数定义了视口的
左下脚(0,0表示最左下方)
//后两个参数分别是宽度和高度。
// 投影变换
glMatrixMode (GL_PROJECTION); //OpenGL支持两种类型的投影变换,即透视投
影和正投影。
//投影也是使用矩阵来实现的。如果需要操作投影矩阵,需要以
//GL_PROJECTION为参数调用glMatrixMode函数。
// glLoadIdentity(); //重置模型观察矩阵
// glFrustum (-1.0, 1.0, -1.0, 1.0, 1.0, 10.0);
//使用glFrustum函数可以将当前的可视空间设置为透视投影空间。
//用它之前先要用glMatrixMode()说明当前矩阵方式是投影GL_PROJECTION。
//也可以使用更常用的gluPerspective函数。
//空间可以是“正投影”的(使用glOrtho或gluOrtho2D),
//也可以是“透视投影”的(使用glFrustum或gluPerspective)。
glOrtho (-1.0, 1.0, -1.0, 1.0, -1.0, 6.0);
//正射投影,同glFrustum,六个参数分别为:左右垂直切面坐标,底上水平切面坐
标
//近深度切面和远深度切面的距离,可为负值。
}
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 模型变换
glMatrixMode (GL_MODELVIEW);
glTranslatef(0.0f,0.0f,0.0f); // 物体在三个坐标上的位移值。
glRotatef(angle,0.5f,0.5f,0.0f); // 物体绕(0,0,0)到(x,y,z)的直线以逆时针旋转,参数
angle表示旋转的角度。
glScalef (1.0, 1.0, 1.0); // 三个参数分别是X、Y、Z轴向的比例变换因子。
//金字塔底边
glBegin(GL_QUADS);
glVertex3f(0.5f,-0.5f,0.5f);
glVertex3f(-0.5f,-0.5f,0.5f);
glVertex3f(0.5f,-0.5f,-0.5f);
glVertex3f(-0.5f,-0.5f,-0.5f);
glEnd();
glBegin(GL_TRIANGLES);
// 三角形前侧面
glColor3f(1.0f,0.0f,0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,0.5f,0.0f);
glVertex3f(-0.5f,-0.5f, 0.5f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f( 0.5f,-0.5f, 0.5f);
// 三角形右侧面
glColor3f(0.0f,1.0f,0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f( 0.5f,-0.5f, 0.5f);
glColor3f(0.0f,0.5f,0.0f);
glVertex3f( 0.5f,-0.5f, -0.5f);
// 三角形后侧面
glColor3f(0.0f,0.0f,0.1f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,0.5f,0.0f);
glVertex3f( 0.5f,-0.5f, -0.5f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f(-0.5f,-0.5f, -0.5f);
// 三角形左侧面
glColor3f(1.0f,1.0f,1.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glColor3f(0.0f,0.0f,0.5f);
glVertex3f(-0.5f,-0.5f,-0.5f);
glColor3f(0.0f,0.5f,0.0f);
glVertex3f(-0.5f,-0.5f, 0.5f);
glEnd();
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(0,0);
glutInitWindowSize(500,500);
glutCreateWindow("OpenGL3D坐标转换");
glutReshapeFunc(reshape);
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
5、 修改投影方式,观察不同的投影变换效果,适当修改绘图函数 myDisplay 中的内容,
自由发挥并绘制三维图形;
6、 完成实验报告并提交程序源代码。