【笔记】Libig从入门到放弃(续)
参数化
参数化方法可大致分为四族:
- Single patch, fixed boundary. parametrize a disk-like part of the surface given fixed 2D positions for its boundary. 简单,高校,但是参数化后的map有很大distortion
- Single patch, free boundary. 减少了map distortion,但是可能出现self-intersection
- Global parametrization. 对任意亏格的网格均适用。初始的时候把网格切为多个patches,然后分别参数化。生成的maps在切边是不连续的(切边也称为seams,缝)
- Global seamless parametrization. 使得参数化结果”continuous“
Harmonic Parametrization
调和参数化是一种single patch,fixed boundary的算法。
算法步骤如下:
- 检测boundary vertices
- 把boundary vertices映射到一个圆上
- 计算两个harmonic functions(uv坐标)。调和函数使用固定在圆上的顶点作为边界约束
libigl实现
Eigen::VectorXi bnd;
igl::boundary_loop(V, F, bnd);Eigen::MatrixXd bnd_uv;
igl::map_vertices_to_circal(V, bnd, bnd_uv);igl::harmonic(V, F, bnd, bnd_uv, 1, V_uv);
bnd
是边界顶点的序列号,bnd_uv
是他们在UV平面上的位置,1表示我们使用harmonic function计算(2表示biharmonic,3表示triharmonic等等)
UV参数化结果可以展示为:
viewer.data().set_uv(V_uv);
LSCM (Least Squares Conformal Maps)
LSCM参数化是最小化conformal (angular) 失真,LSCM不需要固定边界。
LSCM最小化如下能量:
ELSCM(u,v)=∫X12∣∇u⊥−∇v∣2dAE_{LSCM}(u,v)=\int_{X}\frac{1}{2}|\nabla u^{\perp }-\nabla v|^2dA ELSCM(u,v)=∫X21∣∇u⊥−∇v∣2dA
写成矩阵形式:
ELSCM(u,v)=12[u,v]t(Lc−2A)[u,v]E_{LSCM}(u,v)=\frac{1}{2}[u,v]^t(L_{c}-2A)[u,v] ELSCM(u,v)=21[u,v]t(Lc−2A)[u,v]
这里LcL_cLc是余切Laplacian矩阵;A是面积变换矩阵,[u,v]tA[u,v][u,v]^tA[u,v][u,v]tA[u,v]和网格的vector area相等。
libigl首先使用igl::cotmatrix
计算余切矩阵
SparseMatrix<double> L;
igl::cotmatrix(V, F, L);
因为我们想同时对u和v坐标使用Laplacian matrix,把它扩展一下:
SparseMatrix<double> L_flat;
igl::repdiag(L, 2, L_flat);
面积矩阵A计算如下:
SparseMatrix<double> A;
igl::vector_area_matrix(F, A);
最终能量矩阵是Lflat−2AL_{flat}-2ALflat−2A
ARAP (As-rigid-as-possible)
ARAP是single patch,free boundary方法。尽可能保留距离。每个三角形在映射到平面上时尽可能保留它的原始外形,顶多发生rigid rotation
首先,利用harmonic参数化计算ARAP的初始解
Eigen::VectorXi bnd;
igl::boundary_loop(F, bnd);
Eigen::MatrixXd bnd_uv;
igl::map_vertices_to_circle(V, bnd, bnd_uv);igl::harmonic(V, F, bnd, bnd_uv, 1, initial_guess);
然后,初始化ARAP
igl::ARAPData arap_data;
arap_data.with_dynamics = true;
Eigen::VectorXi b = Eigen::VectorXi::Zero(0);
Eigen::MatrixXd bc = Eigen::MatrixXd::Zero(0, 0);arap_data.max_iter = 100;
arap_precomputation(V, F, 2, b, arap_data);
接着,求解优化
V_uv = initial_guess;
arap_solve(bc, arap_data, V_uv);
N-rotationally Symmetric Tangent Fields
Tangent fields 这个东西是用来design guidance fields,为uniform quadrilateral 和 hexahedral remeshing服务的。Libigl提供了一些N-RoSy fields 的算法,
在libigl里,tangent unit-length vector fields 是piece-wise constant的,对三角网格的每个面片而言。每个面片上用一个或多个vectors描述。
函数igl::nrosy(V,F,b,bc,b_soft,b_soft_weight,bc_soft,N,0.5,output_field,output_singularities)
创建了一个光滑的单位长度向量场(N=1),从一个sparse set of constrained faces开始,faces的indices是b,它们的约束值定义在bc里。函数支持软约束,返回插值的场,还有场的奇异值。
所谓奇异值,是指场vanished的顶点。igl::nrosy
还能生成N-RoSy场,这是向量场的一种泛化,对每个面,向量取决去一个旋转常量2π/N2\pi/N2π/N。不同的N值,奇异值的样式和位置都不一样。
Global, Semless Integer-grid Parametrization
全局的,无缝的参数化,目标是把一个复杂形状参数化,使其和一个给定的set of directions对齐。目的是做surface remeshing。
Libigl提供了mixed integer quadrangulation paper的求解过程:
- 设计一个4-RoSy场(也叫cross field),描述了remeshing所需要对齐的边。这个场的约束通常是人工设置或者通过主曲率方向提取的。
- Combing and cutting。给定cross field后,需要把表面剪开,使其与圆盘拓扑同胚。这个可以直接在cross-field上做,也可以在它的bisector field(把cross-field旋转45度)上做。因为在后者上做更加stable和generic。因此我们首先旋转cross field,然后通过给每个面指定u和v方向,移除掉歧义的rotation。这个指定使用广度优先搜索,从任意一个face开始。这个过程类似梳毛,在某些点,无法一致性地区把整个表面捋顺,这些不连续边就定义了cut graph。最后,我们把combed filed旋转45度,恢复初始的角度。combed cross field可以认为是一个理想的Jacobian。
- Poisson参数化。网格沿着上述找到的缝切开,参数化通过计算试图找到两个标量函数,使其梯度和combed cross field匹配。E(u,v)=∣∇u−Xu∣2+∣∇v−Xv∣2E(u,v)=|\nabla u-X_u|^2+|\nabla v-X_v|^2E(u,v)=∣∇u−Xu∣2+∣∇v−Xv∣2。通过求解这个能量最小化问题,得到一个参数化表示,其中u和v等值线和输入的cross field是对齐的。我们通过增加interger constraints来对齐缝的两边。
这种参数化方法只能用于remeshing,因为它包含了很多overlaps
Anisotropic Remeshing
各项异的remeshing和非统一的quad remeshing对于concentrate the elements in the regions with more details十分重要。可以通过扩展MIQ quad meshing framework,使用一个mesh deformation方法来生成各项异的quad meshed。
输入是一个sparse set of constraints,定义了shape和所需的quads的scale。这个可以被编码成一个frame field(一对non-orthogonal和non-unit length vectors)。这个frame field可以通过分解成一个4-RoSy场和一个unique affine transformation来插值。这两部分可以分别插值。对cross field,使用igl::nrosy
,对affine part使用harmonic interpolant。
插值后,表面被warp,each frame被变形为一个正交的和单位长度的cross(移除了尺度和skewness from the frame)。这个变形定义了一个新的表面嵌入(embedding,同时一个新的metric)。
变形后的表面可以使用MIQ算法做各项异的remeshing。变形后的表面的uv坐标可以用来把参数化传递到原始表面。
Planarizatoin
一个quad mesh可以变形到一个平面quad mesh,使用Shape-Up方法。这是一种local/global方法,global step确保surface continuity,local step确保planarity。
igl::planarize
【笔记】Libig从入门到放弃(续)相关推荐
- Python学习笔记 之 从入门到放弃
笔记目录 9月22日:<基础教程>基础知识 ·模块导入 ·用变量引用函数(或者Python中大多数的对象) ·将数值转换成字符串的方法:str类型.repr函数 9月23日:列表.元组 · ...
- python复数的实部和虚部都是整数嘛_Python学习笔记:从入门到放弃(2)基本语法...
这次主要就记录一下Python中的基本语法,有标识符,注释,行与缩进,print函数输出以及数字类型和字符串 标志符: 第一个字符必须是字母表中字母或下划线 _ . 标识符的其他的部分由字母.数字和下 ...
- python中复数的实部和虚部都是浮点数_Python学习笔记:从入门到放弃(2)基本语法...
这次主要就记录一下Python中的基本语法,有标识符,注释,行与缩进,print函数输出以及数字类型和字符串 标志符: 第一个字符必须是字母表中字母或下划线 _ . 标识符的其他的部分由字母.数字和下 ...
- AI从入门到放弃:BP神经网络算法推导及代码实现笔记
作者 | @Aloys (腾讯员工,后台工程师) 本文授权转自腾讯的知乎专栏 ▌一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤 ...
- Django入门到放弃 学习笔记 03
跟b站武沛齐老师的视频学习 对学习过程进行一些记录以便复习 同时自我督促 :D冲鸭 视频链接: 15天django入门到放弃-哔哩哔哩. 文章目录 内容回顾 Bootstrap安装 Fontaweso ...
- iOS即时通讯,从入门到“放弃”?
image 前言 本文会用实例的方式,将iOS各种IM的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. 注:文中的所有的代码示例,在github中都有demo: iOS即时通讯,从入 ...
- iOS即时通讯从入门到“放弃”?
前言 本文会用实例的方式,将iOS各种IM的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. 注:文中的所有的代码示例,在github中都有demo: iOS即时通讯,从入门到&quo ...
- AI从入门到放弃2:CNN的导火索,用MLP做图像分类识别?
来源 | 腾讯知乎专栏 作者 | AIoys(腾讯员工,后台工程师) 项目文档和代码在此:github项目地址: https://github.com/zsysuper/AI_Notes ▌一.前言 ...
- python从入门到放弃图片大全-Python 从入门到放弃(一)
Python 从入门到放弃(一) 一个没有逻辑顺序的python笔记,包括日常使用python时的总结与阅读<Python基础教程>([挪] Magnus Lie Hetland 著) 的 ...
最新文章
- linux下载哪个python版本-修改linux下python的默认版本
- 使用Ubuntu挂载NTFS格式分区
- nginx和apache的伪静态区别
- 事务默认的传播属性和事务默认的隔离级别
- .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入
- 超级硬盘数据恢复软件v2.7.2.6_超级硬盘数据恢复软件的U盘存储卡删除文件的恢复方式...
- Apache的流处理技术概述
- c#图片处理之:在图片上打上文字
- OpenCV统计应用-CvHistogram直方图资料
- intellij idea 的常用有用快捷键
- r-cnn 行人检测_了解对象检测和R-CNN。
- Linux学习笔记5 - Shell编程(类似于Windows下的批处理)
- Epicor ERP
- 搞懂朴素贝叶斯分类算法
- 关于微信支付电商平台二清解决方案
- 大数据背景下的信息资源管理
- 开源开放 | 面向家庭常见疾病的知识图谱(东南大学)
- Kubernetes 之 二进制安装(二) 证书详解
- 认认真真推荐 10 个优质自学平台
- 如何在苹果电脑上装软件
热门文章
- MOSFET 和 IGBT 栅极驱动器电路的基本原理学习笔记(六)变压器耦合栅极驱动
- Unity 导入人形骨骼模型及动画
- 【汉诺塔】C语言递归解法,深层次地带你理解汉诺塔公式
- WuThreat身份安全云-TVD每日漏洞情报-2022-12-22
- HTML 的静态网页分页样式
- cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
- 解决:navicat连接mysql报错10060
- AI 操控战斗机战胜飞行员?道翰天琼认知智能机器人平台API接口大脑为您揭秘-3。
- 【踩坑】spconf.sty Latex样式模板的name包含下划线
- vue之组件传值 爷到孙 provide inject