Frustum Testing -- Bounds/Point/Occlusion

测试一个特定的渲染物体是否在一个特定的相机视锥中:

1  //returns true if renderer is within frustum
2     public static bool IsRedererInFrustum(Renderer renderer,Camera cam)
3     {
4         Plane[] planes = GeometryUtility.CalculateFrustumPlanes(cam);
5         return GeometryUtility.TestPlanesAABB(planes, renderer.bounds);
6     }

GeometryUtility.CalculateFrustumPlanes 得到的是相机视锥的六个平面(上下、左右以及前后) 我将其各自的法线画出来了:

不难理解这里这六个平面  

经过测试 渲染的物体 无论是部分还是全部在视锥中,该结果均为true

 

测试某一特定的点是否在相机视锥中:

 1 //returns true is the point in the frustum
 2     public static bool IsPointInFrustum(Vector3 point,Camera cam,out Vector3 viewPortLocation)
 3     {
 4         Bounds B = new Bounds();
 5         B.center = point;
 6         B.size = Vector3.zero;
 7 
 8         //construct frustum planes from camera
 9         Plane[] planes = GeometryUtility.CalculateFrustumPlanes(cam);
10 
11         bool isVisible = GeometryUtility.TestPlanesAABB(planes, B);
12 
13         viewPortLocation = Vector3.zero;
14 
15         if (isVisible)
16         {
17             viewPortLocation = cam.WorldToViewportPoint(point);
18         }
19         return isVisible;
20     }

可以考虑点为上一种渲染物体的特殊情况,其边界大小为0 

 

考虑物体在相机之中,并且测试没有occlusion时 :

 1  public static bool IsVisible(Renderer renderer,Camera cam)
 2     {
 3 
 4         //whether is in  camera frustum 
 5         if (IsRedererInFrustum(renderer, cam))
 6             return !Physics.Linecast(renderer.transform.position, cam.transform.position);      //whether there's no objects between the two objs..
 7 
 8 
 9         return false;
10     }

判断条件除了物体在相机视锥中,并且与相机之间有无其他物体挡住

通过二者之间的物理射线检测来实现

 

//适用: 第三人称角色扮演   检测控制的角色是否到被场景遮挡的地方  

 

//--另行补充--

 

转载于:https://www.cnblogs.com/coolsiyi/p/5667081.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值