关于正投影视见体的简单分析

品雪
pinxue@hotmail.com http://pinxue.yeah.net
01-8-14 下午 10:55:05


glOrtho(left,right,bottom,top,near,far)的效果是:

    |     2          	               |
    |----------      0          0      t  |
    |right-left	                     x  |
    |                2                    |
    |    0       ----------	    0      t   |
    |            top-bottom             y |
    |	                        -2       |
    |    0           0       --------  t  |
    |                        far-near   z |
    |                                     |
    |    0           0          0      1  |
where
          right+left
   t  = - ----------
    x     right-left

          top+bottom
   t  = - ----------
    y     top-bottom

          far+near
   t  = - --------
    z     far-near

除了定义x=left或right、y=bottom或top、z=-near或-far的六个裁剪面之外,还定义了一个正投影体。
简单起见,令l=-1 r=1 t=1 b =-1,专门研究 near far的影响,上式变成:

 | x |       |1 0 0 0|
| y | |0 1 0 0|
| z | * |0 0 a b| = [x,y,az+b,1]
| 1 | |0 0 0 1|

可见在正投影中,在此种投影变换矩阵作用下,x,y坐标是不变的,改变的是z坐标
z ==> az+b
其中 a= -2/(far - near) 而 b = - (far + near) / (far - near)
来看几种典型组合:

near
far
a=-2/(f-n)
b=-(f+n)/(f-n)
z'=az+b
(x,y,0)w
(x,y,1)w
(x,y,-1)w
临界z坐标
0
1
-2
-1
-2z-1
(x,y,-1)e
(x,y,-3)e
(x,y,+1)e
z>0,z<-1
1
0
2
1
2z+1
(x,y,+1)e
(x,y,+3)e
(x,y,-1)e
z>0,z<-1
-1
1
-1
0
-z
(x,y,0)e
(x,y,-1)e
(x,y,1)e
z>1,z<-1
-1
0
-2
1
-2z+1
(x,y,+1)e
(x,y,-1)e
(x,y,3)e
z>1,z<0
-1
-2
2
-3
2z-3
(x,y,-3)e
(x,y,-1)e
(x,y,-5)e
z>2,z<1
0
4
-0.5
-1
-0.5z-1
(x,y,-1)e
(x,y,-1.5)e
(x,y,-0.5)e
z<-4,z>0
         
 
附:分析程序

可见:

    1. 远近裁剪面确实在世界坐标-near,-far处,两者之间才是可见区。
    2. near/far距离的正负是以眼坐标标记的,所以裁剪面才会在z=-near/-far(世界坐标)处。
    3. 关于视点的问题,实践及文档都说明我前面的说法是不对的,对于glOrtho/glFrustum,默认视点都在(0, 0, 0)。
    4. near+far <> 0时z世界坐标变成眼坐标时将产生位位移。
    5. abs(far-near) <> 2时z世界坐标变成眼坐标后将被放大或缩小。

以上对near/far的分析显然同样适用于其它轴。