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( ...
随机推荐
- 递推,动态规划(DP),字符串处理,最佳加法表达式
看了一些资料,竟然发现连百度文库也有错误的地方,在这里吐槽一下题目大意:http://wenku.baidu.com/link?url=DrUNNm19IqpPNZjKPX4Jg6shJiK_Nho6 ...
- Java 期末复习提纲
Java 开发环境 Java 的特点 面向对象.跨平台.能把中小型程序写成大型程序 开发 Java 的流程 设计类 写代码 重构 Java 程序规范 Javadoc 风格注释 接口以 able 结尾 ...
- 北邀 E Elegant String
E. Elegant String Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer ...
- 解决保存快照失败后redis无法写入的问题
用命令行工具连上后执行“set test 0”出现以下错误提示: MISCONF Redis is configured to save RDB snapshots, but is currently ...
- 2016 ACM/ICPC Asia Regional Qingdao Online HDU5879
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5879 解法:我们知道到某个极限之后结果相同,所以找到那个极限,其他保存之后输出就好了 #include&l ...
- 【Web】写个HTML页面去调试HTTP接口方便些
现在越来越多的系统基本SOA的思想,业务由许多小系统通过远程调用的方式串连起来,其中HTTP的接口在远程调用的方式中颇为常见.看过一些开发人员写完一些接口后,要么按照正常情况调用几次就交给调用方,要么 ...
- 【leetcode❤python】107. Binary Tree Level Order Traversal II
#-*- coding: UTF-8 -*- # Definition for a binary tree node.# class TreeNode(object):# def __init ...
- extern "C" __declspec(dllexport) __declspec(dllimport) 和 def
原文:extern "C" __declspec(dllexport) __declspec(dllimport) 和 def 前面的extern "C" _ ...
- Quartz:ERROR threw an unhandled Exception
详细的错误信息如下: -- ::] ERROR org.quartz.core.JobRunShell: - Job group1.job1 threw an unhandled Exception: ...
- 命令行运行R语言脚本(代码)
1 Windows: 键入 cd C:\Program Files\R\R-3.2.0\bin 工作目录切换到R的核心程序目录 键入 R BATCH F:\Test.R 或 Rscript F:\ ...