下图描述了细分的基本思想,每次细分都是在每条边上插入一个新的顶点,可以看到随着细分次数的增加,折线逐渐变成一条光滑的曲线。曲面细分需要有几何规则和拓扑规则,几何规则用于计算新顶点的位置,拓扑规则用于确定新顶点的连接关系。下面介绍两种网格细分方法:Catmull-Clark细分和Loop细分。

Catmull-Clark subdivision

  Catmull-Clark细分是一种四边形网格的细分法则,每个面计算生成一个新的顶点,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。下图为Catmull-Clark细分格式的细分掩膜,对于新增加的顶点位置以及原始顶点位置更新规则如下:

1.网格内部F-顶点位置:

  设四边形的四个顶点为v0、v1、v2、v3,则新增加的顶点位置为v = 1/4*(v0 + v1 + v2 + v3)。

2.网格内部V-顶点位置:

  设内部顶点v0的相邻点为v1、v2,…,v2n,则该顶点更新后位置为,其中α、β、γ分别为α = 1 - β - γ。

3.网格边界V-顶点位置:

  设边界顶点v0的两个相邻点为v1、v2,则该顶点更新后位置为v = 3/4*v0 + 1/8*(v1 + v2)。

4.网格内部E-顶点位置:

  设内部边的两个端点为v0、v1,与该边相邻的两个四边形顶点分别为v0、v1、v2、v3和v0、v1、v4、v5,则新增加的顶点位置为v = 1/4*(v0 + v1 + vf1 + vf2) = 3/8*(v0 + v1) + 1/16*(v2 + v3 + v4 + v5)。

5.网格边界E-顶点位置:

  设边界边的两个端点为v0、v1,则新增加的顶点位置为v = 1/2*(v0 + v1)。

效果:

function [VV, FF, S] = CC_subdivision(V, F, iter)
% Catmull_Clark subdivision
if ~exist('iter','var')
iter = ;
end
VV = V;
FF = F; for i = :iter
nv = size(VV,);
nf = size(FF,); O = outline(FF); original = :nv;
boundary = O(:,)';
interior = original(~ismember(original, boundary)); no = length(original);
nb = length(boundary);
ni = length(interior); %% Sv
Etmp = sort([FF(:,) FF(:,);FF(:,) FF(:,);FF(:,) FF(:,);FF(:,) FF(:,)],);
[E, ~, idx] = unique(Etmp, 'rows'); Aeven = sparse([E(:,) E(:,)], [E(:,) E(:,)], , no, no);
Aodd = sparse([FF(:,) FF(:,)], [FF(:,) FF(:,)], , no, no);
Aodd = Aodd + Aodd'; val_even = sum(Aeven,);
beta = ./(*val_even); val_odd = sum(Aodd,);
gamma = ./(*val_odd); alpha = - beta - gamma; Sv = sparse(no,no);
Sv(interior,:) = ...
sparse(:ni, interior, alpha(interior), ni, no) + ...
bsxfun(@times, Aeven(interior,:), beta(interior)./val_even(interior)) + ...
bsxfun(@times, Aodd(interior,:), gamma(interior)./val_odd(interior));
Sboundary = ...
sparse([O(:,);O(:,)],[O(:,);O(:,)],/,no,no) + ...
sparse([O(:,);O(:,)],[O(:,);O(:,)],/,no,no);
Sv(boundary,:) = Sboundary(boundary,:); %% Sf
Sf = / .* sparse(repmat((:nf)',1 ,4), FF, 1);
i0 = no + (:nf)'; %% Se
flaps = sparse([idx;idx], ...
[FF(:,) FF(:,);FF(:,) FF(:,);FF(:,) FF(:,);FF(:,) FF(:,)], ...
);
onboundary = (sum(flaps,) == );
flaps(onboundary,:) = ; ne = size(E,);
Se = sparse( ...
[:ne :ne]', ...
[E(:,); E(:,)], ...
[onboundary;onboundary].*/ + ~[onboundary;onboundary].*/, ...
ne, ...
no) + ...
flaps*/; %% new faces & new vertices
i1 = no + nf + (:nf)';
i2 = no + *nf + (:nf)';
i3 = no + *nf + (:nf)';
i4 = no + *nf + (:nf)'; FFtmp = [i0 i4 FF(:,) i1; ...
i0 i1 FF(:,) i2; ...
i0 i2 FF(:,) i3; ...
i0 i3 FF(:,) i4]; reidx = [(:no)'; no+(1:nf)'; no+nf+idx];
FF = reidx(FFtmp); S = [Sv; Sf; Se];
VV = S*VV;
end
end

Loop subdivision

  Loop细分是一种三角形网格的细分法则,它按照1-4三角形分裂,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。下图为Loop细分格式的细分掩膜,对于新增加的顶点位置以及原始顶点位置更新规则如下:

1.网格内部V-顶点位置:

  设内部顶点v0的相邻点为v1、v2,…,vn,则该顶点更新后位置为,其中

2.网格边界V-顶点位置:

  设边界顶点v0的两个相邻点为v1、v2,则该顶点更新后位置为v = 3/4*v0 + 1/8*(v1 + v2)。

3.网格内部E-顶点位置:

  设内部边的两个端点为v0、v1,相对的两个顶点为v2、v3,则新增加的顶点位置为v = 3/8*(v0 + v1) + 1/8*(v2 + v3)。

4.网格边界E-顶点位置:

  设边界边的两个端点为v0、v1,则新增加的顶点位置为v = 1/2*(v0 + v1)。

效果:

本文为原创,转载请注明出处:http://www.cnblogs.com/shushen

三维网格细分算法(Catmull-Clark subdivision & Loop subdivision)附源码的更多相关文章

  1. 三维网格精简算法(Quadric Error Metrics)附源码

    在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如 ...

  2. 三维网格精简算法(Quadric Error Metrics)附源码(转载)

    转载:  https://www.cnblogs.com/shushen/p/5311828.html 在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接 ...

  3. 网格测地线算法(Geodesics in Heat)附源码

    测地线又称为大地线,可以定义为空间曲面上两点的局部最短路径.测地线具有广泛的应用,例如在工业上测地线最短的性质就意味着最优最省,在航海和航空中,轮船和飞机的运行路线就是测地线.[Crane et al ...

  4. 卡通图像变形算法(Moving Least Squares)附源码

    本文介绍一种利用移动最小二乘法来实现图像变形的方法,该方法由用户指定图像中的控制点,并通过拖拽控制点来驱动图像变形.假设p为原图像中控制点的位置,q为拖拽后控制点的位置,我们利用移动最小二乘法来为原图 ...

  5. 基于Zlib算法的流压缩、字符串压缩源码

    原文:基于Zlib算法的流压缩.字符串压缩源码 Zlib.net官方源码demo中提供了压缩文件的源码算法.处于项目研发的需要,我需要对内存流进行压缩,由于zlib.net并无相关文字帮助只能自己看源 ...

  6. 三维网格细分算法(Catmull-Clark subdivision & Loop subdivision)附源码(转载)

    转载:  https://www.cnblogs.com/shushen/p/5251070.html 下图描述了细分的基本思想,每次细分都是在每条边上插入一个新的顶点,可以看到随着细分次数的增加,折 ...

  7. SM4密码算法(附源码)

    SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳→_→:http://www.cnnic.NET.cn/jscx/mixbz/sm4/ 具体的密码标准和算法官方有非常 ...

  8. arcgis api 3.x for js 共享干货系列之一自写算法实现地图量算工具(附源码下载)

    0.内容概览 Geometry 地图服务方式实现地图距离以及面积的量算,简单描述 arcgis api 提供的接口类 geometryEngine 实现地图距离以及面积的量算,简单描述 自定义距离以及 ...

  9. sm4算法(附源码、测试代码)

    from:http://blog.csdn.net/mao0514/article/details/52930944 SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳 ...

随机推荐

  1. ionic + cordova 使用 cordova-gallery-api 获取本地相册所有图片

    cordova-gallery-api 插件定义一个全局galleryapi对象,提供查询图库相册的方法 安装 cordova-gallery-api: cordova plugin add http ...

  2. [Android]Android系统启动流程源码分析

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5013863.html Android系统启动流程源码分析 首先 ...

  3. app让个别界面横屏,其他的为竖屏,解决如下

    app让个别界面横屏,其他的为竖屏,解决如下 APP设置里面,一定要设置可以旋转的方向 appdelegate里面重新系统方向代理 func application(application: UIAp ...

  4. IOS开发 App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.

    xcode自7后不再使用http,而是使用https请求,但目前很多网络请求还只是以http请求,我们可以这样解决 info.plist->添加@“App Transport Security ...

  5. Xcode cannot launch because the device is locked.

    When you plug in your iPhone, it will ask you to trust the computer. If you already trust and unlock ...

  6. AutoLayout自动布局

      原文转自http://www.cnblogs.com/xjf125/p/4895978.html 目录: 一.什么是AutoLayout? 二.创建autoLayout的方法 三.VFL语言   ...

  7. android 转化json日期

    /Date(1448356081207)/ public static String changeDate(String time){ String newStr = time.substring(t ...

  8. iOS-保存照片或者视频到自定义相薄中以及读取数据

    声明:本文为本人原创作品~转载请注明出处~谢谢配合! 让TableView支持横屏的代码如下: //支持横屏 myTableView.autoresizingMask = UIViewAutoresi ...

  9. C#中的Lambda表达式和表达式树

    在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...

  10. pentaho cde popup弹出框口

    弹出窗口在pentaho cde里面相对比较容易,不过还是记录一下,以防时间久了,忘记关键参数. 先看一下效果图: 画出自己想要在弹出框展示的图形,把他的HtmlObject设置成弹出窗口,如图: 然 ...