• 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
    ", 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
    ", 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
    ", 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
    ", 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("可通过鼠标拖动控制图形平行移动
    ");
    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

  • 相关阅读:
    SharedPreferences
    短信发送器的实现
    第四周总结
    本周开发工作时间及内容
    自我总结
    随笔
    结对编程
    目前流行的源程序版本管理软件和项目管理软件都有哪些, 各有什么优缺点?
    八皇后
    数制转换
  • 原文地址:https://www.cnblogs.com/1024Planet/p/5647547.html
Copyright © 2020-2023  润新知