首页 > 代码库 > 摄像机视口屏幕投射

摄像机视口屏幕投射

众所周知,当摄像机投影时,采用的是视觉圆锥进行的投射,类似手电筒向外照射光的时候。

在视觉圆锥内的就能被摄像机观察到。

 

但我们计算机屏幕是方形的,所以所显示的内容,只能是视觉圆锥的一部分,还有一部分被舍去了。

 

有两个关键点,一个是摄像机点,一个是观察点。观察点作为中心点,始终是显示的计算机屏幕中心的,我们可以把这个点作为基准点。

我们可以设定摄像机点与观察点始终是垂直于显示面的,也既计算机屏幕。

 

我们把视觉圆锥内所有的物体,由远及近向显示面(屏幕)进行投影,就形成了屏幕上显示的内容。

 

了解了视口屏幕的投射过程,那们我们可以分析哪些物体能被投影到屏幕上了:

设摄像机点O、观察点A形成射线: OA->

设摄像机点O、某物体B点形成射线: OB->

设摄像机观察角度为: angle=45

1.      位于视口圆锥内:OA->OB夹角在angle角以内

方向: 向量doprodut (OA->OB->) <=0 (意味着>90)不在范围内

方向: 向量GetAngle(OA->,OB->) > 像机的观察角angle不在范围内

2.      能够投影到屏幕上:OB->投影到显示面上的点C位于显示面(屏幕)

设观察点坐标为(0,0,0) 并且观察面在x/y轴上(z=0):

(视觉圆锥投在该面的容纳该高宽比的最大矩形高宽)

         Width:显示面的宽度

         Height:显示面的高度

则屏幕坐标-width/2<=x<=width/2, -height/2<=y<= height /2

如果投影点的x/y坐标在屏幕坐标范围内,则可以显示。

变换距阵为:

1.      平移: (A变成原点)

Translate-A坐标)

2.      旋转: (OA变成Z)

z轴为旋转轴,旋转角度为(OAz轴夹角)

 

OB点经过这个距阵处理后,向z=0平面投影,得到投影点C

C点的x/y符合屏幕坐标,则意味着在屏幕内,否则在屏幕外

 

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源

 

摄像机视口屏幕投射