精华内容
下载资源
问答
  • 网格简化算法研究.pdf

    2020-09-12 08:09:34
    网格简化算法研究 摘 要 多边形几何模型变得越来越复杂这无疑给三维物体的实时绘制带来不便 于是网格简化算法成为目前计算机图形学领域的重点研究之一它以算法简化 速度数据结构存储的有效性误差控制等作为衡量标准...
  • 第20卷 第5期2000 年10月北京理工大学学报JournalofBeijingInstituteofTechnologyVol.20 No.5Oct.2000 文章编号:100120645(2000)0520607206 基于二次误差度量的网格简化算法 吴亚东, 刘玉树, 高春晓 (北京理工大学...
  • 基于八叉树的网格简化算法实现 能正常的运行和对网格进行简化
  • 对水平集网格简化算法和现常用的基于点对收缩的网格简化算法在视觉质量和几何误差方面做了比较和分析,实验表明该方法适用于任意拓扑形状的网格模型,使得模型大规模简化后,在保持较低误差的同时,仍然能够保持相当...
  • 这次介绍的是一种比较简单的网格简化算法,叫做顶点聚簇。   网格简化  为了介绍这个算法,首先说明一下网格简化算法。随着计算机绘图在现代科技领域中的广泛应用, 计算机图形在现代制造业中发挥着重要...

    前言

      本篇接顶点去重那一篇,继续使用哈希表来实现网格算法。这次介绍的是一种比较简单的网格简化算法,叫做顶点聚簇。

     

    网格简化

      为了介绍这个算法,首先说明一下网格简化算法。随着计算机绘图在现代科技领域中的广泛应用, 计算机图形在现代制造业中发挥着重要的作用。计算机图形学中对模型的要求更加精密, 也更加复杂, 生成的面片数也更加庞大, 庞大的数据量必然对计算机的计算能力提出更高要求, 对模型的生成也带来更多困难[。为此, 需要对重建得到的复杂的数学模型进行简化, 以减少数据量和数据模型的复杂程度, 这就使得网格简化的提出成为必然。模型简化也称数据缩小或数据删减, 对于实时应用来说, 通常需要这个过程来减少存储的顶点数并将这些顶点发送到图形管线。网格简化的目的是在尽量保持原模型可视特征的条件下, 减少模型的多边形数目。

     

    网格简化方法之顶点聚簇网格削减

      顶点聚簇方法又被叫做顶点聚类。顶点聚簇方法的原理首先是将原模型统一归于一个大区域,然后对大区域进行划分,使得小区域中包含了许多散落其中的顶点,再将此区域中的顶点合并,形成新的顶点,再根据原始网格的拓扑关系,把这些顶点三角化后,从而得到简化模型。下图也可以生动的说明顶点聚簇的原理。

      顶点聚簇是比较简单高效的网格简化算法,不过缺点是生成结果的质量不如其他的网格简化算法。

     

    使用顶点聚簇来简化SMC算法生成的网格

      由于SMC算法生成的网格顶点坐标都是基于原来三维图像中的体素索引,所以这些顶点都可以看作是处在单位长度为1的笛卡尔网格之上。坐标范围则是从(0,0,0)到(Mesh的X最大值,Mesh的Y最大值,Mesh的Z最大值),所以实际上这样的网格可以当作已经被单位长度为1的正方体区域所划分了。这样假如想要进行顶点聚簇简化,就需要用一个大于1的浮点值为边长再来给空间划分正方体区域,这个值是用户提供的参数,下文用unitLength来指代这个参数,表示它是新的单位长度。同时不难想到unitLength越大,网格削减的越厉害。

      算法可以采用在“浅议顶点焊接”一篇中的哈希表来实现,这个哈希表的作用就是为三维空间中的整点提供快速存储与查找。在顶点聚类算法中,我们可以将在一个新正方体单位区域的点都合并为一个点并存入这样的哈希表中。这样我们就能将新的点重新存在新的Mesh中,而原来的三角形用同样的道理来替换其中点的索引,最后将位退化的三角形存在新Mesh的三角形表中。

      综上所述,用C#实现算法的代码如下:

    复制代码
    public class VertexCluster
    {
        Mesh mesh;
        public VertexCluster(Mesh mesh)
        {
            this.mesh = mesh;
        }
        public void Clear()
        {
            mesh = null;
        }
        public void ExecuteSimplification(float unitLength)
        {
            if (unitLength <= 1)
            {
                return;
            }
            Mesh newMesh = new Mesh();//新建Mesh存放削减后的网格
            Box3Float box = mesh.GetBox3();//首先获取Mesh的空间范围 XYZ方向的最大最小值存在box中
            int resx = (int)((box.Max3[0] - box.Min3[0]) / unitLength) + 1;
            int resy = (int)((box.Max3[1] - box.Min3[1]) / unitLength) + 1;
            int resz = (int)((box.Max3[2] - box.Min3[2]) / unitLength) + 1;
            //在新的单位长度下,得出新空间划分出的每一维的长度
    
            HashTable_Double2dArray<int> hash = new HashTable_Double2dArray<int>(resx+1, resy+1, resz+1);
            //创建hash表,这里使用的是双二维数组哈希表
    
            for (int i = 0; i < mesh.Vertices.Count; i++)
            {
                Point3d p = mesh.Vertices[i];
                int xindex = (int)((p.X - box.Min3[0]) / unitLength);
                int yindex = (int)((p.Y - box.Min3[1]) / unitLength);
                int zindex = (int)((p.Z - box.Min3[2]) / unitLength);
                //计算点在新单位长度下的坐标
                int value = 0;
                bool hasValue = hash.GetHashValue(xindex, yindex, zindex, ref value);
                if (!hasValue)
                {
                    hash.SetHashValue(xindex, yindex, zindex, newMesh.Vertices.Count);
                    newMesh.AddVertex(new Point3d(xindex, yindex, zindex));
                }//新单位长度下肯定有原来不同的点映射到相同的位置,
                //总是添加第一次映射到这个位置的点入Mesh,之后的不再添加
            }
            for (int i = 0; i < mesh.Faces.Count; i++)
            {
                Triangle t = mesh.Faces[i];
                Point3d p0 = mesh.Vertices[t.P0Index];
                Point3d p1 = mesh.Vertices[t.P1Index];
                Point3d p2 = mesh.Vertices[t.P2Index];
                int xindex0 = (int)((p0.X - box.Min3[0]) / unitLength);
                int yindex0 = (int)((p0.Y - box.Min3[1]) / unitLength);
                int zindex0 = (int)((p0.Z - box.Min3[2]) / unitLength);
                int index0 = 0;
                hash.GetHashValue(xindex0, yindex0, zindex0, ref index0);
    
                int xindex1 = (int)((p1.X - box.Min3[0]) / unitLength);
                int yindex1 = (int)((p1.Y - box.Min3[1]) / unitLength);
                int zindex1 = (int)((p1.Z - box.Min3[2]) / unitLength);
                int index1 = 0;
                hash.GetHashValue(xindex1, yindex1, zindex1, ref index1);
    
                int xindex2 = (int)((p2.X - box.Min3[0]) / unitLength);
                int yindex2 = (int)((p2.Y - box.Min3[1]) / unitLength);
                int zindex2 = (int)((p2.Z - box.Min3[2]) / unitLength);
                int index2 = 0;
                hash.GetHashValue(xindex2, yindex2, zindex2, ref index2);
    
                if (!(index0 == index1 || index0 == index2 || index1 == index2))
                {
                    newMesh.AddFace(new Triangle(index0, index1, index2));
                }
                //对于每个三角形,找出其三点对应的新位置,检查是否有两个点重合(退化),
                //添加不退化的三角形
            }
            for (int i = 0; i < newMesh.Vertices.Count; i++)
            {
                Point3d p = newMesh.Vertices[i];
                p.X = (float)(unitLength * p.X + box.Min3[0]);
                p.Y = (float)(unitLength * p.Y + box.Min3[1]);
                p.Z = (float)(unitLength * p.Z + box.Min3[2]);
            }//将新Mesh的坐标放大到和原来一样的尺度
            mesh.Clear();
            mesh.Vertices = newMesh.Vertices;
            mesh.Faces = newMesh.Faces;
            //替换旧Mesh的数据
        }
    }
    复制代码

     

    算法测试

      数据采用Engine数据,下表展示了算法的结果。

    - 简花前   简化后
    数据预览  
    顶点数 216147   110910
    三角形数 432370   220528
    单位长度 1.0   1.5
    削减比例(顶点) -   48.7%
    削减比例(三角形) -   49.0%

      可以看出,顶点聚簇算法均匀的减少了三角网格的密度。

    展开全文
  • 根据Garland的QEM算法提出了一种快速的网格模型简化算法。算法使用顶点权值来表示顶点的重要程度,顶点权值可以将收缩的边所影响的范围控制在较小的区域内;顶点的权值被存储在一个优先权队列中并且利用优先权队列来...
  • 在游戏开发中,我们有时需要对美术同学给出的模型进行简化。目的是在减少面数的同时,尽可能的维持模型的外观。这种技术可以用在LOD(Levels of Details)上,当模型与摄像机的距离大于一定值之后,使用面数较少的...

    在游戏开发中,我们有时需要对美术同学给出的模型进行简化。目的是在减少面数的同时,尽可能的维持模型的外观。这种技术可以用在LOD(Levels of Details)上,当模型与摄像机的距离大于一定值之后,使用面数较少的模型来代替高模,这样可以减少GPU带宽消耗和渲染压力。


    简化分为三种:

    1. 静态的;
    2. 动态的;
    3. 视角依赖的。

    通常情况下,我们会让美术提供面数不同的几个模型,或者我们使用工具对高模进行减面并存成多个Mesh,然后在游戏运行的时候,根据模型与摄像机的位置关系,动态的替换Mesh。这是一种静态的方法。

    本文将讨论一种动态的网格简化算法。这种算法的好处在于,美术只需要提供一个高模,程序便可以自动的生成量级不同的低模。

    原文链接:
    http://dev.gameres.com/Program/Visual/3D/PolygonReduction.pdf(感谢UWA答主马古斯提供的文章和思路)

    三角边坍缩

    这里使用了三角边坍缩的方法来进行网格简化,将两个顶点合并成一个顶点,如图所示:
    请输入图片描述
    对于要坍缩的边uv,删除这条边两侧的面A和面B,用v来替换u,连接v和u的其他邻居点,并删除u。其中v称为u的坍缩目标。

    对于一个实体模型(具有封闭的边界,根据边界可以将空间分为模型内部和模型外部两部分),一次坍缩,可以移除两个三角面,三条边和一个顶点。通过反复的迭代,最终就会使模型简化到预期的面数。

    但是如何选择要移除的点,才能尽可能小的影响模型的外观呢?这里就需要用到坍缩代价计算公式:
    请输入图片描述
    其中Tu是包含顶点u的三角形的集合,Tuv是同时包含顶点u和顶点v的三角形的集合。

    上面公式表示将u坍缩到v(移除u)所需要的代价。第一部分是边的长度,直观上讲,在模型简化过程中,小的细节应该优先被移除。第二部分是u点周围的曲率变化,理论上曲率变化越小的顶点,所处的区域越平坦,应该优先被移除。需要注意的是,将u坍缩到v和将v坍缩到u的代价可能不一样。

    通过这个公式,我们就可以对每个点计算坍缩到其相邻点的代价,然后选取坍缩代价最小的相邻点作为其坍缩目标。


    实现细节

    根据以上的描述,可以将实现分为以下步骤:

    1.搜集顶点、三角面和三角边的关系;
    2.计算坍缩代价和坍缩目标,并排序;
    3.替换坍缩代价最小的点,并重新计算相邻点的坍缩代价和坍缩目标,更新有序列表;
    4.判断当前顶点数量是否大于目标数量,是则重复第3步。
    请输入图片描述
    显然,在游戏中实时的进行以上步骤是不现实的,尤其是第2步,相当于对整个模型的所有顶点遍历了多次。所以,要将它拆分成离线烘焙和运行时两个部分。


    离线烘焙

    离线烘焙会输出两个int数组:permutation和vertex_map。

    步骤:

    1)收集顶点信息:主要是顶点位置和index,另外需要初始化两个列表:包含顶点的三角面列表和顶点的邻居列表;
    2)收集三角面信息:获取每个三角面所包含的三个顶点,并计算法线(用于计算曲率);同时,将该三角面加入顶点的三角面列表,并将每个顶点加入另外两个顶点的邻居列表中去;
    3)计算顶点与其邻居点的坍缩代价,选择坍缩代价最小的邻居点作为坍缩目标;
    4)依据坍缩代价对所有的顶点进行排序;
    5)替换坍缩代价最小的顶点:获取坍缩代价最小的顶点u及其坍缩目标顶点v,遍历u的三角面列表,如果包含v就删除该三角面,否则将u替换为v。重新计算u的邻居点的坍缩代价和坍缩目标,并更新列表;
    6)令permutation[u.index] = 当前顶点数量,令vertex_map[u.index] = v.index (如果没有坍缩目标,则赋值为-1);
    7)判断当前顶点总数是否大于0,是则重复第5步。

    permutation保存了每个顶点被移除的倒数次序(1是最后被移除的,最大的是第一个被移除的),vertex_map保存了每个顶点的坍缩目标的位置。


    运行时

    输入需要绘制的最大顶点数量n。

    步骤:

    1.遍历三角面

    1.1 获得当前三角面的三个顶点的index,即idx0、idx1和idx2。
    1.2 如果permutation[idx0] >= n,则idx0=vertex_map[idx0],否则执行1.5。
    1.3 如果idx0==-1 or idx1 == idx0 or idx2 == idx0,该三角面不参与绘制。同理映射并判断idx1和idx2。
    1.4 返回1.1。
    1.5 当前三角面加入绘制列表。

    2. 根据三角面的数据,整理顶点属性。

    此外,网格的原始信息会被保留,在游戏运行期间,就可以在任意LOD上自由切换。


    细节优化

    为了得到更好的性能和较好的效果,本文还对上面的步骤进行了一下优化:

    1)最小堆排序:离线烘焙第4步中,被移除点的邻居点需要重新计算坍缩代价,也就意味着坍缩列表也会动态变化。所以这里使用最小优先队列(最小堆)来保存顶点和坍缩代价,并且动态调整顶点顺序。(详参:算法导论第3版第6章);

    2)删除不用顶点:为了减少带宽消耗,并提高GPU的Cache命中率,在运行时第2步中,要根据三角面的数据对Mesh的顶点数组(还有uv、uv2、colors、normals、tangents、boneWeights等)和三角面数组进行重新排列。(详参后文的完整实现);

    3)边界点处理:实际操作中,会有两种比较麻烦的情况:一种是不闭合的三角面,例如飘带、披风等。还有一种是两个点拥有相同的位置,但是不同的uv或normal,例如Unity3D的Sphere是有一条接缝的。如果不考虑这两种情况,坍缩的时候,因为没有找到正确的坍缩目标来代替原顶点,就会出现镂空、破损的现象。针对这种处理,在计算坍缩消耗的时候,会将这些边缘点的曲率设为2(可以在编辑器里调整);

    4)内存优化禁术:为了避免每次新建Mesh的vertices等数组,目前使用unsafe的手段来修改数组的大小(感谢UWA答主lujian提供的禁术);

    5)JobSystem:离线烘焙中使用了JobSystem来加速烘焙。


    完整实现

    https://lab.uwa4d.com/lab/5b55ed36d7f10a201fd75b4e


    效果展示

    异特龙

    面数分别为3890(原)、1960、962、459、263。
    请输入图片描述
    请输入图片描述
    请输入图片描述
    请输入图片描述
    请输入图片描述

    巨魔

    面数分别为13432(原)、6723、3415、1634、788。
    请输入图片描述
    请输入图片描述
    请输入图片描述
    请输入图片描述
    请输入图片描述

    参考文献

    1. A Simple, Fast, and Effective Polygon Reduction Algorithm
    2. BunnyLod
    3. MeshSimplify
    4. UWA问答:List的ToArray有什么办法能避免内存分配吗?
    5. Real-Time Rendering, 3rd Edition
    6. 算法导论

    这是侑虎科技第464篇文章,感谢作者凯奥斯供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。QQ群:793972859(原群已满员)。

    作者主页:https://zhuanlan.zhihu.com/commentsofchaos
    作者也是U Sparkle活动参与者,UWA欢迎更多开发朋友加入U Sparkle开发者计划,这个舞台有你更精彩!

    展开全文
  • 本文介绍一种高质量简化网格算法,非常的好。
  • 选取LAB颜色空间作为逆半调处理的颜色空间,选择三阶B样条小波作为小波基,遵循小波分解、小波系数调整、小波重构的小波变换算法,对彩色印刷扫描图像进行逆半调处理,得到逆半调图像。实验结果表明,该算法避免了...
  • 网格模型简化算法

    2012-12-16 20:41:08
    这是一个网格模型的简化算法,使用了二次误差技术。
  • 网格模型简化算法综述 董方敏2 张2 蕊2 刘2 勇2 周学君 三峡大学电气信息学院湖北宜昌2 ! 摘要网格模型的简化是解决复杂三维模型存储传输和实时绘制的有效性与硬件处理能力的局 限性之间矛盾的主要方法1 在分析了...
  • 一种基于离散曲率的网格简化改进算法,鲁洪,苏红旗,本文提出一种基于离散曲率的三角形折叠网格简化改进算法。利用描述三角形形状的内角权值改进Taubin算法,估算三角形顶点的离散高斯
  • 针对三维模型简化后的精度与效率难以平衡的问题进行研究,提出一种局部特征熵的半边折叠非均匀网格简化算法。采用两次局部区域聚类探测,首先探测三维数据点所在边聚类局部区域,获取该探测区域法向量;其次以三维...
  • 网格简化

    千次阅读 2015-10-30 16:24:05
    我实现了Surface Simplification Using Quadric Error Metrics(下面称为Quadric)及A Simple, Fast, and Effective Polygon Reduction Algorithm(下面称为Simple)及中的网格简化算法。程序中使用了堆优化。对于fixed....

    实验目的

    实现边坍塌的网格简化方法。

    实验内容

    我实现了Surface Simplification Using Quadric Error Metrics(下面称为Quadric)及A Simple, Fast, and Effective Polygon Reduction Algorithm(下面称为Simple)及中的网格简化算法。程序中使用了堆优化。对于fixed.perfect.dragon.100K.0.07.obj,简化到1%时,我的机器上Simple需要4.423秒,Quadric需要7.403秒。

    A Simple, Fast, and Effective Polygon Reduction Algorithm

    Buddha

    下面是Buddha.obj的原图: imageimage

    下面是网格简化后的效果图:

    80%80%60%60%40%40%20%20%5%5%

    Fixed Perfect Dragon

    下面是fixed.perfect.dragon.100K.0.07.obj的原图: imageimage

    下面是网格简化后的效果图: 80%80%20%20%5%5%

    Surface Simplification Using Quadric Error Metrics

    下面是5%面片时两个算法生成的模型: Simple 5%Simple 5%Quadric 5%Quadric 5%

    下面是1%面片时两个算法生成的模型: Simple 1%Simple 1%Quadric 1%Quadric 1%

    个人主观感觉Quadric的效果比Simple好。

    目录结构

    src/simple.cc:Simple的实现。

    src/quadric.cc:Quadric的实现。

    均使用C++ 11编写。

    光线追踪

    实验目的

    实现光线追踪算法,产生具有真实感的图像。

    几何图形

    程序中实现了球、平面、三角形、网格等图形。

    三角形

    光线与三角形的相交采用了一个较快的方法:Möbius发明的barycentric coordinates,同时可以用作后面纹理用的UV mapping。

    物体表示

    include/Geometry.hhinclude/geometry/*.hh表示各个抽象的几何图形,Geometry类定义了finite变量表示图形是否为有限的,另外还定义了表示与光线相交的抽象接口getTrace

    getTraceRay为参数,返回表示与光线相交结果的Trace类的实例,Trace类定义了交点位置、与光线原点距离、交点处图形的法向量、交点处的材质等信息。

    Material类表示材质,带有漫反射、折射,及其他各个Phong模型需要用到的参数。

    表示物体的纹理,可以用uv-mapping得到具体的材质信息。

    Prim表示物体,是GeometryTexture两个类的简单组合,它也定义了getTrace方法,实现方法为调用下层的Geometry的同名方法,设置得到的Trace实例的prim变量,使其指向自己。

    物理模型

    Phong反射模型

    采用了裴祥风提出的Phong反射模型。

    折射

    0.45 绝对折射率1.4绝对折射率1.4

    0.45 绝对折射率1.4绝对折射率1.4

    0.45 绝对折射率1.4绝对折射率1.4

    0.45 绝对折射率1.4绝对折射率1.4

    0.45 绝对折射率1.4绝对折射率1.4

    光线能量衰减

    光线初始能量为1.0,在传播过程中能量会衰减。下图是没有光线能量衰减的:

    imageimage

    image

    根据Beer-Lambert law的简化公式:

    视觉效果有一定提升:

    imageimage

    image

    纹理

    所有表示几何图形的类(Geometry)都具有uv方法,用于把改图形上的一个顶点映射到。表示纹理的类Texture具有getMaterial方法,根据uv座标获得相应位置的材质信息。

    imageimage

    image

    加速算法

    包围盒

    对于每根光线,计算和它相交的物体的朴素算法是枚举场景中所有物体,依次和光线计算交点。这可以用包围盒及Kd-tree对空间剖分进行优化。

    包围盒的主要思想是场景中所有物体都有一个包围盒,物体与光线相交仅当包围盒与光线相交。如果把若干物体放在同一包围盒里,而这个大包围盒不与光线相交,那么这个大包围盒里的所有物体都不用判断是否会与光线相交了。

    Kd-tree

    Kd-tree则对这些包围盒做了层次化的划分,每个内部节点都有一个划分平面,把节点表示的空间划分为两半。如果检测到光线与左半空间相交且距离小于光线与右半空间交点距离,那么右半空间就无需考虑了。

    Kd-tree的空间划分方式可以根据两边的物体数目差,也可以用surface area heuristic,实现中我采用了如下公式作为划分平面的估价函数:

    选择使这个股价函数的最优划分平面。

    渲染下面的121个球,对于每根光线枚举所有物体求交点的朴素实现需要5.375秒,使用Kd-tree后仅需0.28秒。

    imageimage

    image

    实现中所有场景中的物体我用一棵Kd-tree管理,对于较大的面片会用一棵局部的Kd-tree管理。

    OpenMP

    程序的主循环枚举了屏幕的各个像素进行光线追踪,注意到不同像素之间互补干扰,可以轻松地在for循环前加上OpenMP的指示符获得多线程优化。

    其他

    Gamma校正

    Gamma校正(Gamma correction)用来光线的辉度或三色刺激值进行非线性的运算,程序提供了几个选项用于控制RGB三个分量的gamma值,通过如下公式计算实际显示的R值(G值、B值类似):

    反锯齿

    反锯齿(anti-aliasing)是一种消除显示器输出的画面中图物边缘出现凹凸锯齿的技术。常规的方法是supersampling,即在像素点附近提高采样密度,差值获得颜色值。实现中采用了stochastic sampling,在像素点附近随机选择一些点,差值获得颜色值。

    另外可以使用adaptive sampling的方法,当像素点的颜色值和周围相差较大时再采用supersampling以提升效率。

    未使用反锯齿未使用反锯齿

    未使用反锯齿

    使用反锯齿(采样值80)使用反锯齿(采样值80)

    使用反锯齿(采样值80)

    展开全文
  • 包含颜色、纹理等附加信息的多维向量, 在Rn空间中用对称Hausdo rff 距离控制网格简化顺序和精度, 既保证了简化 网格模型在几何上与初始网格模型尽可能地相似, 又较好地保存了初始网格模型的颜色、纹理等信
  • The goal of mesh simplific 【实例截图】 【核心代码】 MESHSIMPLE └── 网格简化源码 ├── jmspmesh │ ├── apple.ply │ ├── big_porsche.ply │ ├── cat.ply │ ├── cow.ply │ ├── ...

    【实例简介】

    This program implements four different mesh simplification algorithms. After loading a mesh, the user can easily remove triangles from the mesh and the results are displayed in real time. The mesh can also be rotated and moved closer to or farther away from the viewer.

    The goal of mesh simplific

    【实例截图】

    【核心代码】

    MESHSIMPLE

    └── 网格简化源码

    ├── jmspmesh

    │   ├── apple.ply

    │   ├── big_porsche.ply

    │   ├── cat.ply

    │   ├── cow.ply

    │   ├── Debug

    │   │   ├── BuildLog.htm

    │   │   ├── glmodelwin.obj

    │   │   ├── glmodelwin.sbr

    │   │   ├── main.obj

    │   │   ├── main.sbr

    │   │   ├── mesh.obj

    │   │   ├── mesh.sbr

    │   │   ├── mt.dep

    │   │   ├── oglpmesh.bsc

    │   │   ├── oglpmesh.exe

    │   │   ├── oglpmesh.exe.embed.manifest

    │   │   ├── oglpmesh.exe.embed.manifest.res

    │   │   ├── oglpmesh.exe.intermediate.manifest

    │   │   ├── oglpmesh.ilk

    │   │   ├── oglpmesh.pdb

    │   │   ├── pmesh.obj

    │   │   ├── pmesh.sbr

    │   │   ├── polydemo.res

    │   │   ├── triangle.obj

    │   │   ├── triangle.sbr

    │   │   ├── vc60.idb

    │   │   ├── vc60.pdb

    │   │   ├── vc90.idb

    │   │   ├── vc90.pdb

    │   │   ├── vec3.obj

    │   │   ├── vec3.sbr

    │   │   ├── vertex.obj

    │   │   └── vertex.sbr

    │   ├── glmodelwin.cpp

    │   ├── glmodelwin.h

    │   ├── hind.ply

    │   ├── huge_bunny.ply

    │   ├── main.cpp

    │   ├── mesh.cpp

    │   ├── mesh.h

    │   ├── oglpmesh.dsp

    │   ├── oglpmesh.dsw

    │   ├── oglpmesh.ncb

    │   ├── oglpmesh.opt

    │   ├── oglpmesh.plg

    │   ├── oglpmesh.sln

    │   ├── oglpmesh.suo

    │   ├── oglpmesh.vcproj

    │   ├── oglpmesh.vcproj.BYDHQ.zdd567568.user

    │   ├── pmesh.cpp

    │   ├── pmesh.h

    │   ├── polydemo.aps

    │   ├── polydemo.rc

    │   ├── propslim.cpp

    │   ├── Release

    │   │   ├── BuildLog.htm

    │   │   ├── glmodelwin.obj

    │   │   ├── glmodelwin.sbr

    │   │   ├── main.obj

    │   │   ├── main.sbr

    │   │   ├── mesh.obj

    │   │   ├── mesh.sbr

    │   │   ├── mt.dep

    │   │   ├── oglpmesh.bsc

    │   │   ├── oglpmesh.exe

    │   │   ├── oglpmesh.exe.intermediate.manifest

    │   │   ├── pmesh.obj

    │   │   ├── pmesh.sbr

    │   │   ├── polydemo.res

    │   │   ├── triangle.obj

    │   │   ├── triangle.sbr

    │   │   ├── vc90.idb

    │   │   ├── vec3.obj

    │   │   ├── vec3.sbr

    │   │   ├── vertex.obj

    │   │   └── vertex.sbr

    │   ├── resource.h

    │   ├── triangle.cpp

    │   ├── triangle.h

    │   ├── vec3.cpp

    │   ├── vec3.h

    │   ├── vertex.cpp

    │   └── vertex.h

    └── 运行说明.doc

    4 directories, 82 files

    展开全文
  • 简化算法的误差测度(度量质量和误差) 误差测度用于度量模型简化的质量和误差,因此它对模型的简化过程和最后的简化结果都具有重要的影响。大多数简化算法采用对象空间(Object-space)的一种或综合几种形式的几何...
  • 国外大学研究成果,使用纹理边界特征简化网格算法简化效果非常好),UV's boundary preserved
  • 为了进一步研究层次细节技术在实时绘制大规模地形场景中的有效应用,提高海量数据三维地形的重建速度,基于DEM数据及视觉相关地形简化的特点,提出了一种基于网格划分的实时简化算法.该方法首先将DEM栅格数据分成以...
  • 提出了一种基于SIFT和Krawtchouk矩不变量的图像配准方法。通过SIFT关键点检测方法检测关键点;对每个关键点计算其邻域...实验结果表明,该算法的配准性能与标准SIFT算法相当,而运算速度比标准SIFT算法有较大程度提高。
  • 最后通过对不同类型模型的对比实验,发现与传统的特征保持的网格简化算法相比,使用改进的自动误差修正算法可以很大程度地提高较规则模型的简化质量;而对于构造复杂的模型,通过用户误差修正算法,在优化的基础上...
  • 在边折叠的网格简化算法的基础上,针对特定三维网格模型—人脸,提出了一种实用的基于特征点的快速模型简化算法。该算法把人脸按特征点的分布进行分块处理,对不同区域采用不同的阈值进行调节。对于需要高细节的区域...
  • 本文简要介绍了网格简化的基础及意义,重点介绍了边坍缩(Edge Collapse)算法以及具体实现细节。
  • Mesh网格简化

    2019-09-27 12:40:22
    Mesh简化算法: 1. 通过mesh简化,可以将一个多边形的网格A转化成另一个网格B 网格B相比A,有更少的三角形面、边、顶点。 2. 简化的过程是受到一定的约束的。会有一系列自定义的质量标准来控制简化的进行。这些...
  • 公司项目需求所以最近来研究减面,这里主要是大概简单的简述减面的思维等等还有几种常见的算法
  • 然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如何自动计算生成这些三维简化模型就是网格精简算法所关注的目标。[Garland et al...
  • 摘要 基于重新划分的三角形网格简化方法能自动生成多细节层次模型,它的基本思想是:根据三角形网格的局部几何和拓扑特征将一定数量的点分布到原网格上,生成一个中间网格,移去中间网格中的老顶点,并对产生的多边形...
  • 最近搞毕设,在网上查找资料时总是会出现qslim算法和qem算法,其中对qem很多文章都有详细的介绍,但对qslim很多就是一笔带过,说是个三维网格算法库,希望有人能详细介绍一下qslim算法并比较一下qem的联系与区别
  • 网格简化技术研究报告 lvweiwolf 问题及场景 超大场景环境下,为了精细、...网格简化算法分类 删减法 删减法是目前算法中采用最多的一种模型简化操作。该方法通过重复依次删除对模型特征影响较小的几何元素并...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 165
精华内容 66
关键字:

网格简化算法