unity 加载倾斜摄影-C#解析osgb(一)

下载 https://download.csdn.net/download/WantFK/87009338https://download.csdn.net/download/WantFK/87009338
1.提取osgb的图片信息mesh顶点 UV 三角序列下一级namebounds视距 和保存  (提取

        目的 解析osgb的流程过于麻烦 真正用地到的就这几个数据

2.unity 制作初始瓦片预制件 整理为空间四叉树 优化索引                                            (预制件 

        目的  相机看向的部分总是只有一部分而看不到的地方为了减少GPU压力需要进行隐藏

        同时如何快速判断相机看向的目标是哪些

        瓦片加载时的索引优化(之前都是无脑遍历)

        提前计算每个瓦片的bounds(之前都是利用中心点和半径) 四叉树叶子的bounds和更精准的个体瓦片bounds

3.读取并使用                                                                                                                (解压

4.数据结构分析

        

         

 

        将所有数据存为一棵四叉树 

        主干TreeFour 

        自身bounds 和四个叶子的bounds 四个叶子对象

        叶子Leaf

         自身 下一级四个叶子的bounds和对象 每个子叶子包含的个体

        我这里只分了两层 再多就不合适了反而增加了负担

每帧执行肯定不可取 做一些延迟 大概比例在适当位置相机移动一个瓦片大小的距离

 void FixedUpdate()
    {
        //延迟处理 当相机位置移动量偏差为10或者旋转量为~ 进行更新
        if ((CameraMin.transform.position - oldCamera_position).magnitude > 10)//10 实时检测间隔   || !oldCamera_rotation.Equals(CameraMin.transform.rotation)按需要添加旋转 旋转如何设置间隔?
        {
            slope = Mathf.Tan(CameraMin.fieldOfView * Mathf.Deg2Rad * 0.5f);
            GeometryUtility.CalculateFrustumPlanes(CameraMin, _currentFrustum);
            oldCamera_position = CameraMin.transform.position;
            //oldCamera_rotation = CameraMin.transform.rotation;
            // 先进行加载 隐藏 
            StartCoroutine(All_LoadLayer());
            //卸载 队列 1 储存卸载需求 卸载综量  
        }

        StartCoroutine(All_LoadLayer());

     找到相机看向的瓦片层级个体集合 通过遍历判断AABB是否在相机范围内储存List<user_osg>

public class user_osg 
{
    public float distanceold = 0;           //记录上次的距离 减少循环
    public int isOnselect = 0;              //记录是否离开过视角 减少循环
    public Bounds _bounds;
    public Transform ThisObj;               //初始瓦片实体
    public Transform _pagedDatas;           //关联下一级
    public Transform ThisTransform;         //自己
    public user_osg(Transform B, Transform A,Transform C, Bounds _bounds)
    {
        this._pagedDatas = B;
        this.ThisObj = A;
        this.ThisTransform = C;
        this._bounds = _bounds;
    }
}

        判断个体是否在相机范围内(虽然和上边已经判断出大概  这里可以取舍 选择默认在相机内和再次判断 各有优劣)

        结果存在

         //加载栈 后进先出 把数据平摊到每帧执行
    Stack<Transform> TaskDels1 = new Stack<Transform>();

          加载栈 

 if (!isLoading)
        {
            if (TaskDels1.Count == 0) return;
            LoadWork();
        }
    }
    async void LoadWork()
    {
        isLoading = true;
        await RequestLoadAndUnload(TaskDels1.Pop());
        isLoading = false;
        //TaskDels1.Pop();
    }

        (整个场景你没有设计卸载队列  现阶段如果把没个瓦片都加载到最后内存实际使用为 总文件的2/3大小  这里只加载了17到19层级)
        

一 提取osgb信息并写入新文档

1.打开ReaderOSGB.cs 组件 关闭Ceshis.cs

 

 设置读取文件目录 onclickbutton("E:/接收文件/osgb/1");

 文件写入目录 可以自定义 (不过最好存在项目外

PathName = Path.Combine(Path.Combine(Application.dataPath, "../"), "OsgbData") ;

需要手动设置

0.  ReaderOSGB.cs 173 出可以输出空文件的目录       

 if (!File.Exists(rootFileL + ".osgb"))
                {
                    Debug.Log(rootFileL+"名字异常");
                    break;
                }

1.ReaderOSGB.cs 需要根据实际填写  初始瓦片层级(例如 17 以文件不分叉同时较清晰程度) 和你要的最终层级 (19 为止 需要的往上调)  osgb结构的初始层级(14 有的文件都不一致 所以需要手动调 15 16都有可能)

2.

  InsideFuntion(scencepatent, a, PathName); 初始瓦片

  InsideFuntionQI(scencepatent, a, PathName);17层瓦片

分别输出 一块输出数据会混乱

3.先输出  InsideFuntionQI(scencepatent, a, PathName);17层瓦片  如果debug 数据异常 有可能数据文件夹为空需要手动删除 不然会卡主进程

二 预制件 

如果加载的是osgb文件集 需要调整每个模块的位置 

具体步骤写的不是太详细 有需求的话留言吧

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>