技术领域
本发明可用于三维模型可视化,尤其是大规模场景、模型数量较多的情况。尤其涉及一种动态细节层次模型实现的方法。
背景技术:
在三维空间地理信息可视化系统中,大规模三维模型的可视化作为其重要的组成部分,广泛应用在数字城市、数字交通、数字海洋等领域中。三维模型具有灵活度高、展示性好等优点,能够极大的增加可视化的真实感和沉浸感。但是,一方面,三维模型的真实性往往取决于模型网格的精细程度和纹理的分辨率,一个精细的模型往往拥有百万级别的三角面片和数百兆大小的纹理贴图。另一方面,三维空间地理信息可视化系统往往具有场景范围大、模型数量多等特点,一个数字城市可能需要展示十万级数量的楼宇,一个数字交通应用有可能需要展示百万级数目的车辆。
在大规模场景下,显示海量的精细三维空间模型对系统的渲染能力、存储能力、网络传输能力等都带来了极大的挑战,甚至会由于内存、I/O、计算等方面的限制导致系统的卡顿和崩溃。
细节层次模型,也称LOD模型,是一种实时的三维计算机图形技术。细节层次模型能够做到当用户视点离物体较近时,能观察到模型的细节,当用户视点逐渐远离模型时,观察到的细节逐渐模糊。细节层次模型可以避免因绘制意义相对不大的细节而造成的时间浪费,提高复杂场景的生成和显示速度。细节层次模型在交互式可视化、虚拟现实等领域得到了广泛的应用,细节层次模型有静态和动态之分。
静态细节层次模型是一种较简单的细节层次模型。它通过模型网格简化算法预先生成一个或一组独立的、有不同精细度的简化模型。这些简化模型一般按照由精细到粗糙的顺序排列,互相之间没有外在的联系。系统根据不同场合的需要,从这组静态模型中选用一个最合适的模型供绘制使用。
静态细节层次模型可以减少可视化时CPU的计算压力,使用方便,绘制快捷。但是静态细节层次模型不能得到任意分辨率的模型,静态细节层次模型的层数越多,存储压力也越大。而且,由于不同精细度的逼近模型中三角形数目往往相差很大,因此在层次之间切换就会产生“跳跃”的视觉效果,影响用户体验。
动态细节层次模型则需要事先创建适当的数据结构,在实际应用的时候,按用户的需求从该数据结构中提取相应的层次细节,并生成适合当前需要的简化模型。动态次节层次模型中每个模型的简化程度不是预处理的时候固定的,而是由模型之外的因素决定,例如用户的视点距离。
由于动态细节层次模型可以实时地得到任意分辨率的近似模型,所以动态细节层次模型不需要保存多个副本,可以大大减轻存储压力,并且在用户浏览时做到层次平滑切换,增强用户体验。但是动态层次模型对模型实时生成的速度却有着较高的要求。
技术实现要素:
为了克服背景技术中存在的缺陷,本发明解决其技术问题所采用的技术方案是:一种动态细节层次模型实现的方法,其特征在于包括对模型的预处理和对自定义文件解析两部分:
1. 对模型的预处理:
1.1.找出最小度量误差的顶点序列;
1.2.保存被删除点旧id和新id的对应permutation[vertex[i]->id]= vertex.num-1;
1.3.保存替代顶点的旧id到map[vertex.num-1];
1.4.对折叠代价或度量误差最小的顶点序列进行半边折叠,并更新被删除点的邻居点的度量误差;
1.5.步骤1.1到步骤1.4循环vertex.num次;
1.6.利用permutation数组将map中的替代顶点的旧id替换为新id,map[i] = permutation[map[i]];
1.7.利用permutation数组对顶点按重要度进行排序,将三角形三元组的旧id替换为新id;
2.解析自定义文件
2.1. 用原模型顶点数vert.num乘以精简度percent得到新模型的顶点数vert.num * percent,取出前vert.num * percent个顶点;
2.2. 对三角形序列的三个顶点序号tri.at(i).t[0],tri.at(i).t[1],tri.at(i).t[2],分别根据map折叠数组快速找到替代顶点序号;
2.3. 如果三角形序列的三个顶点序号tri.at(i).t[0],tri.at(i).tri[1],tri.at(i).tri[2]有相同的,则表示这个三角形无效;
2.4. 根据前vert.num * percent个顶点和有效三角形得到任意比例的模型,最终实现动态细节层次模型。。
本发明通过预处理对顶点按重要程度排序并保存折叠序列,能快速生成任意比例的模型,符合实现动态细节层次模型的要求。
具体实施方式
一种动态细节层次模型实现的方法,其特征在于包括对模型的预处理和对自定义文件解析两部分:
1. 对模型的预处理:
1.1.找出最小度量误差的顶点序列;例如u->v,称u为被删除顶点,v为代替顶点;
度量误差可以使用二次误差来进行度量。假设顶点u折叠到顶点v,则基于二次误差的半边折叠的度量误差为u到所有包含顶点v的三角平面的距离之和。一个三维空间中的三角平面可以用方程ax + by + zc + d = 0(其中a2 + b2 + c2 = 1)来表示,令p = [a b c d]T代表包含顶点v的一个平面,点u的坐标为[x y z 1]T,则点u到三角平面p距离的平方为:
其中:
令
为点v的二次误差测度矩阵,其中为所有包含顶点v的三角面的集合。
度量误差为:
1.2.保存被删除点旧id和新id的对应permutation[vertex[i]->id]= vertex.num-1;
1.3.保存替代顶点的旧id到map[vertex.num-1];
1.4.对折叠代价或度量误差最小的顶点序列进行半边折叠,并更新被删除点的邻居点的度量误差;
对顶点对uv进行半边折叠,去除既包含顶点u又包含顶点v的三角形或以uv为边的三角形。然后,更新所有剩下的三角形,把所有用到顶点u的地方都用顶点v代替,移除顶点u。更新顶点u邻居点的度量误差。
1.5.步骤1到步骤4循环vertex.num次;
1.6.利用permutation数组将map中的替代顶点的旧id替换为新id,map[i] = permutation[map[i]];
1.7.利用permutation数组对顶点按重要度进行排序,将三角形三元组的旧id替换为新id;
1.8.预处理后,顶点id和重要度是一致的,也就是是说顶点是有序的。越重要的顶点,顶点编号越小;越不重要的顶点,顶点编号越大。而map中则记录着折叠序列。对顶点数组按id写入自定义文件,并将三角形三元组和map数组写入自定义文件。
2.解析自定义文件:
2.1.用原模型顶点数vert.num乘以精简度percent得到新模型的顶点数vert.num * percent,取出前vert.num * percent个顶点;
2.2.对三角形序列的三个顶点序号tri.at(i).t[0],tri.at(i).t[1],tri.at(i).t[2],分别根据map折叠数组快速找到替代顶点序号;
2.3.如果三角形序列的三个顶点序号tri.at(i).t[0],tri.at(i).tri[1],tri.at(i).tri[2]有相同的,则表示这个三角形无效。
2.4.根据前vert.num * percent个顶点和有效三角形得到任意比例的模型。
本发明通过预处理对顶点按重要程度排序并保存折叠序列,能快速生成任意比例的模型,符合实现动态细节层次模型的要求。
显然,上述实施例仅仅是为清楚地说明所作的举例,而并非对实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。而由此所引伸出的显而易见的变化或变动仍处于本发明创造的保护范围之中。