MATLAB实现Catmull-Clark细分(CC细分)

2023-12-25 22:30

本文主要是介绍MATLAB实现Catmull-Clark细分(CC细分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

终于调试好了Catmull-Clark细分(CC细分)的全部程序,将之前只适用于封闭四边形网格的程序进行了完善

主要一段代码来自于三维网格细分算法(Catmull-Clark subdivision & Loop subdivision)附源码,这个博主的很多篇博文都写的非常好,但是经常丢三落四的,像在这篇博文中他就用到了函数outline.m用来计算网格的边界,但是博主却没有给出outline函数,我自己重新编写了这个函数,并且能够成功执行^^,现在我贴出完整代码

function [VV, FF, S] = CCSubdivision(V, F, iter)  % Catmull_Clark subdivision  if ~exist('iter','var')  iter = 1;  end  VV = V;  FF = F;  for i = 1:iter   nv = size(VV,1);  nf = size(FF,1);   O = outline(FF);  original = 1:nv;  boundary = O(:,1)';  interior = original(~ismember(original, boundary));  no = length(original);  nb = length(boundary);  ni = length(interior);  %% Sv  Etmp = sort([FF(:,1) FF(:,2);FF(:,2) FF(:,3);FF(:,3) FF(:,4);FF(:,4) FF(:,1)],2);  [E, ~, idx] = unique(Etmp, 'rows');  Aeven = sparse([E(:,1) E(:,2)], [E(:,2) E(:,1)], 1, no, no);  Aodd = sparse([FF(:,1) FF(:,2)], [FF(:,3) FF(:,4)], 1, no, no);  Aodd = Aodd + Aodd';  val_even = sum(Aeven,2);  beta = 3./(2*val_even);  val_odd = sum(Aodd,2);  gamma = 1./(4*val_odd);  alpha = 1 - beta - gamma;  Sv = sparse(no,no);  Sv(interior,:) = ...  sparse(1: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(:,1);O(:,2)],[O(:,2);O(:,1)],1/8,no,no) + ...  sparse([O(:,1);O(:,2)],[O(:,1);O(:,2)],3/8,no,no);  Sv(boundary,:) = Sboundary(boundary,:);  %% Sf  Sf = 1/4 .* sparse(repmat((1:nf)',1 ,4), FF, 1);  i0 = no + (1:nf)';  %% Se  flaps = sparse([idx;idx], ...  [FF(:,3) FF(:,4);FF(:,4) FF(:,1);FF(:,1) FF(:,2);FF(:,2) FF(:,3)], ...  1);  onboundary = (sum(flaps,2) == 2);  flaps(onboundary,:) = 0;  ne = size(E,1);  Se = sparse( ...  [1:ne 1:ne]', ...  [E(:,1); E(:,2)], ...  [onboundary;onboundary].*1/2 + ~[onboundary;onboundary].*3/8, ...  ne, ...  no) + ...  flaps*1/16;  %% new faces & new vertices  i1 = no +   nf + (1:nf)';  i2 = no + 2*nf + (1:nf)';  i3 = no + 3*nf + (1:nf)';  i4 = no + 4*nf + (1:nf)';  FFtmp = [i0 i4 FF(:,1) i1; ...  i0 i1 FF(:,2) i2; ...  i0 i2 FF(:,3) i3; ...  i0 i3 FF(:,4) i4];  reidx = [(1:no)'; no+(1:nf)'; no+nf+idx];  FF = reidx(FFtmp);  S = [Sv; Sf; Se];  VV = S*VV;  end  end  
其中outline函数如下

function out = outline( FF )
%OUTLINE Summary of this function goes here
%   Detailed explanation goes here
Etmp = sort([FF(:,1) FF(:,2);FF(:,2) FF(:,3);FF(:,3) FF(:,4);FF(:,4) FF(:,1)],2);
[~, ~, idx] = unique(Etmp, 'rows');oriEtmp = [FF(:,1) FF(:,2);FF(:,2) FF(:,3);FF(:,3) FF(:,4);FF(:,4) FF(:,1)];
hh=sortrows([oriEtmp,idx],3);x2=diff(sortrows(idx));
vector = all(x2==0, 2);index1=find(vector);
index2=index1+1;
index=[index1;index2];hh(index,:)=[];
out=hh(:, 1:2);end
对于任意四边形网格是适用的,下面是我们的测试代码

[V,F]=obj__read('six.obj');
V=V';F=F';
iter=4;
[VV, FF] = CCSubdivision(V, F, iter);
%[VV, FF] = CCsub(V, F, iter);
obj_write('six1.obj',VV',FF');[V,F]=obj__read('torus.obj');
V=V';F=F';
iter=4;
[VV, FF] = CCSubdivision(V, F, iter);
%[VV, FF] = CCsub(V, F, iter);
obj_write('torus1.obj',VV',FF');
最后贴上细分效果

开放四边形网格
 六面开口盒子四次细分
封闭四边形网格
 四边形框四次细分
搞定哈哈^^

这篇关于MATLAB实现Catmull-Clark细分(CC细分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/537188

相关文章

Redis实现高效内存管理的示例代码

《Redis实现高效内存管理的示例代码》Redis内存管理是其核心功能之一,为了高效地利用内存,Redis采用了多种技术和策略,如优化的数据结构、内存分配策略、内存回收、数据压缩等,下面就来详细的介绍... 目录1. 内存分配策略jemalloc 的使用2. 数据压缩和编码ziplist示例代码3. 优化的

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Kafka消费者实现过程

《JavaKafka消费者实现过程》Kafka消费者通过KafkaConsumer类实现,核心机制包括偏移量管理、消费者组协调、批量拉取消息及多线程处理,手动提交offset确保数据可靠性,自动提交... 目录基础KafkaConsumer类分析关键代码与核心算法2.1 订阅与分区分配2.2 拉取消息2.3

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.