众所周知,当摄像机投影时,采用的是视觉圆锥进行的投射,类似手电筒向外照射光的时候。
在视觉圆锥内的就能被摄像机观察到。
但我们计算机屏幕是方形的,所以所显示的内容,只能是视觉圆锥的一部分,还有一部分被舍去了。
有两个关键点,一个是摄像机点,一个是观察点。观察点作为中心点,始终是显示的计算机屏幕中心的,我们可以把这个点作为基准点。
我们可以设定摄像机点与观察点始终是垂直于显示面的,也既计算机屏幕。
我们把视觉圆锥内所有的物体,由远及近向显示面(屏幕)进行投影,就形成了屏幕上显示的内容。
了解了视口屏幕的投射过程,那们我们可以分析哪些物体能被投影到屏幕上了:
设摄像机点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轴为旋转轴,旋转角度为(OA和z轴夹角)
OB点经过这个距阵处理后,向z=0平面投影,得到投影点C
C点的x/y符合屏幕坐标,则意味着在屏幕内,否则在屏幕外
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源