开题介绍-视频最后展示-成果
{{ interaction.likeNum == 0 ? (pageType === 'video' ? '抢首赞' : '点赞') : formatNumber(interaction.likeNum) }}
{{ interaction.collectionNum == 0 ? '收藏' : formatNumber(interaction.collectionNum) }}
{{ interaction.discussNum == 0 ? (pageType === 'video' ? '抢沙发' : '讨论') : formatNumber(interaction.discussNum) }}
分享
适合人群
高级程序员
高级工程师
GIS从业者
BIM从业者
三维从业者
数字化从业者
你将会学到
从2D->2.5D->3D立体球,全程零代码到完全实现,每一句代码都是课堂编写,实现无漏学习
- 多线程的高级用法
- C++语言新特性的应用
- 设计模式在项目中的实际应用
- 智能指针的高级用法
- 模块之间解耦,降低模块之间的耦合度
- 高程数据的格式以及由来
- TIF文件到金字塔瓦片的生成
- 使用投影实现从2D到3D的过程
- 程序优化技巧
- 内存池以及对象池的使用
课程简介
课程截图
SHP轮阔数据生成三维建筑数据(拉伸算法),凸包处理(凹多边形处理成凸多边形)
OpenGL-自主高性能三维GIS平台架构与实现/第二季:高程数据加载+实现三维球体 | |||
章节名称 | 课时编号 | 课程名称 | 主要内容描述 |
DEM基础 | 1 | DEM基础知识 | 1.介绍基本的DEM知识 2.什么是DEM,作用是什么 |
2 | DEM数据 | 1.如何获取/ 传统测量/激光扫描/无人机测量/ 点云数据/ 倾斜摄影 2.如何使用/局部小规模(栅格数据,图片/tif), 3. 组织方式 4. 根据使用目的不同,介绍多种优化方法 | |
3 | DEM图层的实现原理 | 1 | |
4 | DEM数据结构定义 | struct V3U3N4 { float x, y, z; float u, v, w; byte nx,ny,nz,nw; } 顶点数据的生成和计算 | |
WGS84投影计算 | 5 | wgs84 投影 | 球体被切成一个个小圆弧,一共60个投影带,分别为01,02.........60 WGS的最新版本为WGS 84(也称作WGS 1984、EPSG:4326),1984年定义、最后修订于2004年。 接口定义 坐标转换 Wgs84 数据加载 |
6 | 瓦片编号计算生成算法 | 1. 经纬度到大地坐标的转换 2.大地坐标到经纬度坐标转换 3. 根据经纬度获取瓦片编号 | |
框架重构 | 7 | 智能指针重构框架 | 1. 基类定义(所有的类继承自基类),基类派生自 std::enbale_shared_from_this 2. 实现智能指针的动态转换接口 3. 实现向下转换 4. 已有的类实现全部使用智能指针重构 5. 任务系统(多线程加载任务) |
8 | 引入图层(Layer) | 1. 介绍图层的概念以及重要性 2. 图层类实现 3. 修改框架(使用图层的方式重构框架) | |
9 | Layer-bug排查(绘制过程中出现错位,偶发) | 1. 框架重构后遇到问题(绘制结果错误) 2. 瓦片索引方式发生变化,多线程中引起内存问题 3. 修改索引方式,解决绘制偶发错误问题 | |
10 | 引入数据源(TileSource) | 1. 数据源的作用与设计目的 2. 当前存在的问题,数据调度中存在问题 3. 数据源(TileSource)类实现 | |
11 | 数据格式管理(FormatMgr) | 1. 数据格式管理(FormatMgr) 提出的目的,需要解决的问题 2. CELLFormat基类接口抽象 3. 实现几个标准格式类 4. 修改框架流程,使用FormatMgr重构流程 5. 扩展支持,后续支持任务格式数据加入系统 | |
12 | Task(任务)优化 | 1. 任务中低耦合数据结构,目的是让Task更加的通用 2. 修改任务读取代码与任务处理代码,完善处理流程 | |
DEM高程 | 13 | DEM-数字高程定义 | 1. 什么是数字化高程数据 2. 当下GIS系统中有哪些常见的高程格式 3. 课程体体系中使用的哪种格式 4. 高程类定义以及实现,并加入到FormatMgr 管理系统中 |
14 | 高程瓦片数据读取 | 1. 介绍GIS系统相关的工具(在数据转换)数据生成方面可以解决大量时间 2. 自定义高程瓦片格式说明 3. 自定义高程格式文件解析,并以智能对象的方式引入到系统中 4. 完善框架代码,适配高程数据 | |
15 | 高程瓦片文件的读取 | 1. 实现基本的读取算法 2. 增加格式化组件,并加入到系统中 3. 配置高程图层以及高程数据源,并加载数据,验证数据正确性 | |
16 | 瓦片数据结构重构 | 1.顶点生成 2.UV坐标计算 3.面数据生成 | |
17 | DEM重构绘制流程 | 1. 修改绘制数据结构,去除无用字段 2. 增加Mesh类,实现光栅数据转换成三角面数据,计算UV数据,提炼接口 3. 修改系统调度,实现顶点数据,UV数据,以及面数据的生成与更新 4. 按需更新数据,而不是每一帧更新 | |
18 | DEM-数据精度问题(CPU) | 1. 因为瓦片数据使用大地坐标作为系统输入,造成瓦片坐标很大,单浮点数据精度不够 2. 使用局部坐标的方式解决单浮点精度问题 3. 调整相机参数,解决投影矩阵数据计算深度精度问题 4. 修改绘制shader 实现对瓦片数据的绘制 | |
19 | DEM-数据精度问题(LogDepth) | 1. 使用对数深度(log depth )算法在GPU中 计算解决单浮点经纬计算问题 2. 修改shader ,增加对(logDepth)算法支持 3. 修改C++端代码,实现对shader数据的输入 | |
20 | DEM-数据结构优化 | 1.当下使用CPU端数据通过接口的方式传递给GPU,速度慢 2. 使用Instance 方式降低Vertex Buffer 的大小,优化渲染系统 | |
21 | DEM-GPU缓冲区优化 | 1. 使用Vertex Buffer Object / Index Buffer Object / Instance 方式优化渲染系统 2. 修改绘制接口,使用DrawElementsInstanceBaseInstance方式提升系统性能 | |
内存池与对象池 | 22 | 瓦片生成优化/对象池 | 1. 相机移动过程中会频繁的建立与释放瓦片,对CPU有较大的消耗 2. 引入内存池,避免频繁的内存申请与释放,降低CPU时间 3. 改造智能指针对象,对象释放通知到内存管理,回收对象内存 |
23 | 改造任务系统支持对象池 | 1. 任务系统是一个公用模块,被多个模块使用,避免频繁的内存操作,引起的内存碎片 2. 实现对象池,并应用到任务模块 | |
法线计算 | 24 | 法线计算 | 1. 修改现有顶点结构,增加法线支持 2. 修改shader,增加法线顶点输入,使用平行光光照模型 3. 修改绘制流程,支持光照计算,使用探照灯作为光源输入 |
25 | 顶点法线计算/共享法线计算 | 1. 增加数据结构保存顶点数据被多个面共享的次数 2. 计算面法线,并累加到顶点法线中 3. 根据顶点被面共享的次数做平均法线计算 4. 修改流程,按需更新法线数据 | |
26 | 法线数据压缩 | 1. 法线数据使用3 * float 数据存储,大大的增加了系统的数据 2. 实现算法,将3 * float 数据压缩成4字节数据 3. 改造绘制代码,支持压缩数据输入 | |
27 | GPU中计算产生法线数据(去掉CPU中计算) | 1. 引擎支持 Geometry Shader 阶段 2. 编写 Geometry Shader,实现法线计算 | |
系统功能优化 | 28 | 重构CPU拾取流程 | 1. 当下的拾取流程,只支撑二维数据拾取,无法准群的拾取三维数据 2. Terrain中增加拾取接口,输入射线,输出拾取到顶点数据 |
29 | 绘制拾取结果 | 1. 增加一个绘制点的方法,实现绘制代码 2. 修改shader,增加logdepth 3. 调试代码,花费了很多时间排查错误,最总排查到是因为uniform参数笔误写错造成。 | |
30 | 任务系统完善,避免任务队列无线膨胀 | 1. 任务系统中,没有限制队列的大小,生产者的能力远大于消费者的能力,造成任务队列膨胀 2. 处理办法,限制生产者的生产能力,而不是限制任务队列大小(这种方式会造成业务逻辑异常复杂) 3. 使用sleep休眠方式(这种方式是严重错误的) | |
31 | 如何避免瓦片数据抖动 | 1. 产生瓦片抖动的原因 ? 分裂算法与回退算法中间没有过度 2. 引入过度流程,避免内存抖动,参数因子是一个重要的数据,需要谨慎使用 3. 有必要结合瓦片自身数据动态计算参数因子 | |
32 | 瓦片数据管理-fepk文件格式支持-全球数据加载 | 1. 支持fepk文件格式,增加fepk读取组件,适配fepk文件 2. fepk管理数据方式:一般情况选择全球前10级别作为基础级别,因数据量不大(1G)左右,后续以8级作为基础级别,全球19级别数据被划分为 2^8 * 2^7(512 * 256)个块。每个块中包含了256 * 256 张小瓦片 | |
33 | fepk高程数据读取 | ||
34 | 高程分裂处理 | 当瓦片没有高程数据,那么子节点以及其他后代节点该如何共享父节点的数据 | |
35 | lesson-734-高程瓦片分裂处理(2)-算法实现 | 高程数据分裂算法实现 实现对高程数据的切分,并对特殊数据进行处理 | |
36 | 高程瓦片分裂处理(3)-问题排查 | ||
37 | 高程瓦片分裂处理(4)-(后代节点更新问题) | 当一个瓦片高程数据更新后,他的儿子节点,孙子节点...该如何处理? | |
38 | 瓦片视锥裁剪错误 | 高程数据更新后,没有技术计算瓦片包围盒信息,造成包围盒错误,进而引视锥计算错误 | |
39 | http支持 | 1.引入三方库 Libcurl 2.http类封装,支持http读取数据 | |
40 | fepk.server使用 | ||
生成三维地球 | 41 | 改造四叉树-统一使用经纬度输入 | |
42 | 地形网络生成算法重构 | ||
43 | 引入球体坐标系 | 支持球体坐标系,支持从经纬度构造地球仪 | |
44 | 使用球体坐标改造瓦片 | 流程重构,针对三维顶点生成流程,需要保存高度数据。 |
常见问题
问:对数学有要求吗
答:高中数学即可学习
问:需要会C++吗
答:需要有一年左右c++开发经验
问:适合学生学习吗
答:需要有一定编程知识
问:不会C++可以学些吗
答:不可以
问:不会OpenGL可以学习吗
答:不可以
问:需要有地理信息知识吗?
答:不必要
问:是实战课程吗?
答:是的,每一句代码,都是课堂编写
问:是介绍开源代码吗?
答:不是,纯原装,原创
问:课程代码如何下载
答:在资料区下载
问:是类似 osgEarth的地球吗
答:是的
问:是类似cesium的地球吗
答:是的,但是c++开发的
展开更多
{{tips.text}}
{{ noteHeaderTitle }}
笔记{{ hasMyNote ? '我的笔记' : '记笔记' }}
{{ hasMyNote ? '我的笔记' : '记笔记' }}
优质笔记
更新于:{{ $dayjs.formate('YYYY-MM-DD HH:mm:ss', item.last_uptime*1000) }}
{{ detail.username }}
公开笔记对他人可见,有机会被管理员评为“优质笔记”
{{ noteEditor.content.length }}/2000
公开笔记
保存提问
讲师收到你的提问会尽快为你解答。若选择公开提问,可以获得更多学员的帮助。
记录时间点
记录提问时视频播放的时间点,便于后续查看
公开提问
提交课程大纲
自动连播
94课时
OpenGL-自主高性能三维GIS平台架构与实现-第二季
15054人学习
CJ老师
5.0
¥2999.00
35课时
OpenCV图像处理视频课程
380975人学习
贾志刚
4.7
¥99.00
32课时
OpenCV For Android基础入门实战视频课程
109389人学习
贾志刚
4.9
¥109.00
69课时
【夏曹俊】c++实战学习OpenCV3.2+QT5+ffmpeg实战开发视频编辑器视频教程
106245人学习
夏曹俊
5.0
¥168.00
64课时
目标检测-YOLO-V4基于PyTorch从零复现(与行人车辆检测实战)
79380人学习
小超老师
5.0
¥158.00
102课时
计算机视觉-Opencv项目实战(Python版)
79249人学习
唐宇迪
5.0
¥298.00
56课时
OpenCV4 图像处理与视频分析实战教程
66076人学习
贾志刚
4.7
¥199.00
15课时
OpenCV图像处理-小案例实战教程
58594人学习
贾志刚
5.0
¥119.00