经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 软件/图像 » OpenGL » 查看文章
OpenGL实例:几何变换
来源:cnblogs  作者:凯鲁嘎吉  时间:2019/4/12 8:57:49  对本文有异议

OpenGL实例:几何变换

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

更多请查看:计算机图形学

1. 平移

  1. #include <GL/glut.h>
  2. void init(void)
  3. {
  4. glClearColor(1.0, 1.0, 1.0, 0.0); //指定清除颜色
  5. //初始化视景体
  6. glMatrixMode(GL_PROJECTION);
  7. gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
  8. glMatrixMode(GL_MODELVIEW);
  9. }
  10. //绘制中心在原点,边长为2的正方形
  11. void drawSquare(void)
  12. {
  13. glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
  14. glVertex2f(-1.0f, -1.0f);//左下点
  15. glVertex2f(1.0f, -1.0f);//右下点
  16. glVertex2f(1.0f, 1.0f);//右上点
  17. glVertex2f(-1.0f, 1.0f);//左上点
  18. glEnd();
  19. }
  20. void myDraw1(void)
  21. {
  22. glClear(GL_COLOR_BUFFER_BIT); //清空
  23. glLoadIdentity(); //将当前矩阵设为单位矩阵
  24. glColor3f(1.0, 0.0, 0.0);
  25. drawSquare(); //在原点处绘制边长为2红色正方形
  26. glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
  27. glColor3f(0.0, 1.0, 0.0);
  28. drawSquare(); //绘制边长为2绿色正方形
  29. glTranslatef(0.0, -3.0, 0.0); //再向下移动3单位
  30. glColor3f(0.0, 0.0, 1.0);
  31. drawSquare(); //绘制边长为2蓝色正方形
  32. glFlush();
  33. }
  34. void myDraw2(void)
  35. {
  36. glClear(GL_COLOR_BUFFER_BIT); //清空
  37. glLoadIdentity(); //将当前矩阵设为单位矩阵
  38. glColor3f(1.0, 0.0, 0.0);
  39. drawSquare(); //在原点处绘制边长为2红色正方形
  40. glPushMatrix();
  41. glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
  42. glColor3f(0.0, 1.0, 0.0);
  43. drawSquare(); //绘制边长为2绿色正方形
  44. glPopMatrix();
  45. glTranslatef(2.0, 0.0, 0.0); //再向右移动2单位
  46. glColor3f(0.0, 0.0, 1.0);
  47. drawSquare(); //绘制边长为2蓝色正方形
  48. glFlush();
  49. }
  50. void main(int argc, char** argv)
  51. {
  52. glutInit(&argc, argv);
  53. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  54. glutInitWindowPosition(0, 0);
  55. glutInitWindowSize(600, 600);
  56. glutCreateWindow("Translate函数示例");
  57. init();
  58. glutDisplayFunc(myDraw1);
  59. glutMainLoop();
  60. }

图形:

2. 旋转

  1. #include <GL/glut.h>
  2. void init(void)
  3. {
  4. glClearColor(1.0, 1.0, 1.0, 0.0);
  5. glMatrixMode(GL_PROJECTION);
  6. gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
  7. glMatrixMode(GL_MODELVIEW);
  8. }
  9. void drawSquare(void) //绘制中心在原点,边长为2的正方形
  10. {
  11. glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
  12. glVertex2f(-1.0f, -1.0f);//左下点
  13. glVertex2f(1.0f, -1.0f);//右下点
  14. glVertex2f(1.0f, 1.0f);//右上
  15. glVertex2f(-1.0f, 1.0f);//左上点
  16. glEnd();
  17. }
  18. void myDraw1(void)
  19. {
  20. glClear(GL_COLOR_BUFFER_BIT); //清空
  21. glLoadIdentity(); //将当前矩阵设为单位矩阵
  22. glColor3f(1.0, 0.0, 0.0);
  23. drawSquare(); //在原点处绘制边长为2红色正方形
  24. glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
  25. glRotatef(30, 0.0, 0.0, 1.0); //顺时针旋转30角度
  26. glColor3f(0.0, 1.0, 0.0);
  27. drawSquare(); //绘制边长为2绿色正方形
  28. glLoadIdentity(); //将当前矩阵设为单位矩阵
  29. glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
  30. glRotatef(-30, 0.0, 0.0, 1.0); //逆时针旋转30角度
  31. glColor3f(0.0, 0.0, 1.0);
  32. drawSquare(); //绘制边长为2蓝色正方形
  33. glFlush();
  34. }
  35. void myDraw2(void)
  36. {
  37. glClear(GL_COLOR_BUFFER_BIT); //清空
  38. glLoadIdentity(); //将当前矩阵设为单位矩阵
  39. glColor3f(1.0, 0.0, 0.0);
  40. drawSquare(); //在原点处绘制边长为2红色正方形
  41. glPushMatrix(); //把当前矩阵压入堆栈
  42. glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
  43. glRotatef(30, 0.0, 0.0, 1.0); //顺时针旋转30角度
  44. glColor3f(0.0, 1.0, 0.0);
  45. drawSquare(); //绘制边长为2绿色正方形
  46. glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵
  47. glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
  48. glRotatef(-30, 0.0, 0.0, 1.0); //逆时针旋转30角度
  49. glColor3f(0.0, 0.0, 1.0);
  50. drawSquare(); //绘制边长为2蓝色正方形
  51. glFlush();
  52. }
  53. void main(int argc, char** argv)
  54. {
  55. glutInit(&argc, argv);
  56. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  57. glutInitWindowPosition(0, 0);
  58. glutInitWindowSize(600, 600);
  59. glutCreateWindow("Rotate函数示例");
  60. init();
  61. glutDisplayFunc(myDraw1);
  62. glutMainLoop();
  63. }

图形:

3. 缩放

  1. #include <GL/glut.h>
  2. void init(void)
  3. {
  4. glClearColor(1.0, 1.0, 1.0, 0.0);
  5. glMatrixMode(GL_PROJECTION);
  6. gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
  7. glMatrixMode(GL_MODELVIEW);
  8. }
  9. void drawSquare(void) //绘制中心在原点,边长为2的正方形
  10. {
  11. glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
  12. glVertex2f(-1.0f, -1.0f);//左下点
  13. glVertex2f(1.0f, -1.0f);//右下点
  14. glVertex2f(1.0f, 1.0f);//右上点
  15. glVertex2f(-1.0f, 1.0f);//左上点
  16. glEnd();
  17. }
  18. void myDraw1(void)
  19. {
  20. glClear(GL_COLOR_BUFFER_BIT); //清空
  21. glLoadIdentity(); //将当前矩阵设为单位矩阵
  22. glColor3f(1.0, 0.0, 0.0);
  23. drawSquare(); //在原点处绘制边长为2红色正方形
  24. glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
  25. glScalef(1.0, 1.5, 1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍
  26. glColor3f(0.0, 1.0, 0.0);
  27. drawSquare(); //绘制边长为2绿色正方形
  28. glLoadIdentity(); //将当前矩阵设为单位矩阵
  29. glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
  30. glScalef(0.5, 1.5, 1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍
  31. glColor3f(0.0, 0.0, 1.0);
  32. drawSquare(); //绘制边长为2蓝色正方形
  33. glFlush();
  34. }
  35. void myDraw2(void)
  36. {
  37. glClear(GL_COLOR_BUFFER_BIT); //清空
  38. glLoadIdentity(); //将当前矩阵设为单位矩阵
  39. glColor3f(1.0, 0.0, 0.0);
  40. drawSquare(); //在原点处绘制边长为2红色正方形
  41. glPushMatrix(); //把当前矩阵压入堆栈
  42. glTranslatef(2.0, 3.0, 0.0); //向右移动2单位,向上移动3单位
  43. glScalef(1.0, 1.5, 1.0); //X和Z方向保持不变,Y方向放大为原来的1.5倍
  44. glColor3f(0.0, 1.0, 0.0);
  45. drawSquare(); //绘制边长为2绿色正方形
  46. glPopMatrix(); //从堆栈栈顶弹出一个矩阵为当前矩阵
  47. glTranslatef(-2.0, -3.0, 0.0); //向左移动2单位,向下移动3单位
  48. glScalef(0.5, 1.5, 1.0); //Z方向保持不变,X方向缩小为原来的0.5倍,Y方向放大为原来的1.5倍
  49. glColor3f(0.0, 0.0, 1.0);
  50. drawSquare(); //绘制边长为2蓝色正方形
  51. glFlush();
  52. }
  53. void main(int argc, char** argv)
  54. {
  55. glutInit(&argc, argv);
  56. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  57. glutInitWindowPosition(0, 0);
  58. glutInitWindowSize(600, 600);
  59. glutCreateWindow("Scale函数示例");
  60. init();
  61. glutDisplayFunc(myDraw1);
  62. glutMainLoop();
  63. }

图形:

 

4. 菱形旋转变换

  1. #include <GL/glut.h>
  2. void init(void)
  3. {
  4. glClearColor(1.0, 1.0, 1.0, 0.0); //指定清除颜色
  5. //初始化视景体
  6. glMatrixMode(GL_PROJECTION);
  7. gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
  8. glMatrixMode(GL_MODELVIEW);
  9. }
  10. //绘制中心在原点的菱形
  11. void drawDiamond(void)
  12. {
  13. glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
  14. glVertex2f(2.0f, -1.0f);//下点
  15. glVertex2f(4.0f, 0.0f);//右点
  16. glVertex2f(2.0f, 1.0f);//上点
  17. glVertex2f(-0.0f, 0.0f);//左点
  18. glEnd();
  19. }
  20. void wrrDraw(void)
  21. {
  22. glClear(GL_COLOR_BUFFER_BIT); //清空
  23. glLoadIdentity(); //将当前菱形设为单位菱形
  24. glRotatef(90, 0.0, 0.0, 1.0); //逆时针旋转90角度
  25. glColor3f(1.0, 0.0, 0.0);
  26. drawDiamond(); //绘制红色菱形
  27. glRotatef(-120, 0.0, 0.0, 1.0); //顺时针旋转120角度
  28. glColor3f(0.0, 0.0, 1.0);
  29. drawDiamond(); //绘制蓝色菱形
  30. glRotatef(-120, 0.0, 0.0, 1.0); //顺时针旋转120角度
  31. glColor3f(0.0, 1.0, 0.0);
  32. drawDiamond(); //绘制绿色菱形
  33. glFlush();
  34. }
  35. void main(int argc, char** argv)
  36. {
  37. glutInit(&argc, argv);
  38. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  39. glutInitWindowPosition(0, 0);
  40. glutInitWindowSize(600, 600);
  41. glutCreateWindow("菱形函数的绘制");
  42. init();
  43. glutDisplayFunc(wrrDraw);
  44. glutMainLoop();
  45. }

图形:

5. 综合实验

  1. #include <GL/glut.h>
  2. void init(void)
  3. {
  4. glClearColor(1.0, 1.0, 1.0, 0.0);
  5. glMatrixMode(GL_PROJECTION);
  6. gluOrtho2D(-5.0, 5.0, -5.0, 5.0); //设置显示的范围是X:-5.0~5.0, Y:-5.0~5.0
  7. glMatrixMode(GL_MODELVIEW);
  8. }
  9. void drawSquare(void) //绘制中心在原点,边长为2的正方形
  10. {
  11. glBegin(GL_POLYGON); //顶点指定需要按逆时针方向
  12. glVertex2f(-1.0f, -1.0f);//左下点
  13. glVertex2f(1.0f, -1.0f);//右下点
  14. glVertex2f(1.0f, 1.0f);//右上点
  15. glVertex2f(-1.0f, 1.0f);//左上点
  16. glEnd();
  17. }
  18. void myDraw(void)
  19. {
  20. glClear(GL_COLOR_BUFFER_BIT); //清空
  21. glLoadIdentity(); //将当前矩阵设为单位矩阵
  22. glPushMatrix();
  23. glTranslatef(0.0f, 2.0f, 0.0f);
  24. glScalef(3.0, 0.5, 1.0);
  25. glColor3f(1.0, 0.0, 0.0);
  26. drawSquare(); //上面红色矩形
  27. glPopMatrix();
  28. glPushMatrix();
  29. glTranslatef(-3.0, 0.0, 0.0);
  30. glPushMatrix();
  31. glRotatef(45.0, 0.0, 0.0, 1.0);
  32. glColor3f(0.0, 1.0, 0.0);
  33. drawSquare(); //中间左菱形
  34. glPopMatrix();
  35. glTranslatef(3.0, 0.0, 0.0);
  36. glPushMatrix();
  37. glRotatef(45.0, 0.0, 0.0, 1.0);
  38. glColor3f(0.0, 0.7, 0.0);
  39. drawSquare(); //中间中菱形
  40. glPopMatrix();
  41. glTranslatef(3.0, 0.0, 0.0);
  42. glPushMatrix();
  43. glRotatef(45.0, 0.0, 0.0, 1.0);
  44. glColor3f(0.0, 0.4, 0.0);
  45. drawSquare(); //中间右菱形
  46. glPopMatrix();
  47. glPopMatrix();
  48. glTranslatef(0.0, -3.0, 0.0);
  49. glScalef(4.0, 1.5, 1.0);
  50. glColor3f(0.0, 0.0, 1.0);
  51. drawSquare(); //下面蓝色矩形
  52. glFlush();
  53. }
  54. void main(int argc, char** argv)
  55. {
  56. glutInit(&argc, argv);
  57. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  58. glutInitWindowPosition(0, 0);
  59. glutInitWindowSize(600, 600);
  60. glutCreateWindow("几何变换函数综合示例");
  61. init();
  62. glutDisplayFunc(myDraw);
  63. glutMainLoop();
  64. }

图形:

 

原文链接:http://www.cnblogs.com/kailugaji/p/10692261.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号