今天来讲三维变换
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
这些就是我们基本的对于一个三维的物体我们的观察方法。opengl提供了一些方法来让我们实现这些。
(一)
模型变换:这个来说就是对于一个三维物体本身进行变换,有三种:
glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。
这里补充一下opengl的坐标系的观点:世界坐标系就是按照屏幕中心原点来判别的,左到右x的往正方面,下到上y的往正方面,屏幕内部到屏幕外部是z往正方向。当你进行移动变换以后,那么接下来的绘图不会按照世界坐标系了,会按照物体的坐标系来画。
#include <GL/glut.h>
void display()
{
glMatrixMode(GL_MODELVIEW);//使用模型矩阵
glLoadIdentity();//消除之前矩阵的影响
glTranslatef(0.0f, -1.0f, 0.0f);
glutSolidSphere(1, 80, 16);
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(150, 150);
glutInitWindowSize(400, 400);
glutCreateWindow("透视投影变换");
//init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}#include <GL/glut.h>
void display()
{
glMatrixMode(GL_MODELVIEW);//使用模型矩阵
glLoadIdentity();//消除之前矩阵的影响
glTranslatef(0.0f, -1.0f, 0.0f);
glutSolidSphere(1, 80, 16);
glRectf(-1.0, -1.0, 1.0, 1.0);
glFlush();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(150, 150);
glutInitWindowSize(400, 400);
glutCreateWindow("透视投影变换");
//init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}矩阵并没有出现在中心,而是在下面说明是按照物体的坐标系画的。
(二)视图变换
说白了就是你眼睛的位置在哪里。
使用gluLookAt(),来设置你的眼睛的位置。
参数的信息是这样的:
glMatrixMode调用的参数类型来决定的。目的就是保存当前的矩阵(也就是当前的图像)。想要的时候在拿出来。使用glPushMatrix(); //将当前变换矩阵(单位阵)压入堆栈
原文:http://blog.csdn.net/yj1499945/article/details/46048041