一、概述
二、思路
       1、Loop算法简述
       2、更新策略
       3、三角面细分操作
       4、操作流程
三、数据结构
四、参考资料


一、概述

上课作业。基于半边数据结构实现了Loop曲面细分算法。

二、思路

1、Loop算法简述

Loop细分是一种三角网络的细分法则。算法本身挺简单的,主要就是把1个旧三角面片分成4个新三角面片,涉及到半边数据结构操作的部分有点麻烦。具体:每次细分,每条边上计算插入一个新顶点,同时每个原始顶点更新位置。边界边/点和非边界边/点按不同策略插入/更新坐标。

2、更新策略

每条边上新插入的点计算坐标后暂时存储在边结构的newPos变量中,每个旧顶点计算完更新后顶点位置后暂时存储在顶点结构的newPos变量中。

更新策略如下图所示,图上为非边界情况的更新策略,图下为边界情况的更新策略。

3、三角面细分操作

采用如下策略进行三角面的划分:(更详细说明见参考资料链接第二条)

  • Split:对每一条旧边执行split操作,可按任意顺序执行。具体操作为:按照该边中存储的前一步已计算好的新顶点的坐标将该边断成两条边,并插入2条边连接新顶点与所处三角形的对角顶点(如果该边是边界,则新插入的边为1条)。
  • Flip:对连接新旧顶点的新插入的边(新插入——不是由断裂原有边形成)进行flip操作。

4、操作流程

  • 标记原始mesh的所有顶点和边。
  • 按策略计算每条边上新插入的顶点坐标,数据暂存在边结构中。
  • 按策略计算每个旧顶点更新后的位置,数据暂存在顶点结构中。
  • 对每条旧边执行split操作。PS:要避免split新插入的边
  • 对特定边执行flip操作。PS:注意特定边的要求
  • 将暂存在顶点结构中的顶点更新后坐标,替换到顶点坐标中去。

三、数据结构

这部分主要是半边数据结构。之前实现欧拉操作的时候已经写过一遍,这次写起来还算顺手。区别于实现miniCAD的欧拉操作中用到的半边数据结构,本次用到的半边在层级结构上去掉了Loop那一层(此Loop非彼Loop,欧拉操作中为Solid--Face--Loop--Halfedge--Vertex + Edge--Halfedge)。

因为半边数据结构中各种面、边、点结构指来指去,为了防止内存泄漏用了智能指针。但基本都是自己瞎瘠薄用,总觉得自己用得不伦不类的,所以仅供参考。

  • 顶点结构
class Vertex
{
public:Point3d pos;         // 顶点坐标Point3d newPos;          // 更新后顶点坐标bool ifCalNewPos = false;        // 用于区分新旧顶点bool isOnBoundary = false;  // 用于判断是否位于边界Index idxForSave;      // 用于新mesh写出public:Vertex(Point3d& p) : pos(p) {}
};
  • 半边结构
class Halfedge
{
public:shared_ptr<Vertex> v;weak_ptr<Halfedge> twin;weak_ptr<Halfedge> next;weak_ptr<Halfedge> prev;weak_ptr<Edge> e;weak_ptr<Face> f;public:Halfedge() {}Halfedge(shared_ptr<Vertex>&  _v) {v = _v;}
};
  • 边结构
class Edge
{
public:Index ID;shared_ptr<Halfedge> he1;shared_ptr<Halfedge> he2;Point3d newPos;           // 用于存储新顶点的坐标bool ifCalNewPos = false;     // 用于判断是否计算了新顶点bool ifNew = false;     // 用于判断是否为新插入的边bool isBoundary = false;        // 用于判断是否为边界public:Edge() {static Index id = 0;ID = id++;}
};
  • 面结构
class Face
{
public:shared_ptr<Halfedge> he;Point3d normal;bool ifNeedDelete = false;public:Face(){}Face(shared_ptr<Halfedge>& _he) {he = _he;}
};

四、参考资料

  • 博客:http://www.cnblogs.com/shushen/p/5251070.html
  • cmu462/Scotty3D:https://github.com/cmu462/Scotty3D/wiki/Loop-Subdivision

强烈推荐链接2里的Scotty3D项目,虽然Scotty3D本身是个空项目,但是整个系统都搭建起来了,代码里有大量的TODO注释,还有wiki里各种生动形象且详细到令人发指的知识点介绍。半边数据结构也有介绍(虽然我是按照自己的理解瞎瘠薄写的)。看着cmu462/Scotty3D这个项目,心里满满都是羡慕qaq

【笔记】Loop曲面细分算法c++实现相关推荐

  1. 曲面细分(loop曲面细分,catmull曲面细分)(计算机图形学学习笔记)

    1 曲面细分 1.1 Loop细分 Loop细分一般有两步操作: 1. 把三角形数量增多. 将一个三角形的每条边的中点相连,把原三角形分割成四个三角形 2. 改变三角形顶点的位置,让模型看上去更光滑. ...

  2. 使用Canvas + Path和“曲面细分”算法实现钢笔笔锋效果

    本文用于在无法获取压感的设备上实现书法效果,因此所有的书写效果的笔触粗细变化,均是通过速率进行确认.最后实现效果如下(不会书法,只能让大家体会一下效果),代码基于之前的文章在安卓中结合使用GLSurf ...

  3. 曲面细分(subdivision)曲面细分着色器GPU的LOD

    曲面细分是指将一个模型的面合理的分成更多小的面,从而提升模型精度,提高渲染效果 曲面简化是指将一个模型的面合理的合成更少的面,从而降低模型精度,为特定情形下提供使用(如LOD技术) .这一过程是可以在 ...

  4. 图形学笔记(十)几何2 —— 曲面细分(Loop细分、Catmull-Clark细分)、曲面简化(边坍缩、二次度量误差)、曲面正则化

    图形学笔记(九)几何 --几何表示方法(CSG.距离函数.水平集 .点云.网格(obj格式)).贝塞尔曲线(面) 图形学笔记(十一)光线追踪--Shadow Mapping.光线追踪.光线投射.软硬阴 ...

  5. 三角网格细分算法 —— Loop 算法

    三角网格细分算法 -- Loop细分 主要参考文章: https://zhuanlan.zhihu.com/p/144400261 https://blog.csdn.net/McQueen_LT/a ...

  6. java nurbs几何库_OpenGL超级宝典笔记——NURBS与曲面细分

    NURBS 贝塞尔曲线的缺点是当我们增加很多控制点的时候,曲线变得不可控,其连续性会变差差.如果控制点很多(高阶曲线),当我们调整一个控制点的位置,对整个曲线的影响是很大的.要获得更高级的控制,可以使 ...

  7. DirectX 12 曲面细分着色器笔记

    曲面细分着色器 1. 背景 2. 曲面细分工作机制 2.1 Hull Shader(外壳着色器) 2.2 Tessellator(曲面细分器) 2.3 Domain Shader(域细分器) 3. 编 ...

  8. Geometry 曲面细分和曲面简化

    Geometry 曲面细分和曲面简化 1 曲面细分 a) Loop细分 b) Catmull-Clark细分(Catmull-Clark Subdivision) 曲面简化 边坍缩 总结: 1 曲面细 ...

  9. 计算机图形学【GAMES-101】5、几何(距离函数SDF、点云、贝塞尔曲线、曲面细分、曲面简化)

    快速跳转: 1.矩阵变换原理Transform(旋转.位移.缩放.正交投影.透视投影) 2.光栅化(反走样.傅里叶变换.卷积) 3.着色计算(深度缓存.着色模型.着色频率) 4.纹理映射(重心坐标插值 ...

  10. Tessellation (曲面细分) Displacement Mapping (贴图置换)

    DirectX 11 Tessellation (曲面细分)-什么是 Tessellation (曲面细分) ? 它为什么可以起到如此关键的数据? 随着近期人们对 DirectX 11 的议论纷纷,你 ...

最新文章

  1. 分布式全局序列号生产,Twitter Snowflake算法,雪花算法
  2. 全球20大智慧城市排行榜揭晓:无锡列中国第一,银川、杭州上榜!
  3. 【第三组】用例+功能说明+技术说明
  4. HtmlUnit采集页面信息加工并写入excel表
  5. java怎么设有滚动的标签,html标签overflow属性和javascript实现div标签滚动
  6. 外设驱动库开发笔记6:AD719x系列ADC驱动
  7. 信息学奥赛C++语言:高个子的人数
  8. python之--工具类方法
  9. ICE专题:编译环境构建
  10. 单机到集群的WEB架构演变
  11. C++ Windows时间函数 QueryPerformanceCounter()与QueryPerformanceFrequency()
  12. java中 获取classpath路径
  13. 刷python题库的网站_大神教你刷bios工具
  14. Elastic Job定时任务
  15. WP8最大的败笔就是只能用Win8做开发
  16. html网页中圆角边框的编写,Html实现边框圆角的实例详解
  17. Oracle数据库update语句用法,多表批量更新对应的字段值
  18. 函数名和变量名重名问题
  19. 21世纪新媒体CTO韩磊:移动新媒介融合之道
  20. Linux云服务-Mysql卸载篇

热门文章

  1. eclipse导入静态网页模板+搭建springboot环境示例+细节问题解决(详细)
  2. vs插件VS10x CodeMap 注册码
  3. Linux安装显卡驱动后闪屏问题
  4. 计算机键盘和实验原理图,独立键盘的检测原理及程序实现方法
  5. word转pdf免费网站
  6. Premiere Elements 2021 安装教程【电脑配置要求较高】
  7. 下行物理信道rs_LTE下行物理信道与物理信号
  8. matlab做叠加定理仿真,实验一 仿真软件的使用与叠加原理的验证
  9. php接收post数据 json数据,PHP接收post数据并解析json的简单实例
  10. iPhone 抓包工具Charles使用