经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
获取相机视口内物体在视线范围内某点的方法
来源:cnblogs  作者:tiancaiKG  时间:2019/5/16 9:04:39  对本文有异议

  我们在做HUD时经常使用物体的位置作为世界坐标点, 这在小物体的情况下没有问题, 但是在对于大型物体就有点麻烦, 因为我们的视角不一定能看到该点, 

比如大楼, 大桥甚至公路等, 希望能在物体进入视线范围内时获取一个当前视线范围内该物体离屏幕中心最近的一个点, 作为HUD的世界坐标点来显示.

  1. 首先需要测试物体是否在可视范围内, 一般使用 OnBecameVisible() 生命周期即可.

  2. 获取可视范围内离屏幕中心最近的点, 这个可以是多边形面上某点, 不一定是多边形的点.

  3. 因为视角是个三角形, 所以非规则物体经常是离相机最近的点不在相机视角之内.

  4. 不能做的太复杂

 

  于是我们从生命周期开始做, 在进入相机视角时添加到某个列表中, 因为依赖于Collider的API 并且需求该Collider为凸多边形, 所以对MeshCollider进行判断

  1. private void OnBecameVisible()
  2. {
  3. var collider = GetComponent<Collider>();
  4. if(collider)
  5. {
  6. var mc = collider as MeshCollider;
  7. if(mc && mc.convex == false)
  8. {
  9. return;
  10. }
  11. visibleColliders.Add(collider);
  12. }
  13. }

  然后因为相机是移动的, 计算位置也需要Update

  1. public static IEnumerator Run()
  2. {
  3. while(true)
  4. {
  5. if(visibleColliders.Count > 0)
  6. {
  7. foreach(var visibleCollider in visibleColliders)
  8. {
  9. var nearestPoint = visibleCollider.ClosestPoint(GetCameraViewPoint(visibleCollider));
  10. onVisible.Invoke(visibleCollider, nearestPoint);
  11. }
  12. }
  13. yield return null;
  14. }
  15. }

  关键就是计算离屏幕中心最近的位置了, 因为屏幕中心可以做一条射线出去, 这就是屏幕中心的线段, 按照理论 : 不一定有一个顶点一定会在屏幕视线范围内.

这个比较好理解吧, 一个面经过相机视线, 可是所有点都不在相机视线范围内, 所以简单数学方法获取离线段最近的点没有意义.

  这里就用Collider自带的API来计算一个大概的值即可:

  1. private static Vector3 GetCameraViewPoint(Collider target)
  2. {
  3. var dis = (Camera.main.transform.position - target.bounds.center).magnitude;
  4. var pos = Camera.main.transform.position + Camera.main.transform.forward * dis;
  5. return pos;
  6. }

  这里使用相机到物体的中心位置的距离作为参考, 从相机发射的射线在这个距离的点进行计算, 然后计算该点到物体的最近位置, 所得到的位置就作为HUD世界坐标, 

在大部分情况下是符合逻辑的...

 

原文链接:http://www.cnblogs.com/tiancaiwrk/p/10872051.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号