OpenGL的glScalef缩放变换函数详解
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倍。
附上代码例子:
#include <stdio.h>
#include <Windows.h>
#include <gl/glut.h> /*
功能描述:使用OpenGL简单画一个虚心水壶
缩放变换函数glScalef
*/ //输出模式,0-单缓存模式;非0双缓存模式
#define OUTPUT_MODE 1 float scale = 0.0;
bool add = true; unsigned char axle = 'x'; void init(void)
{
//glClearColor函数设置好清除颜色,glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色
glClearColor(1.0, 1.0, 0.8, 1.0);
} void display(void)
{
printf("scale=%f, axle=%c\n", scale, axle);
glClear(GL_COLOR_BUFFER_BIT); //配置缩放比例大小scale
scale = (add ? scale + 0.1 : scale - 0.1);
if (scale >= 2.0)
{
add = false;
} else if (scale <= 0.0) {
add = true;
}
//开始绘画
glPushMatrix();
{
if (axle == 'x') {
glScalef(scale, , );
} else if (axle == 'y') {
glScalef(, scale, );
} else if (axle == 'z') {
glScalef(, , scale);
} else {
glScalef(scale, scale, scale);
}
glColor3f (1.0, 0.0, 1.0); //画笔梅红色
glBegin(GL_POLYGON);
glVertex2f(-0.2, -0.2);
glVertex2f(-0.2, 0.2);
glVertex2f(0.2, 0.2);
glVertex2f(0.2, -0.2);
glEnd();
}
glPopMatrix(); glLoadIdentity(); //加载单位矩阵
glColor3f (0.0, 0.0, 1.0); //画笔蓝色
//--------画直线START--------
//画直线
glBegin(GL_LINES);
glVertex2f(-0.5, );
glVertex2f(0.5, );
glVertex2f(, 0.5);
glVertex2f(, -0.5);
glEnd();
//--------画直线E N D-------- if (OUTPUT_MODE == ) {
glFlush();//单缓存GLUT_SINGLE时使用
} else {
glutSwapBuffers();//因为使用的是双缓存GLUT_DOUBLE,所以这里必须要交换缓存才会显示
} Sleep();
} void reshape(int w, int h)
{
int offset = ;
int dis = (w > h ? h : w) - offset * ; //配置显示物体屏幕的大小
glViewport(offset, offset, (GLsizei)dis, (GLsizei)dis);
printf("reshape: w=%d, h=%d, dis=%d\n", w, h, dis); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glOrtho(-1.5, 1.5, -1.5, 1.5, , );
//gluOrtho2D(-1.5, 1.5, -1.5, 1.5); glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'x':
case 'X':
axle = 'x';
glutPostRedisplay();
break;
case 'y':
case 'Y':
axle = 'y';
glutPostRedisplay();
break;
case 'z':
case 'Z':
axle = 'z';
glutPostRedisplay();
break;
case 'a':
case 'A':
axle = 'a';
glutPostRedisplay();
break;
default:
break;
}
printf("按键%c\n", key);
} int main(int argc, char *argv[])
{
printf("可通过按键xyza控制图形按哪一轴缩放\n");
glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == ? GLUT_SINGLE : GLUT_DOUBLE));
glutInitWindowPosition(, );
glutInitWindowSize(, );
glutCreateWindow("第一个 OpenGL 程序"); init();
glutDisplayFunc(&display);
glutIdleFunc(display); //设置不断调用显示函数
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutMainLoop();
return ;
}
按x轴缩放:

按y轴缩放:

按z轴缩放:

按xyz轴缩放:

OpenGL的glScalef缩放变换函数详解的更多相关文章
- OpenGL的glTranslatef平移变换函数详解
OpenGL的glTranslatef平移变换函数详解 glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换. 我们先 ...
- OpenGL的glRotatef旋转变换函数详解
OpenGL的glRotatef旋转变换函数详解 先看一下函数定义:void glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLflo ...
- OpenGL的gluLookAt观察变换函数详解
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble center ...
- OpenGL的glViewport视口变换函数详解[转]
调用glViewPort函数来决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位.当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口. void glViewPort(G ...
- OpenGL的gluPerspective透视投影变换函数详解[转]
函数原型void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar) 首先得设置gluPersp ...
- 【转载】D3DXMatrixLookAtLH视图变换函数详解
原文:D3DXMatrixLookAtLH视图变换函数详解 /*D3DXMatrixLookAtLH函数返回的是世界->视图变换矩阵. 视图坐标系和局部坐标系是一样的,都是世界坐标系转换为指定的 ...
- OpenGL ES: (4) EGL API详解 (转)
上一节我们初步学习了 OpenGL ES.EGL.GLSL 的相关概念,了解了它们的功能,以及它们之间的关联.我们知道了 EGL 是绘制 API(比如 OpenGL ES)与 底层平台窗口系统之间的接 ...
- moviepy音视频剪辑:与大小相关的视频变换函数详解
☞ ░ 前往老猿Python博文目录 ░ 一.引言 在<moviepy音视频剪辑:moviepy中的剪辑基类Clip详解>介绍了剪辑基类的fl.fl_time.fx方法,在<movi ...
- OpenGL的glOrtho平行投影函数详解[转]
glortho函数可以将当前的可视空间设置为正投影空间.基参数的意义如图,如果绘制的图空间本身就是二维的,可以使gluOrtho2D.他的使用类似于glOrtho 原型是: void glOrtho( ...
随机推荐
- selenium + python 添加等待时间
转载于:http://www.blogjava.net/qileilove/articles/412450.html 四.添加等待时间 有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间. 4.1 ...
- Javascript正则表达式笔记
一.字符类 将单独的直接字符放进[]内,就组成了字符类.一个字符类和它所包含的任何字符都匹配. 例如:/[abc]/ 与abc三个字母的任意一个匹配. 同时,还可以定义否定字符类.利用^字符.例如:/ ...
- hdu 1205 从整体考虑
吃糖果 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submiss ...
- 2016年12月14日 星期三 --出埃及记 Exodus 21:9
2016年12月14日 星期三 --出埃及记 Exodus 21:9 If he selects her for his son, he must grant her the rights of a ...
- CentOS6.5下MAC
CentOS6.3安装Mac桌面主题 (2013-03-28 14:31:42) 转载▼ 首先下载Mac4Lin_Install_v1.0.zip 我给出个下载地址ht ...
- MVC 过滤器
- 在Struts2中配置Action
在Struts2中配置Action <package>: 1.定义Action使用<package>标签下的<action>标签完成,一个<package&g ...
- js获取鼠标位置
1.PageX/PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化2.clientX/clientY:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即 ...
- Examples For When-Validate-Item trigger In Oracle Forms
The following example finds the commission plan in the COMMPLAN table, based on the current value of ...
- 统计fastq文件中读段的数量
mycount=`cat SRR108114_new_1.fastq | wc -l` echo 'Number of clean reads, SRR108114_new_1.fastq: '$(( ...