土圭垚㙓数学课(二)视锥体八个顶点的计算方法
来源:互联网 发布:自带软件删除 编辑:程序博客网 时间:2024/04/30 12:52
视锥体是摄像机可见的空间,看上去像截掉顶部的金字塔。视锥体由6个裁剪面围成,构成视锥体的4个侧面称为上左下右面,分别对应屏幕的四个边界。为了防止物体离摄像机过近,设置近切面,同时为了防止物体离摄像机太远而不可见,设置远切面。本文将介绍一下视锥体八个顶点的计算方法。
我们就以Unity3D(5.6.0f3)为例。
首先取fov(fieldOfView),即摄像机在竖直方向上的张角。
float fov = Camera.main.fieldOfView;还有aspect,也就是屏幕的宽高比。
float asp = Camera.main.aspect;
然后计算获得一个yf参数,用来表示视锥体的上下侧面与xz平面的偏移量。
float yf = Mathf.Tan(fov/2 * Mathf.Deg2Rad);
为什么要除以2?因为我们知道fov是摄像机在竖直方向上的张角,也就是说以xz平面为中心,上下各有fov/2的角度。
然后计算一下xf参数,同理,用来表示视锥体的左右侧面与yz平面的偏移量。
float xf = yf * asp;
然后是视锥体四个侧边(也就是不在近平面或原平面上的边)的方向向量。
Vector3 f0 = Camera.main.transform.forward - Camera.main.transform.right * xf - Camera.main.transform.up * yf;Vector3 f1 = Camera.main.transform.forward - Camera.main.transform.right * xf + Camera.main.transform.up * yf;Vector3 f2 = Camera.main.transform.forward + Camera.main.transform.right * xf - Camera.main.transform.up * yf;Vector3 f3 = Camera.main.transform.forward + Camera.main.transform.right * xf + Camera.main.transform.up * yf;
(他们不是单位向量哦!)
之所以列出这四个向量,是因为他们有时候会特别有用,比如说计算视锥体与一个平面的相交多边形。
需要注意的是这里计算的是世界空间的向量,所以要使用Camera的forward,right和up来计算。既然这么说了,你一定想到了另外一种写法。
Matrix4x4 l2w = Camera.main.transform.localToWorldMatrix;Vector3 f0 = l2w * new Vector3(-xf,-yf,1);Vector3 f1 = l2w * new Vector3(-xf, yf,1);Vector3 f2 = l2w * new Vector3( xf,-yf,1);Vector3 f3 = l2w * new Vector3( xf, yf,1);
最后计算出八个顶点:
float fcp = Camera.main.farClipPlane;float ncp = Camera.main.nearClipPlane;Vector3 cpt = Camera.main.transform.position;
Vector3 farLeftBottom = cpt + fcp * f0;Vector3 farLeftTop = cpt + fcp * f1;Vector3 farRightBotoom = cpt + fcp*f2;Vector3 farRightTop = cpt + fcp * f3;
Vector3 nearLeftBottom = cpt + ncp * f0;Vector3 nearLeftTop = cpt + ncp * f1;Vector3 nearRightBotoom = cpt + ncp*f2;Vector3 nearRightTop = cpt + ncp * f3;
阅读全文
0 0
- 土圭垚㙓数学课(二)视锥体八个顶点的计算方法
- 土圭垚㙓数学课(三)四元数
- 土圭垚㙓数学课(四)空间变换
- 土圭垚㙓数学课(一)万向锁(Gimbal Lock)
- Unity3D -- 图形 -- 视锥体
- 视锥体裁剪
- 回溯法——正方体的八个顶点
- 三维模型顶点法向量和偏导数的计算方法
- 数学课
- 结构化大数据的几种计算方法(二)
- Unity3D技术之相机使用技巧-从相机到给定距离的视锥体大小
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- Unity3D for VR 学习(4): 自绘摄像机的视口区域锥体
- 给定一个模型文件,计算出这个模型的OBB包围盒的八个顶点 的 项目
- D3D9 SDK文档笔记6---视锥体
- 图的邻接矩阵表示法及顶点入度、出度的计算方法
- 图的邻接表表示法及顶点入度、出度的计算方法
- 数据挖掘领域重要会议与期刊情况
- 新博客地址
- C#构造函数里的base和this的区别
- 路由转发实验
- 9-7考试总结
- 土圭垚㙓数学课(二)视锥体八个顶点的计算方法
- Android Drawable Resources 之 Shape Drawable 使用详解
- 「网络流 24 题」圆桌聚餐
- Ubuntu16.04 安装谷歌浏览器并配置常用插件与扩展
- 机器学习——线性回归(梯度下降和正规方程)
- 简单背包练习——0/1背包
- spring框架,什么是AOP,AOP面向切面编程是怎么样的
- 新闻阅读量的实现
- Codeforces Round #433 (Div. 2 D. Jury Meeting 二分