Earth架构设计和思路
一、全球网格
1、基于经纬度的分层网格
地球网格采用分层策略,整个地球网格分成若干层,每一层代表不同分辨率的地球,第一层分辨率最低。
(1)第一层是球体网格,用来表示全球地形。
(2)第二层从本初子午线处将地球网格一分为二,成为两个半球网格用来表示东半球和西半球。
(3)第三层将第二层中的每一个网格按照经纬度平均分成4份,一共八份。
(4)之后的网格都是在前一层的基础上按照经纬度一分为4。
图1
2、瓦片网格
(1)构建瓦片网格
经过基于经纬度的分层之后,全球网格被划分成了多个部分,每一个部分称为一个瓦片,在构建瓦片的时候我们只需要知道瓦片的最小经纬度和最大经纬度就可以了。在构建瓦片网格时,我们采样基于经纬度的均匀网格的方式构建。
图2
在构建网格时,我们从瓦片 左上角开始构建,将瓦片按照经纬度平均分为32行、32列,那么每行每列就有33个顶点。然后我们将构建基于这些顶点构建三角形索引。
(2)构建瓦片网格的法线
构建瓦片网格法线,就是为每一个顶点计算发现,有两种方案可以构建法线。
1)让所有顶点的法线都指向球心的反方向。将顶点和圆心连线,从圆心指向顶点的向量就是顶点的法线。这种方案的优点是性能高、难度低,缺点是不能很好的表现地行起伏的光影效果。
图3
2)根据顶点周围的点来计算法线。这种方案的优点是可以很好的表现地形起伏的光影效果,缺点是难度较大、效率较低。
图4
3、瓦片的uv
瓦片的uv以左上角为原点,右下角为(1,1)点,每一个网格根据在瓦片中的相对位置均匀的设置uv坐标。
图5
4、裙边
因为瓦片之间可能会产生高度没有精确对齐,就会导致瓦片之间产生裂缝而影响视觉效果,我们可以采用裙边的方式来解决。在瓦片的四周向地心方向构建一层网格围绕瓦片,这样裂缝问题就在视觉上就不会太突出了。裙边的uv可以直接用相邻边上的点的uv,法线则全部指向球心的反方向。
图6
二、数据管理
1、多分辨率金字塔
我们将全球卫片资源和全球地形资源分层若干层,第一层表示全球,分辨率为1024x512,第二层将全球分割成东西两个半球,分辨率分别为512x512,第三层将上一层的每个资源再次分割成相等的四分,分辨率为512x512,以此类推组成多分辨率金字塔。每一层用一个文件夹表示,文件夹的名字就是这个层的号码,文件夹内的文件使用y_x的规则进行命名。如果希望访问某一层的某一块资源可以直接使用资源路径“类型/层/行_列.后缀名”来访问资源。
图7(卫片)2、远程服务、本地缓存
地球服务需要海量的资源,为了加快资源的访问速度,我们采用了远程服务加本地磁盘缓存、内存缓存的策略。我们把海量的资源部署在远程服务器上,当客户端需要访问资源的时候,首先会在内存中寻找,如果找到了就会立刻使用资源,如果资源不在内存中则客户端会在磁盘的缓存目录下寻找,如果资源存在则加载资源到内存中,如果资源不存在则客户端会向服务器发送资源请求指令、远程服务器收到资源请求时便会向请求方发送资源。
图8
三、可视化
1、数据裁剪
数据裁剪主要是利用视锥体裁剪。根据摄像机的位置、视野、远近裁剪面,便可构建一个视锥体。然后测试物体是否在视锥体的范围内,如果在范围内就渲染,如果不在范围内就不去渲染。视锥体裁剪可以直接减少需要渲染的多边形的数量。
图9
2、多层次细节
全球地形包含了海量的数据,当摄像机距离地形某个瓦片很远的时候,只需要渲染其对应的低分辨率版本即可,当某个瓦片距离很近时我们可以渲染其对应的高分辨率版本。
图10
1)四叉树
四叉树是一种树形数据结构,每一个非叶子节点都会包含四个子节点。地球表面的分层瓦片正好可以使用四叉树结构来表示。
构建一个根节点,根节点表示整个地球的第一层。第二层节点比较特殊,因为地球的第二层是分为东西两个半球的,所以这里的底层节点应该是两个节点,分别对应东西两个半球。第三层节点在上一层 基础上每个节点可以包含四个子节点,以此类推。每一个节点拥都拥有层级、x坐标、y坐标。我们根据这些给定信息可以计算出节点的最小经纬度和最大经纬度、还要计算中心点的经纬度,然后还要计算出中心点的坐标。
2)四叉树的分割
我们根据摄像机和每个节点的距离来判断这个节点是否需要分裂成更高分辨率的子节点。计算方式是取节点中心到摄像机的距离和节点的层级进行比较,小于阈值就继续分裂,大于阈值就不在分裂。
图11
3)动态加载资源
资源的加载会导致主线程的卡顿,从而导致导致画面的卡顿,影响用户体验,我们使用了异步的方式来去加载所有所需的资源。我们使用了一个异步队列,所有的资源加载任务会先放入任务队列中,异步处理器会在子线程中从异步队列中取出加载任务,当任务完成时,会调用主线程的回调来做后续处理。
图12# 欢迎使用Markdown编辑器
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:
全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;全新的 KaTeX数学公式 语法;增加了支持甘特图的mermaid语法1 功能;增加了 多屏幕编辑 Markdown文章功能;增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;增加了 检查列表 功能。撤销:Ctrl/Command + Z 重做:Ctrl/Command + Y 加粗:Ctrl/Command + B 斜体:Ctrl/Command + I 标题:Ctrl/Command + Shift + H 无序列表:Ctrl/Command + Shift + U 有序列表:Ctrl/Command + Shift + O 检查列表:Ctrl/Command + Shift + C 插入代码:Ctrl/Command + Shift + K 插入链接:Ctrl/Command + Shift + L 插入图片:Ctrl/Command + Shift + G 查找:Ctrl/Command + F 替换:Ctrl/Command + G
直接输入1次#,并按下space后,将生成1级标题。 输入2次#,并按下space后,将生成2级标题。 以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。
强调文本 强调文本
加粗文本 加粗文本
标记文本
删除文本
引用文本
H2O is是液体。
210 运算结果是 1024.
链接: link.
图片:
带尺寸的图片:
居中的图片:
居中并且带尺寸的图片:
当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.
// An highlighted block var foo = 'bar';一个简单的表格是这么创建的:
项目Value电脑$1600手机$12导管$1使用:---------:居中 使用:----------居左 使用----------:居右
第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPEASCIIHTMLSingle backticks'Isn't this fun?'‘Isn’t this fun?’Quotes"Isn't this fun?"“Isn’t this fun?”Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash一个具有注脚的文本。2
Markdown将文本转换为 HTML。
您可以使用渲染LaTeX数学表达式 KaTeX:
Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五这将产生一个流程图。:
链接 长方形 圆 圆角长方形 菱形 关于 Mermaid 语法,参考 这儿,我们依旧会支持flowchart的流程图:
Created with Raphaël 2.2.0 开始 我的操作 确认? 结束 yes no 关于 Flowchart流程图 语法,参考 这儿.如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入, 继续你的创作。
mermaid语法说明 ↩︎
注脚的解释 ↩︎