glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸、压缩、反射的矩阵相乘。这个物体的每个点的x,y,z坐标与对应的xyz参数相乘。

先看函数定义
void glScalef(GLfloat x,
         GLfloat y,
         GLfloat z);

参数x,y,z分别为模型在x,y,z轴方向的缩放比。

例如:
如glScalef(2.0f,3.0f,4.0f);将模型按x,y,z方向分别拉伸了2,3,4倍。
参数也可取负数,也可以理解为先关于某轴翻转180°,再缩放;
如glScalef(1.0f,1.0f,-1.0f);将模型关于z轴翻转了180°(即关于xy轴所在平面对称);
如glScalef(1.0f,1.0f,-2.0f);将模型关于-z轴拉伸2倍。

附上代码例子:

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. #include <gl/glut.h>
  4.  
  5. /*
  6. 功能描述:使用OpenGL简单画一个虚心水壶
  7. 缩放变换函数glScalef
  8. */
  9.  
  10. //输出模式,0-单缓存模式;非0双缓存模式
  11. #define OUTPUT_MODE 1
  12.  
  13. float scale = 0.0;
  14. bool add = true;
  15.  
  16. unsigned char axle = 'x';
  17.  
  18. void init(void)
  19. {
  20. //glClearColor函数设置好清除颜色,glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色
  21. glClearColor(1.0, 1.0, 0.8, 1.0);
  22. }
  23.  
  24. void display(void)
  25. {
  26. printf("scale=%f, axle=%c\n", scale, axle);
  27. glClear(GL_COLOR_BUFFER_BIT);
  28.  
  29. //配置缩放比例大小scale
  30. scale = (add ? scale + 0.1 : scale - 0.1);
  31. if (scale >= 2.0)
  32. {
  33. add = false;
  34. } else if (scale <= 0.0) {
  35. add = true;
  36. }
  37. //开始绘画
  38. glPushMatrix();
  39. {
  40. if (axle == 'x') {
  41. glScalef(scale, , );
  42. } else if (axle == 'y') {
  43. glScalef(, scale, );
  44. } else if (axle == 'z') {
  45. glScalef(, , scale);
  46. } else {
  47. glScalef(scale, scale, scale);
  48. }
  49. glColor3f (1.0, 0.0, 1.0); //画笔梅红色
  50. glBegin(GL_POLYGON);
  51. glVertex2f(-0.2, -0.2);
  52. glVertex2f(-0.2, 0.2);
  53. glVertex2f(0.2, 0.2);
  54. glVertex2f(0.2, -0.2);
  55. glEnd();
  56. }
  57. glPopMatrix();
  58.  
  59. glLoadIdentity(); //加载单位矩阵
  60. glColor3f (0.0, 0.0, 1.0); //画笔蓝色
  61. //--------画直线START--------
  62. //画直线
  63. glBegin(GL_LINES);
  64. glVertex2f(-0.5, );
  65. glVertex2f(0.5, );
  66. glVertex2f(, 0.5);
  67. glVertex2f(, -0.5);
  68. glEnd();
  69. //--------画直线E N D--------
  70.  
  71. if (OUTPUT_MODE == ) {
  72. glFlush();//单缓存GLUT_SINGLE时使用
  73. } else {
  74. glutSwapBuffers();//因为使用的是双缓存GLUT_DOUBLE,所以这里必须要交换缓存才会显示
  75. }
  76.  
  77. Sleep();
  78. }
  79.  
  80. void reshape(int w, int h)
  81. {
  82. int offset = ;
  83. int dis = (w > h ? h : w) - offset * ;
  84.  
  85. //配置显示物体屏幕的大小
  86. glViewport(offset, offset, (GLsizei)dis, (GLsizei)dis);
  87. printf("reshape: w=%d, h=%d, dis=%d\n", w, h, dis);
  88.  
  89. glMatrixMode(GL_PROJECTION);
  90. glLoadIdentity();
  91.  
  92. glOrtho(-1.5, 1.5, -1.5, 1.5, , );
  93. //gluOrtho2D(-1.5, 1.5, -1.5, 1.5);
  94.  
  95. glMatrixMode(GL_MODELVIEW);
  96. glLoadIdentity();
  97. }
  98.  
  99. void keyboard(unsigned char key, int x, int y)
  100. {
  101. switch (key) {
  102. case 'x':
  103. case 'X':
  104. axle = 'x';
  105. glutPostRedisplay();
  106. break;
  107. case 'y':
  108. case 'Y':
  109. axle = 'y';
  110. glutPostRedisplay();
  111. break;
  112. case 'z':
  113. case 'Z':
  114. axle = 'z';
  115. glutPostRedisplay();
  116. break;
  117. case 'a':
  118. case 'A':
  119. axle = 'a';
  120. glutPostRedisplay();
  121. break;
  122. default:
  123. break;
  124. }
  125. printf("按键%c\n", key);
  126. }
  127.  
  128. int main(int argc, char *argv[])
  129. {
  130. printf("可通过按键xyza控制图形按哪一轴缩放\n");
  131. glutInit(&argc, argv);
  132.  
  133. glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == ? GLUT_SINGLE : GLUT_DOUBLE));
  134. glutInitWindowPosition(, );
  135. glutInitWindowSize(, );
  136. glutCreateWindow("第一个 OpenGL 程序");
  137.  
  138. init();
  139. glutDisplayFunc(&display);
  140. glutIdleFunc(display); //设置不断调用显示函数
  141. glutReshapeFunc(reshape);
  142. glutKeyboardFunc(keyboard);
  143. glutMainLoop();
  144. return ;
  145. }

按x轴缩放:

按y轴缩放:

按z轴缩放:

按xyz轴缩放:

OpenGL的glScalef缩放变换函数详解的更多相关文章

  1. OpenGL的glTranslatef平移变换函数详解

    OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先 ...

  2. OpenGL的glRotatef旋转变换函数详解

    OpenGL的glRotatef旋转变换函数详解 先看一下函数定义:void glRotatef(GLfloat angle,  GLfloat x,     GLfloat y,     GLflo ...

  3. OpenGL的gluLookAt观察变换函数详解

    void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,                          GLdouble center ...

  4. OpenGL的glViewport视口变换函数详解[转]

    调用glViewPort函数来决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位.当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口. void glViewPort(G ...

  5. OpenGL的gluPerspective透视投影变换函数详解[转]

    函数原型void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) 首先得设置gluPersp ...

  6. 【转载】D3DXMatrixLookAtLH视图变换函数详解

    原文:D3DXMatrixLookAtLH视图变换函数详解 /*D3DXMatrixLookAtLH函数返回的是世界->视图变换矩阵. 视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的 ...

  7. OpenGL ES: (4) EGL API详解 (转)

    上一节我们初步学习了 OpenGL ES.EGL.GLSL 的相关概念,了解了它们的功能,以及它们之间的关联.我们知道了 EGL 是绘制 API(比如 OpenGL ES)与 底层平台窗口系统之间的接 ...

  8. moviepy音视频剪辑:与大小相关的视频变换函数详解

    ☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...

  9. OpenGL的glOrtho平行投影函数详解[转]

    glortho函数可以将当前的可视空间设置为正投影空间.基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: void glOrtho( ...

随机推荐

  1. 递推,动态规划(DP),字符串处理,最佳加法表达式

    看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...

  2. Java 期末复习提纲

    Java 开发环境 Java 的特点 面向对象.跨平台.能把中小型程序写成大型程序 开发 Java 的流程 设计类 写代码 重构 Java 程序规范 Javadoc 风格注释 接口以 able 结尾 ...

  3. 北邀 E Elegant String

    E. Elegant String Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer ...

  4. 解决保存快照失败后redis无法写入的问题

    用命令行工具连上后执行“set test 0”出现以下错误提示: MISCONF Redis is configured to save RDB snapshots, but is currently ...

  5. 2016 ACM/ICPC Asia Regional Qingdao Online HDU5879

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5879 解法:我们知道到某个极限之后结果相同,所以找到那个极限,其他保存之后输出就好了 #include&l ...

  6. 【Web】写个HTML页面去调试HTTP接口方便些

    现在越来越多的系统基本SOA的思想,业务由许多小系统通过远程调用的方式串连起来,其中HTTP的接口在远程调用的方式中颇为常见.看过一些开发人员写完一些接口后,要么按照正常情况调用几次就交给调用方,要么 ...

  7. 【leetcode❤python】107. Binary Tree Level Order Traversal II

    #-*- coding: UTF-8 -*- # Definition for a binary tree node.# class TreeNode(object):#     def __init ...

  8. extern "C" __declspec(dllexport) __declspec(dllimport) 和 def

    原文:extern "C" __declspec(dllexport) __declspec(dllimport) 和 def 前面的extern "C"  _ ...

  9. Quartz:ERROR threw an unhandled Exception

    详细的错误信息如下: -- ::] ERROR org.quartz.core.JobRunShell: - Job group1.job1 threw an unhandled Exception: ...

  10. 命令行运行R语言脚本(代码)

    1 Windows: 键入 cd C:\Program Files\R\R-3.2.0\bin   工作目录切换到R的核心程序目录 键入 R BATCH F:\Test.R 或 Rscript F:\ ...