标签:
我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)
这些,都可以在OpenGL中实现。
墨卡托坐标变换
OPENGL-----3D到2D坐标变换
OPENGL-----2D到3D坐标变换
2D到3D的变换其实是3D到2D的逆变换
1.视口变换
使用glViewport来定义视口。其中前两个参数定义了视口的左下脚(0,0表示最左下方),后两个参数分别是宽度和高度。
glViewport负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。
效果如图:
2.透视投影
glMatrixMode(GL_PROJECTION); // 设置当前矩阵为投影矩阵。
glLoadIdentity(); // 重置当前指定的矩阵为单位矩阵
将当前的用户坐标系的原点移到了屏幕中心:类似于一个复位操作。
glLoadIdentity该函数的功能是重置当前指定的矩阵为单位矩阵.在语义上,其等同于用单位矩阵调用glLoadMatrix。
glFrustum(l, r, b, t, n, f); //将当前矩阵与一个透视矩阵相乘,把当前矩阵转变成透视矩阵
该函数构造了一个视景体用来将模型进行投影,来裁剪模型,决定模型哪些在视景体里面,哪些在视景体的外面,在视景体之外的就不可见。
注:通常,glMatrixMode和glLoadIdentity一同使用,用于矩阵模式切换。
3.模型变换
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glScissor(0, 0, iWidth, iHeight);
glScissor裁剪函数,指定裁剪的宽高。
glTranslate*,把当前矩阵和一个表示移动物体的矩阵相乘。三个参数分别表示了在三个坐标上的位移值。
glRotate*,把当前矩阵和一个表示旋转物体的矩阵相乘。物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数angle表示旋转的角度。
glScale*,把当前矩阵和一个表示缩放物体的矩阵相乘。x,y,z分别表示在该方向上的缩放比例。
参考网址:
http://blog.csdn.net/a49688448/article/details/17999923
标签:
原文地址:http://www.cnblogs.com/icmzn/p/5050008.html