研究背景:对动态障碍物的检测和剔除,或者说对相邻数据动态变化的检测.
一、背景知识
-
gluLookAt(px,py,pz, lx,ly,lz, ux,uy,uz)
该函数定义一个视图矩阵,并与当前矩阵相乘: 第一组px, py,pz 相机在世界坐标的位置 第二组lx,ly,lz 相机镜头对准的物体在世界坐标的位置 第三组ux,uy,uz 相机向上的方向在世界坐标中的方向
-
gluPerspective (GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
fovy是上下睁开的幅度,俯仰角度值; zNear表示近裁剪面到眼睛的距离,zFar表示远裁剪面到眼睛的距离。 aspect表示水平方向的夹角;
二、视锥体模型
第一步: 6个平面-- 远、近平面, 上下平面, 左右平面;(由近、远平面组成的"梯体")
第二步: 9个顶点-- 近平面4个,远平面4个,最后加上相机位姿这个特殊点;
第三步: 由相机位姿可以推算出相机的水平、垂直方向上的FOV以及与近平面和远平面的距离(也就是背景知识中涉及到的那些参数的换算);
第四步: 由第三步还要计算近平面和远平面的Height 和 Width:
Wnear = 2 * tan(.getHorizontalFOV() / 2) * neardist_;
Hnear = 2 * tan(.getVerticalFOV() / 2) * neardist_;
Wfar = 2 * tan(.getHorizontalFOV() / 2) * fardist_;
Hfar = 2 * tan(.getVerticalFOV() / 2) * fardist_;
int FrustumG::pointInFrustum(Vec3 &p)
{
int result = INSIDE;
for(int i=0; i < 6; i++) {
if (pl[i].distance(p) < 0)
return OUTSIDE;
}
return(result);
}
三、代码实现
-
随机生成一组3D空间点(500个),初始化相机位姿,得到第一次相机视野内数据如下(剩下181个):
其中,两个平面组成的范围为相机视野范围,其中绿色的点为当前视野范围内的数据点(经过剔除之后剩下的点);
-
移动相机位置,更新Frustum视野中的数据(剩下41个).
其中,红色的点为前一时刻在相机视野范围内经过剔除之后剩下的点(181)个,绿色的点为相机经过平移/旋转变换之后在当前视野下数据点(41)个。
参考文献
[1]. OpenGL–gluLookAt函数