码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-12-16 09:21:57      阅读:407      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://www.cnblogs.com/icmzn/p/5050008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!