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)向量。

附上简单例子:

  1 #include <stdio.h>
  2 #include <math.h>
  3 #include <Windows.h>
  4 #include <gl/glut.h>
  5
  6 /*
  7  功能描述:使用OpenGL简单画一个方正图形
  8  平移变换函数gluTranslatef
  9  */
 10
 11 //输出模式,0-单缓存模式;非0双缓存模式
 12 #define OUTPUT_MODE 1
 13
 14 //矩阵变换的坐标
 15 float oldx = 0;
 16 float oldy = 0;
 17
 18 //交叉点的坐标
 19 int cx = 0;
 20 int cy = 0;
 21
 22 void display(void)
 23 {
 24     //printf("oldx=%f, oldy=%f\n", oldx, oldy);
 25
 26     //glClearColor函数设置好清除颜色,glClear利用glClearColor函数设置好的当前清除颜色设置窗口颜色
 27     glClearColor(1.0, 1.0, 0.8, 1.0);
 28     glClear(GL_COLOR_BUFFER_BIT);
 29
 30     glLoadIdentity();  //加载单位矩阵
 31     glTranslatef(oldx, oldy, 0);    //将变换矩阵与当前矩阵相乘
 32
 33     glColor3f (1.0, 0.0, 1.0); //画笔梅红色
 34     glBegin(GL_POLYGON);
 35     {
 36         glVertex2f(-0.2, -0.2);
 37         glVertex2f(-0.2, 0.2);
 38         glVertex2f(0.2, 0.2);
 39         glVertex2f(0.2, -0.2);
 40     }
 41     glEnd();
 42
 43     glColor3f (0.0, 0.0, 1.0); //画笔蓝色
 44     //--------画直线START--------
 45     //画直线
 46     glBegin(GL_LINES);
 47     {
 48         glVertex2f(-0.5, 0);
 49         glVertex2f(0.5, 0);
 50         glVertex2f(0, 0.5);
 51         glVertex2f(0, -0.5);
 52     }
 53     glEnd();
 54     //--------画直线E N D--------
 55
 56
 57     if (OUTPUT_MODE == 0) {
 58         glFlush();//单缓存GLUT_SINGLE时使用
 59     } else {
 60         glutSwapBuffers();//因为使用的是双缓存GLUT_DOUBLE,所以这里必须要交换缓存才会显示
 61     }
 62 }
 63
 64 //处理鼠标点击
 65 void Mouse(int button, int state, int x, int y)
 66 {
 67     if(state == GLUT_DOWN) //第一次鼠标按下时,记录鼠标在窗口中的初始坐标
 68     {
 69         //记住鼠标点击后光标坐标
 70         cx = x;
 71         cy = y;
 72         //printf("Mouse: x=%d, y=%d, oldx=%f, oldy=%f\n", x, y, oldx, oldy);
 73     }
 74 }
 75
 76 //处理鼠标拖动
 77 void onMouseMove(int x, int y)
 78 {
 79     //计算拖动后的偏移量,然后进行xy叠加减
 80     oldx += ((x - cx) * 0.01);
 81     oldy -= ((y - cy) * 0.01);
 82     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);
 83     glutPostRedisplay();
 84
 85     //保存好当前拖放后光标坐标点
 86     cx = x;
 87     cy = y;
 88 }
 89
 90 void reshape(int w, int h)
 91 {
 92     int offset = 50;
 93     int dis = (w > h ? h : w) - offset * 2;
 94
 95     //配置显示物体屏幕的大小
 96     glViewport(offset, offset, (GLsizei)dis, (GLsizei)dis);
 97     printf("reshape: w=%d, h=%d, dis=%d\n", w, h, dis);
 98
 99     glMatrixMode(GL_PROJECTION);
100     glLoadIdentity();
101
102     glOrtho(-1.5, 1.5, -1.5, 1.5, 0, 10);
103     //gluOrtho2D(-1.5, 1.5, -1.5, 1.5);
104
105     glMatrixMode(GL_MODELVIEW);
106     glLoadIdentity();
107 }
108
109 int main(int argc, char *argv[])
110 {
111     printf("可通过鼠标拖动控制图形平行移动\n");
112     glutInit(&argc, argv);
113
114     glutInitDisplayMode(GLUT_RGB | (OUTPUT_MODE == 0 ? GLUT_SINGLE : GLUT_DOUBLE));
115     glutInitWindowPosition(100, 100);
116     glutInitWindowSize(400, 400);
117
118     glutCreateWindow("第一个 OpenGL 程序");
119
120     glutDisplayFunc(&display);
121     //glutIdleFunc(display);  //设置不断调用显示函数
122     glutReshapeFunc(reshape);
123     glutMouseFunc(Mouse);
124     glutMotionFunc(onMouseMove);
125     glutMainLoop();
126     return 0;
127 }

最后附上一个写的比我的更有意思的代码:

http://www.cnblogs.com/opengl/archive/2012/11/06/2757854.html

时间: 2024-11-05 13:34:04

OpenGL的glTranslatef平移变换函数详解的相关文章

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

调用glViewPort函数来决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位.当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口. void glViewPort(GLInt x; GLInt y; GLSizei Width; GLSizei Height); 其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度.注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一

android旋转动画和平移动画详解,补充说一下如果制作gif动画放到csdn博客上

先上效果图: 我这里用的是GifCam来制作的gif动画,可以在http://download.csdn.net/detail/baidu_nod/7628461下载, 制作过程是先起一个模拟器,然后把GifCam的框拖到模拟器上面,点击Rec的new先,然后点击Rec,然后就save到本地成gif文件 这里做一个左右旋转,上下旋转,和左右移动的动画,先自己建立一个View的类,作为操作的对象: public class MyView extends View { private Paint m

[转载]详解OpenGL的坐标系、投影和几何变换

详解OpenGL的坐标系.投影和几何变换 转载http://blog.csdn.net/blues1021/article/details/51535398# OPengl的渲染流程是先全部设置好数据和状态,GL_MODELVIEW是将当前要变换的空间向量和模型视图矩阵当前最顶矩阵(会乘以摄像机变换乘投影矩阵的矩阵得最终变换矩阵)关联存储好包括状态设置,提交渲染时候glflush才会提交渲染数据和命令. glPushMatrix()和glPopMatrix()的配对使用目的是方便得到需要变换的最

OpenGL一些函数详解(二)

OpenGL ES顶点数据绘制技巧 在OpenGL中,绘制一个长方体,需要将每个顶点的坐标放在一个数组中.保存坐标时有一些技巧(由于字母下标不好表示,因此将下标表示为单引号,如A1将在后文中表示为A' ): (1)将对立面坐标保存在相邻的位置,如坐标的保存顺序为:前面(A'ABB'),后面(D'DCC'),上面(D'A'B'C'),下面(DABC),左面(D'A'AD),右面(C'B'BC).因为对立面的坐标除了其垂直的那根轴的坐标相反以外,其他坐标值一样:如前面和后面(垂直于z轴),x和y的坐

openGL点精灵PointSprite详解: 纹理映射,旋转,缩放,移动

第一,什么是点精灵 openGL的图形由顶点构成,以后利用顶点进行纹理的映射.点精灵就是,一个顶点被当作一个精灵来处理.特别之处就是,一个顶点也可进行纹理贴出.例如,原来是个顶点构成的一个矩形,现在一个顶点就可以完成了.瞬间我们就可以想想,粒子效果,那些云雾水流火花什么的用了点精灵,就可以瞬间减少3个顶点的计算,glDrawArrays使用GL_POINT就可以了,完全也不需要什么顶点索引了.这是非常诱人的效率. 第二,点精灵的局限 一个顶点缩放都必须是矩形.并且大小的最大最小值是有范围的,每个

【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移.图形旋转.图像反转倒置镜像和图像缩放的知识.同时文章比较详细基础,没有采用GDI+获取矩阵,而是通过读取BMP图片信息头和矩阵像素实现变换,希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生. [数字图像处理]一.MFC详解显示BMP格式图片 [数字图像处理]二.MFC单文档分割窗口显示图片 [数字图像处

NVIDIA Jetson TK1学习与开发(八):图文详解OpenGL在Jetson TK1上的安装和使用

图文详解OpenGL在Jetson TK1上的安装和使用 1.入门介绍与资源推介 OpenGL(全写Open Graphics Library)是个定义了一个跨编程语言.跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库. OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计.该API由Khronos集团定义推广,Khron

【OpenGL】详解第一个OpenGL程序

写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下.搞到最后都不知道自己在干嘛,更有可能因为某一步的顺序错误导致最后渲染出错,又或者觉得记下这些操作的顺序是非常烦人的一件事.那么,OpenGL为什么会长成这个样子呢?这篇文章旨在通过一个最简单的OpenGL程序开始,让我们能够"看懂"它,"记住"这些操作顺序. 我们先来解

# OpenGL常用函数详解(持续更新)

OpenGL常用函数详解(持续更新) 初始化 void glutInit(int* argc,char** argv)初始化GULT库,对应main函数的两个参数 void gultInitWindowSize(int witth,int height)指定GULT窗口产生的窗口的大小 void gultInitWindowsPosition(int x,int y)指定窗口产生的位置,以像素为单位,默认在左上角 void gultInitDisplayMode(unsigned int mod