openGL中的 透视(projecting)概念

一般图形在 旋转(notation) 缩放(scaling) 旋转(rotating)处理之后 , 还需要把图形投影(projecting)在 屏幕上.

一般投影分为以下2类:

perspective(透视)

parallel(平行)

 

透视(perspective)就像我们人类看3D画面在我们2D的视网膜上面, 一般透视图形由一些被遮盖的顶点(vanishing point) 和 一些投影(foreshortening)组成,

所谓被遮盖的顶点就是在一条平行的直线被覆盖在一段距离内从而提供了透视的效果假设一条铁路延伸到地平线,如下图

在透视中Z的值作为距离值用来缩放,所以Z的值越大,物体距离越远视觉上就感觉越小.

所谓平行投影(parallel projecting)又称为正投影(orthographic),所谓正投影就是除去Z轴上的距离效果通过设置Z上组件vertex为0如下图:

接下来 我们需要设置一个平截头体(frustum),所谓平截头体建立在6个截面上,底(bottom),顶(top),左(left),右(right),近(near),远(far)如下图:

这6个点确定了openGL显示在屏幕上的区域和原点,在一些小型显示设备比如手机和平板电脑,如果想设置全屏显示可以设置屏幕的全宽(full's width)

或者如果只是想替换子屏幕的一个图像那么可以传递一个更小的值到viewport.

总的来说frustum就是一个窗口 窗口的大小决定了视角的大小.

如下图:

 

如果我们想找到模型的任意顶点X在屏幕上的投影,那么考虑上图2个三角形COA‘ 和 CBA (O是原点) 

, C 到 B 的 距离是 Z+d , C 到 O 的 距离是 d.

那么比例 是:

X'/d = X/Z+d 

Y'/d = Y/Z+d

转换一下:

X' = X*d / Z+d

Y' = Y*d / Z+d

再加上位移(Translation)

X' = (X*d / Z+d) + Tx

Y' = (Y*d / Z+d) + Ty

如下图

通过frustum你可以决定屏幕显示目标坐标系(object's coordinates)的右边 还是 左边

内容摘至pro opengl es for android - Mike Smithwick (Author), Mayank Verma (Author)

posted on 2012-04-06 13:55  DAWN09151111  阅读(595)  评论(0)    收藏  举报

导航