透视投影时相机的参数设置

在透视投影情况下,初始化时视口的两个轴方向的视野角度由Keep Aspect设置和FOV参数共同决定:在被Keep的方向视野角度锁定为FOV参数(缺省70度),另一个轴方向的视野由视口宽高比决定。
运行中视口调整时总是锁定(初始化时)指定轴的视野角度,只调整另一个活动轴的视野FOV,相机位置不变化。如果同时调整视口两个方向的大小,结果和分开两步调整是一样的。

  1. 先确定所有物体的可能位置范围,以此作为相机的观察范围:
    设物体都在w*h的矩形范围内;
  2. 确定相机高度(的最小值)H:

假如初始化时相机位置在矩形中心的正上方,看向矩形中心,并让视口正好显示矩形某个方向的全部范围,那么:
如果相机配置是Keep Wide,视口水平方向的视野角度不会再变了,那么相机和矩形中心距离应为(w/2)*cot(70/2);
如果相机配置是Keep Height,视口垂直方向的视野角度不会再变了,那么相机和矩形中心距离应为(h/2)*cot(70/2)。

例:已知w=154、h=104,视口初始大小为1920*1080,求相机的最佳(显示全部w*h,尽可能大)初始化参数配置。
解:
当相机的Keep Aspect设置为

  • Keep Width
    垂直方向显示的范围h’=154*1080/1920=86.625 < h,不能完全显示矩形范围
  • Keep Height
    水平方向显示的范围w’=104*1920/1080=184.89 > w,可以完全显示矩形范围
    此时相机高度最小值=104*cot(35)/2=74.26,取H=75
    所以应设置Keep Height及H=75。

接上例:如果初始化之后再调整视口大小为1080x1920(竖屏),由于已经设置了Keep Height,所以h方向视野角度不变。
水平方向显示的范围w’=104*1080/1920=58.5,水平视野更窄,看到的范围更小了。

接上例:如果要在上面两种视口大小都能完整显示w*h的范围,求视口和相机的最佳初始化参数配置。
解:
对于1920*1920的视口,当某个方向缩小为1080时,如果这个方向视野角度未锁定,那么视野(平行于该轴方向的直线通过视口观察到的可见部分)被砍掉7/16,w或h必须要在剩下的9/16里。
所以大视口的显示范围的边长最小值d=min(w, h)/(9/16)=h*16/9
由已知条件得到:d=104*16/9=184.9,相机高度H=(d/2)*cot(35)=132.0,初始化视口大小1920*1920,设置Keep Width(因为前面解答过程中d的最小值由h得来,h方向被缩小)。
如果初始化视口为1920*1080或1080*1920,就将1920的那一边设置为锁定的(因为假设了未锁定的边调整为1080)。

反向思路:对于1080*1080的视口,当它向某一方向扩大到1920,如果这个方向视野角度是锁定的,那么另一方向视野就变为原来的9/16,w或h必须要在这9/16内,所以也有d=min(w, h)/(9/16)。

实践中要注意视口大小不等于窗口大小,还受到标题栏、状态栏等占位因素的影响;相机高度设置可能要考虑物体大小和物体离开矩形所在平面的距离的影响。

  1. 确定远平面、近平面
    根据立体几何距离公式,设置远平面为:
    Far = sqrt(H^2 + (w/2)^2 + (h/2)^2)
    根据物体的预估最大高度hmax,设置近平面为:
    Near = H - hmax

猜你喜欢

转载自blog.csdn.net/feiyunw/article/details/127135445
今日推荐