OpenGL坐标系及基本变换

转自:https://blog.csdn.net/dcrmg/article/details/53088463


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

左手坐标系:伸开左手,大拇指指向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三个方向上的缩放比例。


举例如下,原始图像:



平移:



旋转:



缩放:



坐标变换完整代码:


  1. #include <glut.h>   
  2. #include <iostream>  
  3.   
  4. using namespace std;  
  5.   
  6. void myDisplay(void)      
  7. {   
  8.     glClearColor(1,1,0.8,1);  
  9.     glClear(GL_COLOR_BUFFER_BIT);  
  10.   
  11.     //加载单位矩阵,在做坐标变换之前都要加载一下这个单位矩阵  
  12.     //glLoadIdentity();  
  13.   
  14.     //将变换矩阵与当前矩阵相乘,之后所有的点都会左乘上该平移矩阵  
  15.     glTranslatef(0.6,0,0);  
  16.     glRotatef(45,0,0,1);  
  17.     glScalef(0.5,0.5,0.5);  
  18.     glColor3f(1,0,1);  
  19.     glBegin(GL_POLYGON);  //绘制一个多边形  
  20.     {  
  21.         glVertex2f(-0.4,-0.4);  
  22.         glVertex2f(-0.4,0.4);  
  23.         glVertex2f(0.4,0.4);  
  24.         glVertex2f(0.4,-0.4);  
  25.     }  
  26.     glEnd();  
  27.     glFlush();  
  28. }    
  29.   
  30. int main(int argc, char *argv[])      
  31. {      
  32.     glutInit(&argc, argv);   //初始化GLUT  
  33.     glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);    
  34.     glutInitWindowPosition(500, 200);      
  35.     glutInitWindowSize(400, 400);      
  36.     glutCreateWindow(”OpenGL”);     
  37.     glutDisplayFunc(&myDisplay);   //回调函数   
  38.     glutMainLoop();    //持续显示,当窗口改变会重新绘制图形  
  39.     return 0;      
  40. }    
#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;
}



猜你喜欢

转载自blog.csdn.net/liujianxun111/article/details/80094215