OpenGL的glTranslatef平移变换函数详解
OpenGL的glTranslatef平移变换函数详解
glTranslated()和glTranslatef()这两个函数是定义一个平移矩阵,该矩阵与当前矩阵相乘,使后续的图形进行平移变换。
我们先看定义:
void glTranslated(GLdouble x,
GLdouble y,
GLdouble z);
void glTranslatef(GLdouble x,
GLdouble y,
GLdouble z);
参数说明:
x,y,z:分别指定沿x,y,z轴方向的平移分量。
重点就是沿着x,y,z轴移动。
注意在glTranslatef(x, y, z)中,当您移动的时候,您并不是相对屏幕中心移动,而是相对与当前所在的屏幕位置。
其作用就是将你绘点坐标的原点在当前原点的基础上平移一个(x,y,z)向量。
附上简单例子:
#include <stdio.h>
#include <math.h>
#include <Windows.h>
#include <gl/glut.h> /*
功能描述:使用OpenGL简单画一个方正图形
平移变换函数gluTranslatef
*/ //输出模式,0-单缓存模式;非0双缓存模式
#define OUTPUT_MODE 1 //矩阵变换的坐标
float oldx = ;
float oldy = ; //交叉点的坐标
int cx = ;
int cy = ; void display(void)
{
//printf("oldx=%f, oldy=%f\n", oldx, oldy); //glClearColor函数设置好清除颜色,glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色
glClearColor(1.0, 1.0, 0.8, 1.0);
glClear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); //加载单位矩阵
glTranslatef(oldx, oldy, ); //将变换矩阵与当前矩阵相乘 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(); 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,所以这里必须要交换缓存才会显示
}
} //处理鼠标点击
void Mouse(int button, int state, int x, int y)
{
if(state == GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标
{
//记住鼠标点击后光标坐标
cx = x;
cy = y;
//printf("Mouse: x=%d, y=%d, oldx=%f, oldy=%f\n", x, y, oldx, oldy);
}
} //处理鼠标拖动
void onMouseMove(int x, int y)
{
//计算拖动后的偏移量,然后进行xy叠加减
oldx += ((x - cx) * 0.01);
oldy -= ((y - cy) * 0.01);
printf("Move: x=%d(%d)[%d], y=%d(%d)[%d], oldx=%f, oldy=%f\n", x, cx, x-cx, y, cy, y-cy, oldx, oldy);
glutPostRedisplay(); //保存好当前拖放后光标坐标点
cx = x;
cy = y;
} 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();
} int main(int argc, char *argv[])
{
printf("可通过鼠标拖动控制图形平行移动\n");
glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == ? GLUT_SINGLE : GLUT_DOUBLE));
glutInitWindowPosition(, );
glutInitWindowSize(, ); glutCreateWindow("第一个 OpenGL 程序"); glutDisplayFunc(&display);
//glutIdleFunc(display); //设置不断调用显示函数
glutReshapeFunc(reshape);
glutMouseFunc(Mouse);
glutMotionFunc(onMouseMove);
glutMainLoop();
return ;
}

最后附上一个写的比我的更有意思的代码:
http://www.cnblogs.com/opengl/archive/2012/11/06/2757854.html
OpenGL的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的glScalef缩放变换函数详解
glScalef是openGL中的模型缩放函数,就是把当前矩阵与一个表示延各个轴对物体进行拉伸.压缩.反射的矩阵相乘.这个物体的每个点的x,y,z坐标与对应的xyz参数相乘. 先看函数定义void g ...
- 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( ...
随机推荐
- BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等
将一张图片存储在mysql中,并读取出来(BLOB数据:插入BLOB类型的数据必须使用PreparedStatement,因为插入BLOB类型的数据无法使用字符串拼写): -------------- ...
- 使用Window Live Writer写博客
1.打开“日志账户”—>“日志选项”. 2.点击“更新账户信息”. 3.输入博客地址,用户名和密码,点击“下一步”. 4.耐心等待片刻... 5.设置“日志昵称”,点击“完成”. 这样就大功告成 ...
- JAVA基础知识之网络编程——-TCP/IP协议,socket通信,服务器客户端通信demo
OSI模型分层 OSI模型是指国际标准化组织(ISO)提出的开放系统互连参考模型(Open System Interconnection Reference Model,OSI/RM),它将网络分为七 ...
- 最流行的编程语言JavaScript能做什么?
本文转自互联网! 首先很遗憾的一点是,"PHP虽然是最好的语言",但是它不是最流行的语言. 对不起的还有刚刚在4月TIOBE编程语言排行榜上榜的各个语言: 你们都很棒,但是你们都担 ...
- Windows系统端口占用情况检查脚本
写了一段检查Windows下端口占用情况的脚本,代码如下: function checkPid($result,$port){ $port = $port.split(":")[1 ...
- shell与kernel的理解 转载
Shell 的英文释义是外壳,与 kernel 内核名词遥相呼应,一外一内,一壳一核.内核就像瑞士银行的金库,存放着客户的黄金等众多的(硬件)资产,闲杂人等(包括客户)当然是严格禁止入内的,而作为客户 ...
- MySQL基础(四)——索引
MySQL基础(四)--索引
- BZOJ 3752 世界树
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3572 题意:给出一棵树.若干询问.每个询问给出m个点,输出每个点管辖的点的个数.x ...
- UVA 1252 十五 Twenty Questions
十五 Twenty Questions Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi ...
- window server开发
代码部分: public partial class tv : ServiceBase { public tv() { InitializeComponent(); ServiceName = &qu ...