OpenGL的glTranslatef平移变换函数详解
2024-10-15 09:49:50
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
最新文章
- Canvas 实现七彩喷泉
- LDAP的Schema
- strurts2入门
- node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用提高nodejs调试效率
- 标签控制器 &#160;UITabBarController
- css3照片墙+曲线阴影
- linux上ln链接命令详细说明
- C# ZedGraph 控件各属性以及示例
- laravel 重写以及500错误
- hdu 1421
- windows 服务 安装 删除 启动 停止
- spring的依赖注入的最常见的两种方法
- Computer Vision的尴尬---by林达华
- The port Command
- js Function 加不加new 详解
- 【PostgreSQL】PostgreSQL语法
- Spring classPath:用法
- java+testng接口测试入门
- 「luogu2486」[SDOI2011] 染色
- 【vue】清理代码
热门文章
- Android开发:ScrollView嵌套GridView的解决办法
- boost库学习之regex
- drivers/mfd/Mfd-core.c
- 织梦cms PHPcms 帝国cms比较
- Xcode的Architectures和Valid Architectures的区别,
- 01.AFNetworking原理及常用操作
- Cheatsheet: 2013 08.01 ~ 08.13
- Spring注解【非单例】
- (Theano 1)Theano自述文件
- 【Asp.Net使用EasyUI】EasyUI combox实现联动