论文算法学习记录(4):视锥体-- Frustum Culling

研究背景:对动态障碍物的检测和剔除,或者说对相邻数据动态变化的检测.

一、背景知识

  • 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_;
  • 判断每一个3D点是否在第2步中每个平面的右边,也就是内侧,如果都在则说明是在相机视野内,反之则在视野之外.
	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函数

[2]. openGL–gluPerspective函数

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱发呆de白菜头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值