zoukankan      html  css  js  c++  java
  • OpenGL中平移、旋转、缩放矩阵堆栈操作

    在OpenGL中,图元的几何变换均为线性变换,通过矩阵变换实现。OpenGL中的坐标用齐次坐标表示,即(x,y,z)表示成(x',y',z',h),其中x=x'/h; y=y'/h; z=z'/h. 通常h取1. 比如空间中的点(2,3,4),在OpenGL中将表示成(2,3,4,1). 齐次坐标表示方式适合于矩阵运算,也很方便地表示了无穷远的点,比如(1,0,0,0)就表示x轴上无穷远的点,因为1/0是无穷大,这里约定0/0=0.

    例:点(1,1,1)将该向量平移变换(2,3,4)个单位,得到(3,4,5)

    矩阵表示为

    1 0 0 2       1      3

    0 1 0 3   *  1  =  4

    0 0 1 4       1      5

    左边的矩阵为平移变换矩阵,若把2、3、4换成x、y、z,则用它乘以一个齐次坐标表示的向量,就可以将该向量平移(x,y,z)个单位。把平移变换矩阵记为T(x,y,z),旋转变换矩阵记为R(x,y,z,w)。

    例:

    glTranslatef(50.0, 0.0, 0.0)//沿x正方向平移50。

    glRotate3f(90,0.0,0.0,1.0)//沿x轴逆时针旋转90°。

    矩阵表示为T(50,0,0)*R(1,0,0,90)*X.

    OpenGL有个变换矩阵堆栈,先进后出,离X最近的矩阵最先作用。

    void myDisplay(void)
    {
    
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(-500.0, 500.0, -500.0, 500.0);
    
        glClearColor(1.0, 1.0, 1.0, 0.0);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glColor3f(0.0, 0.0, 0.0);
        glBegin(GL_LINES);
        glVertex2f(-500.0, 0.0);
        glVertex2f(500.0, 0.0);
    
        glVertex2f(0.0, -500.0);
        glVertex2f(0.0, 500.0);
        glEnd();
    
        glColor3f(1.0, 0.0, 0.0);
        glRecti(50, 100, 200, 150);//initial rectangle
    
        glColor3f(0.0, 1.0, 0.0);
        glTranslatef(50.0, 50.0, 0.0);//translation
        glRecti(50, 100, 200, 150);
    
        //reset the current modelview matrix
        glLoadIdentity();//     重置当前矩阵为单位阵
        glColor3f(0.0, 0.0, 1.0);
        glRotatef(90.0, 0.0, 0.0, 1.0);//rotation 逆时针
        glRecti(50, 100, 200, 150);
    
        //reset the current modelview matrix
        glLoadIdentity();
        glColor3f(1.0, 1.0, 0.0);
         glTranslatef(-100.0, 0.0, 0.0);//translation
        glScalef(0.5, 1.0, 1.0);//scale   所有x坐标缩小一半
        glRecti(50, 100, 200, 150);
    
        glFlush();
    }

    补充:

    在opengl中,函数glTranslatef的作用就是移动坐标原点。对应的3个参数对应着3个坐标轴。  如果你调用一次glTranslatef(1.0f,0.0f,0.0f)然后画一个小球,接着再调用次glTranslatef(0.0f,1.0f,0.0f)再画一个小球。  此时,两个小球中,一个在另外一个正右方。  所以,如果要使两个小球分别处于x、y轴,则需要在第二次画之前调用glLoadIdentity()函数,使坐标原点归位。

  • 相关阅读:
    老刘 Yii2 源码学习笔记之 Component 类
    zanphp 初探----安装篇
    php SQL 防注入的一些经验
    基于FPGA的CNN算法移植(五)算法优化方向汇总
    基于FPGA的CNN算法移植(四)地平线等公司的 ADAS 产品
    基于FPGA的CNN算法移植(三)软件算法架构分析
    基于FPGA的CNN算法移植(二)硬件架构
    基于FPGA的CNN算法移植(一)概述
    ubuntu下无法启动vivado SDK的解决办法(二)
    HDMI调试经验分享(二)—— 基于zc706的ADV7511的实现
  • 原文地址:https://www.cnblogs.com/SeekHit/p/4861168.html
Copyright © 2011-2022 走看看