• OpenGL(四) 左右手坐标系及基本坐标变换



    左手坐标系、右手坐标系、笛卡尔坐标系


    左手坐标系:伸开左手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

    右手坐标系:伸开右手,大拇指指向X轴正方向,食指指向Y轴正方向,其他三个手指指向Z轴正方向。

    左右手坐标系的示意图如下:




    左手和右手坐标注系的区别在于两者Z轴的方向是相反的。

    在高等数学中使用的三维空间是笛卡尔坐标系,如下:




    笛卡尔坐标系其实就是右手坐标系,OpenGL中使用右手坐标注系,Direct3D使用的是左手坐标系。


    左手旋转规则、右手旋转规则


    左右手旋转规则用于判断当前坐标系中物体旋转时正方向的判定。在右手坐标系中,确定旋转轴后,右手握成拳头,拇指指向旋转轴的正方向,其余手指的弯曲方向即为旋转的正方向,跟手指弯曲方向一致的旋转记为正向,相反则为负向。左手坐标注系中判断旋转方向的正负使用左手,其他规则一样。两者的示意图:



    在OpenGL中,对物体的移动、缩放、旋转操作要使用模型变换,有三个模型变换函数:

    • glTranslatef     平移
    • glRotatef         旋转
    • glScalef           缩放

     平移:

    glTranslatef (GLfloat x, GLfloat y, GLfloat z);

    x,y,z分别表示物体在xyz方向上的平移,举例来说,glTransLatef(-5.0f,4.0f,-3.0f)表示物体沿x轴负方向移                 动5,y正方向移动4,z负方向移动3。


    旋转:

    glRotatef (GLfloat angle, GLfloat x, GLfloat y, GLfloat z);

    第一个参数是旋转角度,后三个参数定义了旋转轴,这个旋转轴是由地当前坐标系的原点和点(x,y,z)的直               线。正方向是原点指向点(xyz)。如果要定义不经过原点的旋转轴,则需要先把物体的旋转轴平移到过原                 点,旋转之后,再经过平移的逆变换平移回去。


    缩放:

    glScalef (GLfloat x, GLfloat y, GLfloat z);

    三个参数分别是物体在xyz三个方向上的缩放比例。


    举例如下,原始图像:



    平移:



    旋转:



    缩放:



    坐标变换完整代码:


    #include <glut.h> 
    #include <iostream>
    
    using namespace std;
    
    void myDisplay(void)    
    { 
    	glClearColor(1,1,0.8,1);
    	glClear(GL_COLOR_BUFFER_BIT);
    
    	//加载单位矩阵,在做坐标变换之前都要加载一下这个单位矩阵
    	//glLoadIdentity();
    
    	//将变换矩阵与当前矩阵相乘,之后所有的点都会左乘上该平移矩阵
    	glTranslatef(0.6,0,0);
    	glRotatef(45,0,0,1);
    	glScalef(0.5,0.5,0.5);
    	glColor3f(1,0,1);
    	glBegin(GL_POLYGON);  //绘制一个多边形
    	{
    		glVertex2f(-0.4,-0.4);
    		glVertex2f(-0.4,0.4);
    		glVertex2f(0.4,0.4);
    		glVertex2f(0.4,-0.4);
    	}
    	glEnd();
    	glFlush();
    }  
    
    int main(int argc, char *argv[])    
    {    
    	glutInit(&argc, argv);   //初始化GLUT
    	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
    	glutInitWindowPosition(500, 200);    
    	glutInitWindowSize(400, 400);    
    	glutCreateWindow("OpenGL");   
    	glutDisplayFunc(&myDisplay);   //回调函数 
    	glutMainLoop();    //持续显示,当窗口改变会重新绘制图形
    	return 0;    
    }  


  • 相关阅读:
    湾区求职分享:三个月刷题拿到 Google offer,欢迎踊跃提问
    【转】关于写书
    【转】真相
    【转】成都的雾霾
    【转】iPhone X
    【转】网络用语
    【转】AlphaGo Zero 和强人工智能
    【转】理性的力量
    【转】旅行的智慧
    【转】我为什么爱猫
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411923.html
Copyright © 2020-2023  润新知