- 坐标平移glTranslate
- 坐标旋转glRotate
- 坐标缩放glScale
1.坐标平移:glTranslate
void glTranslated(GLdouble x,Gldouble y, Gldouble z)
void glTranslatef(GLfloat x,Glfloat y, Glfloat z)
参数说明:x,y,z 指定平移向量的x,y,z坐标,即将当前坐标系分别向x,y,z方向移动x,y,z个单位长度。
举例,将在原坐标系中画一个红色三角形,坐标平移后,用同样的参数再画一个三角形,画为绿色以便区分。
代码如下:
#include <windows.h>
#include <stdlib.h>
#include <GL/glut.h>
//初始化背景色为白色
void init(void){
glClearColor(1,1,1,1);
}
//画一个三角形
void drawtriangle(void){
glBegin(GL_LINE_LOOP);
glVertex2f(-50,0);
glVertex2f(50,0);
glVertex2f(0,50);
glEnd();
}
void display(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,0,0);//画笔为黑色
//画初始坐标系的x,y轴
glBegin(GL_LINES);
glVertex2f(150,300);
glVertex2f(150,0);
glEnd();
glBegin(GL_LINES);
glVertex2f(0,150);
glVertex2f(300,150);
glEnd();
//将坐标系中心平移到窗口中心(窗口初始大小为300*300)
glTranslatef(150,150,0);
//使用红色画一个三角形
glColor3f(1,0,0);
drawtriangle();
//使用绿色画笔
glColor3f(0,1,0);
//1
glTranslatef(100,50,0);
glTranslatef(-50,0,0);
//2 glRotatef(135,0,0,1);
glTranslated(50,0,0);
//3.1 glScalef(-1,-1,-1);
//3.2 glScalef(0.5,0.5,0.5);
//在新的坐标系中画一个三角形
drawtriangle();
glFlush();
}
//适应窗口变动
void reshape(GLsizei w,GLsizei h){
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0,(GLdouble)w,0,(GLdouble)h);//更改窗口坐标系,窗口的左上、左下、右下、右上的坐标分别为(0,h)(0,0)(w,0)(w,h)
}
int main(int argc,char* * argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(300,300);//300,300即为初始状态下的w,h
glutInitWindowPosition(200,200);
glutCreateWindow("rotate the triangle");
init();
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
运行结果:
可以将代码1的参数进行修改,观察效果,但不要改最后一个参数,因为目前是在二维平面中进行操作,下述内容同理。
2.坐标旋转 glRotate
void glRotated(GLdouble angle, GLdouble x,Gldouble y, Gldouble z)
void glRotatef(GLfloat angle, GLfloat x,Glfloat y, Glfloat z)
参数说明:angle 制定旋转角度单位为度,旋转方向为逆时针 x,y,z 指定向量的x,y,z坐标
举例,在坐标系中画一个红色三角形, 将坐标绕向量(0,0,1)旋转135°,再按原参数画一个三角形,画为绿色以便区分。
代码如下:
将上述代码1注释掉,代码2.2解注释即可
运行结果:
结果可以这样理解,
二维空间中:三角形绕着原点旋转135°得到新的三角形。
三维空间中:我们先画了一个二维中的三角形,然后在三维空间中绕着直线(0,0,1)旋转135°,就像先画了竹蜻蜓的翅膀,然后绕着棍子转。
那如果说我现在不想绕着(0,0,1)转,而是想绕着与(0,0,1)平行的其它直线转呢?放到二维空间中说,我不想绕原点转,我想绕别的点转,比如说绕点(-1,0),应该怎么做?答案在本文最后,但是建议读者自己思考,提示:利用坐标平移。
3.坐标缩放 glScale
void glScaled(GLdouble x,Gldouble y, Gldouble z)
void glScaled(GLfloat x,Glfloat y, Glfloat z)
参数说明:x,y,z 各个方向的缩放比例
举例:同样,画个红色三角形,将坐标系进行缩放,用同样的参数画一个三角形,画为绿色以便区分
将上述代码2注释,3.2解注释
运行结果:
将代码3.2注释,代码3.1解注释,结果如下:
坐标旋转答案:
将代码2前后增加几行代码,如下。
glTranslatef(-50,0,0);//增加的代码
glRotatef(135,0,0,1);//代码2
glTranslated(50,0,0);//增加的代码
这里以绕着点(-50,0),即三角形的一个点,旋转为例,运行结果如下:
个人理解,其实就是先将坐标平移,告诉电脑要绕着这条直线旋转,然后再将坐标返回去,进行作图。