OpenGL实例:几何变换
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
更多请查看:计算机图形学
1. 平移
- #include <GL/glut.h>
- void init(void)
- {
- glClearColor(1.0, 1.0, 1.0, 0.0); //指定清除颜色
- //初始化视景体
- glMatrixMode(GL_PROJECTION);
- gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
- glMatrixMode(GL_MODELVIEW);
- }
- //绘制中心在原点,边长为2的正方形
- void drawSquare(void)
- {
- glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
- glVertex2f(-1.0f, -1.0f);//左下点
- glVertex2f(1.0f, -1.0f);//右下点
- glVertex2f(1.0f, 1.0f);//右上点
- glVertex2f(-1.0f, 1.0f);//左上点
- glEnd();
- }
- void myDraw1(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //在原点处绘制边长为2红色正方形
- glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //绘制边长为2绿色正方形
- glTranslatef(0.0, -3.0, 0.0); //再向下移动3单位
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //绘制边长为2蓝色正方形
- glFlush();
- }
- void myDraw2(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //在原点处绘制边长为2红色正方形
- glPushMatrix();
- glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //绘制边长为2绿色正方形
- glPopMatrix();
- glTranslatef(2.0, 0.0, 0.0); //再向右移动2单位
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //绘制边长为2蓝色正方形
- glFlush();
- }
- void main(int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(600, 600);
- glutCreateWindow("Translate函数示例");
- init();
- glutDisplayFunc(myDraw1);
- glutMainLoop();
- }
图形:

2. 旋转
- #include <GL/glut.h>
- void init(void)
- {
- glClearColor(1.0, 1.0, 1.0, 0.0);
- glMatrixMode(GL_PROJECTION);
- gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
- glMatrixMode(GL_MODELVIEW);
- }
- void drawSquare(void) //绘制中心在原点,边长为2的正方形
- {
- glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
- glVertex2f(-1.0f, -1.0f);//左下点
- glVertex2f(1.0f, -1.0f);//右下点
- glVertex2f(1.0f, 1.0f);//右上
- glVertex2f(-1.0f, 1.0f);//左上点
- glEnd();
- }
- void myDraw1(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //在原点处绘制边长为2红色正方形
- glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
- glRotatef(30, 0.0, 0.0, 1.0); //顺时针旋转30角度
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //绘制边长为2绿色正方形
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
- glRotatef(-30, 0.0, 0.0, 1.0); //逆时针旋转30角度
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //绘制边长为2蓝色正方形
- glFlush();
- }
- void myDraw2(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //在原点处绘制边长为2红色正方形
- glPushMatrix(); //把当前矩阵压入堆栈
- glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
- glRotatef(30, 0.0, 0.0, 1.0); //顺时针旋转30角度
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //绘制边长为2绿色正方形
- glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵
- glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
- glRotatef(-30, 0.0, 0.0, 1.0); //逆时针旋转30角度
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //绘制边长为2蓝色正方形
- glFlush();
- }
- void main(int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(600, 600);
- glutCreateWindow("Rotate函数示例");
- init();
- glutDisplayFunc(myDraw1);
- glutMainLoop();
- }
图形:

3. 缩放
- #include <GL/glut.h>
- void init(void)
- {
- glClearColor(1.0, 1.0, 1.0, 0.0);
- glMatrixMode(GL_PROJECTION);
- gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
- glMatrixMode(GL_MODELVIEW);
- }
- void drawSquare(void) //绘制中心在原点,边长为2的正方形
- {
- glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
- glVertex2f(-1.0f, -1.0f);//左下点
- glVertex2f(1.0f, -1.0f);//右下点
- glVertex2f(1.0f, 1.0f);//右上点
- glVertex2f(-1.0f, 1.0f);//左上点
- glEnd();
- }
- void myDraw1(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //在原点处绘制边长为2红色正方形
- glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
- glScalef(1.0, 1.5, 1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //绘制边长为2绿色正方形
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
- glScalef(0.5, 1.5, 1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //绘制边长为2蓝色正方形
- glFlush();
- }
- void myDraw2(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //在原点处绘制边长为2红色正方形
- glPushMatrix(); //把当前矩阵压入堆栈
- glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
- glScalef(1.0, 1.5, 1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //绘制边长为2绿色正方形
- glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵
- glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
- glScalef(0.5, 1.5, 1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //绘制边长为2蓝色正方形
- glFlush();
- }
- void main(int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(600, 600);
- glutCreateWindow("Scale函数示例");
- init();
- glutDisplayFunc(myDraw1);
- glutMainLoop();
- }
图形:

4. 菱形旋转变换
- #include <GL/glut.h>
- void init(void)
- {
- glClearColor(1.0, 1.0, 1.0, 0.0); //指定清除颜色
- //初始化视景体
- glMatrixMode(GL_PROJECTION);
- gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
- glMatrixMode(GL_MODELVIEW);
- }
- //绘制中心在原点的菱形
- void drawDiamond(void)
- {
- glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
- glVertex2f(2.0f, -1.0f);//下点
- glVertex2f(4.0f, 0.0f);//右点
- glVertex2f(2.0f, 1.0f);//上点
- glVertex2f(-0.0f, 0.0f);//左点
- glEnd();
- }
- void wrrDraw(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前菱形设为单位菱形
- glRotatef(90, 0.0, 0.0, 1.0); //逆时针旋转90角度
- glColor3f(1.0, 0.0, 0.0);
- drawDiamond(); //绘制红色菱形
- glRotatef(-120, 0.0, 0.0, 1.0); //顺时针旋转120角度
- glColor3f(0.0, 0.0, 1.0);
- drawDiamond(); //绘制蓝色菱形
- glRotatef(-120, 0.0, 0.0, 1.0); //顺时针旋转120角度
- glColor3f(0.0, 1.0, 0.0);
- drawDiamond(); //绘制绿色菱形
- glFlush();
- }
- void main(int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(600, 600);
- glutCreateWindow("菱形函数的绘制");
- init();
- glutDisplayFunc(wrrDraw);
- glutMainLoop();
- }
图形:

5. 综合实验
- #include <GL/glut.h>
- void init(void)
- {
- glClearColor(1.0, 1.0, 1.0, 0.0);
- glMatrixMode(GL_PROJECTION);
- gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
- glMatrixMode(GL_MODELVIEW);
- }
- void drawSquare(void) //绘制中心在原点,边长为2的正方形
- {
- glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
- glVertex2f(-1.0f, -1.0f);//左下点
- glVertex2f(1.0f, -1.0f);//右下点
- glVertex2f(1.0f, 1.0f);//右上点
- glVertex2f(-1.0f, 1.0f);//左上点
- glEnd();
- }
- void myDraw(void)
- {
- glClear(GL_COLOR_BUFFER_BIT); //清空
- glLoadIdentity(); //将当前矩阵设为单位矩阵
- glPushMatrix();
- glTranslatef(0.0f, 2.0f, 0.0f);
- glScalef(3.0, 0.5, 1.0);
- glColor3f(1.0, 0.0, 0.0);
- drawSquare(); //上面红色矩形
- glPopMatrix();
- glPushMatrix();
- glTranslatef(-3.0, 0.0, 0.0);
- glPushMatrix();
- glRotatef(45.0, 0.0, 0.0, 1.0);
- glColor3f(0.0, 1.0, 0.0);
- drawSquare(); //中间左菱形
- glPopMatrix();
- glTranslatef(3.0, 0.0, 0.0);
- glPushMatrix();
- glRotatef(45.0, 0.0, 0.0, 1.0);
- glColor3f(0.0, 0.7, 0.0);
- drawSquare(); //中间中菱形
- glPopMatrix();
- glTranslatef(3.0, 0.0, 0.0);
- glPushMatrix();
- glRotatef(45.0, 0.0, 0.0, 1.0);
- glColor3f(0.0, 0.4, 0.0);
- drawSquare(); //中间右菱形
- glPopMatrix();
- glPopMatrix();
- glTranslatef(0.0, -3.0, 0.0);
- glScalef(4.0, 1.5, 1.0);
- glColor3f(0.0, 0.0, 1.0);
- drawSquare(); //下面蓝色矩形
- glFlush();
- }
- void main(int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(600, 600);
- glutCreateWindow("几何变换函数综合示例");
- init();
- glutDisplayFunc(myDraw);
- glutMainLoop();
- }
图形:
