网格简化 一、 常见减面算法简介

因为最近公司的项目需要所以研究了一下减面,因为之前减面是调用的第三方的api基于别人的平台所以公司现在想自己做一个出来。不过一句话没有最优的算法都是看需求来的,而且往往还是需要与LOD相互结合起来的~

网格简化可以减少网格的三角片数量,同时尽量保持住网格的几何信息或其它属性(如纹理)。它是网格处理里的经典问题,广泛应用于各个领域:
* 游戏领域:游戏场景里的网格都很简单,适合快速渲染;简单的模型也适合快速的物理碰撞检测
* 多分辨率加载模型(Level of Detail)
* 三维模型的网页展示

进行网格简化的原因大概有几个方面:

  1. 节省存储空间每个三角面在空间储存的大小是一样的,减少三角面的数目,就减少了模型保存的文件大小,如果进行网络传输则大大缩短网络传输时间。
  2. 简化后续处理步骤如果后续要对模型进行一些计算,例如贴纹理,在最终效果基本上不变的情况下,计算时间会大量的缩短。
  3. 节省渲染时间当我们想要显示模型的时候,需要对模型的每个三角面进行空间渲染,需要大量的计算,三角面的数目减少,在不影响显示效果的情况下,会大大的减少渲染计算的负担。对于一个500MB的模型,一般4G内存的显卡就已经能感觉到卡顿了。所以如果玩高逼真的主机游戏还是需要非常厉害的显卡的。
  4. 去除不需要不关心的细节部分比如对于一面墙,墙上有一些小凹凸,但是对用使用者来说并不关系,更希望能够删除掉这些部分,来优化视觉效果,网格简化通常能够达到这些效果。

在了解到什么是网格简化以及为什么要进行网格简化后,那么什么时候一个好的网格简化算法呢?一个好的网格简化算法,需要在这几个方面进行度量:
* 简化后网格与初始网格的相似度,越高越好
* 简化到同等网格数,时间越短越好
* 在同等相似度下,网格数目越少越好

基本的删除方法:

**顶点删除法:**删除网格中的一个顶点,然后对它相邻三角形形成的空洞,进行三角刨分
在这里插入图片描述

**删边(边坍塌 折叠法):**将网格里面的一条边压缩为一个顶点,退化了该边相邻的两个三角形

在这里插入图片描述

**删面(三角面片坍塌):**将网格内的一个面片收缩为一个顶点,退化了该面片以及临边的三个面片
在这里插入图片描述

参考资料

塌边法QEM算法

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,有许多可以用于网格简化算法。其中一种常见算法是Quadric Error Metric(QEM)算法。下面是一个简单的示例代码,演示了如何使用QEM算法对一个三角形网格进行简化: ```matlab % 导入网格数据 [vertex, face] = readMesh('input.obj'); % 计算每个顶点的法向量 normal = computeNormals(vertex, face); % 计算每个面片的初始误差度量 qem = computeQEM(vertex, face, normal); % 设定简化后的顶点数量 targetVertexCount = 1000; while size(vertex, 1) > targetVertexCount % 找到最小误差度量的边 [minQEM, minIdx] = min(qem); [v1, v2] = findEdge(face(minIdx, :)); % 合并边上的两个顶点 newVertex = (vertex(v1, :) + vertex(v2, :)) / 2; vertex(v1, :) = newVertex; % 更新相邻面片的误差度量 adjacentFaces = findAdjacentFaces(face, v1, v2); qem(adjacentFaces) = computeQEM(vertex, face(adjacentFaces, :), normal(adjacentFaces, :)); % 删除边上的顶点和相应的面片 vertex(v2, :) = []; face(minIdx, :) = []; % 更新剩余面片的索引 face(face > v2) = face(face > v2) - 1; % 更新剩余顶点的索引 vertex(v2:end, :) = vertex(v2+1:end, :); qem(v2:end) = qem(v2+1:end); end % 将简化后的网格保存到文件 writeMesh('output.obj', vertex, face); ``` 这只是一个简单的示例,实际的网格简化算法可能更加复杂。你可以根据自己的需求修改和扩展这个示例代码。同时,你还需要实现一些辅助函数,例如`readMesh`用于读取网格数据,`computeNormals`用于计算法向量,`computeQEM`用于计算误差度量,`findEdge`用于找到边的两个顶点,`findAdjacentFaces`用于找到相邻面片等等。 希望能帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值