夏天/isummer

Sun of my life !Talk is cheap, Show me the code! 追风赶月莫停留,平芜尽处是春山~

博客园 首页 新随笔 联系 管理

opengl中场景变换|2D与3D互转换

我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它。(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它。(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(剪裁)。(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部。(视口变换)

这些,都可以在OpenGL中实现。

墨卡托坐标变换


 

OPENGL-----3D到2D坐标变换


 

OPENGL-----2D到3D坐标变换

 


 

2D到3D的变换其实是3D到2D的逆变换

 

1.视口变换

 

使用glViewport来定义视口。其中前两个参数定义了视口的左下脚(0,0表示最左下方),后两个参数分别是宽度和高度。

glViewport负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。

效果如图:


 

2.透视投影

 

glMatrixMode(GL_PROJECTION);                      // 设置当前矩阵为投影矩阵。  
glMatrixMode设置当前矩阵模式:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
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

posted on 2015-12-16 02:23  夏天/isummer  阅读(3951)  评论(0编辑  收藏  举报