当前位置: 首页 > news >正文

论文算法学习记录(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函数

相关文章:

  • RobotSlamApplication(1):第一个三方库--Eigen3库的使用
  • 论文算法学习实现(5):动态障碍物的检测和剔除2
  • ubuntu学习技巧2:Terminal命令学习
  • RobotSlamApplication(2): 视觉SLAM中常用的一些第三方库简介
  • C++11回顾学习(1): 语法简要回顾和通俗解释
  • 菜鸟专学:从头到尾创建自己的SLAM系统
  • 菜鸟专学:Eigen--Sophus--CV--三种不同库对矩阵的操作方式
  • ROS回顾学习(7):ubuntu下设置(ROS)程序开机自启动
  • RTAB-Map学习和测试详解
  • ROS回顾学习(8): 项目研究中遇到问题和难点记录
  • 菜鸟专学:明确自己编程习惯的变量命名法
  • OpenCV第一讲: 常规函数和类的使用 -- HighGui Core模块
  • kinect V2 驱动安装说明
  • C++11回顾学习(2): 一些常用的函数和小技巧
  • ROS回顾学习(9): 单通道深度图像转化为彩色图发布
  • nginx 负载服务器优化
  • php面试题 汇集2
  • Redux 中间件分析
  • SQLServer之创建数据库快照
  • Vue.js-Day01
  • 大主子表关联的性能优化方法
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 我与Jetbrains的这些年
  • 小程序 setData 学问多
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #1015 : KMP算法
  • #HarmonyOS:基础语法
  • (4)logging(日志模块)
  • (C++20) consteval立即函数
  • (ibm)Java 语言的 XPath API
  • (二开)Flink 修改源码拓展 SQL 语法
  • (分布式缓存)Redis分片集群
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (利用IDEA+Maven)定制属于自己的jar包
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)appium-desktop定位元素原理
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .CSS-hover 的解释
  • .net refrector
  • @EventListener注解使用说明
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [BT]小迪安全2023学习笔记(第15天:PHP开发-登录验证)
  • [FT]chatglm2微调
  • [HJ73 计算日期到天数转换]
  • [Java] 模拟Jdk 以及 CGLib 代理原理
  • [jQuery]使用jQuery.Validate进行客户端验证(中级篇-上)——不使用微软验证控件的理由...
  • [JS入门到进阶] 哎,被vite小坑了一波,大家记得配置build.cssTarget为‘chrome61‘
  • [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
  • [Redis实战]分布式锁-redission
  • [Sdoi2010]地精部落
  • [SOA介绍]什么是SOA?