动画原理:表面形变算法的思考与总结

前言:

之前我的文章 Mesh形变算法_mesh算法-CSDN博客就有大致的讨论过,介绍的也比较粗略!现在主要是想在Triangulated Surface Mesh Deformation方向上更深入的讨论一下!结合今年我对这一块的学习谈谈我的理解~

下面要介绍大致几种算法,不管是拉普拉斯形变算法或者它的形变还是ARAP的形变,本质上都是,通过在网格人为的定义一些控制点或控制边,然后根据控制点或控制边的移动来影响网格的形状。相应的优势很明显可以对网格的细节进行精细的控制,比如arap是一种刚性形变,它可以在形变工程中尽可能地保持细节!效果虽然好但是带来的也是需要考虑网格的拓扑结构和形变的质量,以及控制点或控制边等等的分布和数量的设计!在此之前推荐一本计算几何的经典书籍《Polygon Mesh Processing》:
里面的第七章就有很详细的讲述各种常见经典的形变算法,非常值得参考。
在这里插入图片描述

前置知识- 矩阵的迹:

矩阵的迹(Trace)是一个线性代数中的概念,它指的是矩阵主对角线上所有元素的总和。对于一个方形矩阵 A,其迹被表示为 Tr(A) 或者 trace(A)。
主对角线是指矩阵从左上角到右下角的一条线上的元素,这些元素的行索引和列索引相同。
例如,给定一个 3x3 的矩阵:

A = | a11 a12 a13 |
    | a21 a22 a23 |
    | a31 a32 a33 |

矩阵 A 的迹就是:Tr(A) = a11 + a22 + a33即,只需将主对角线上的元素加起来就可以了。
假设我们有如下的 2x2 矩阵:

B = | 4 9 |
    | 2 6 |

矩阵 B 的迹计算如下:

Tr(B) = 4 + 6 = 10

很简单对吧(~~)?直接将主对角线上的 4 和 6 相加得到迹为 10。
矩阵的迹性质:1、矩阵迹具有线性属性ext{tr}(A + B) = ext{tr}(A) + ext{tr}(B);2、循环置换(Cyclic permutation) 对于多个矩阵的乘积,迹操作满足循环置换性,可以改变乘法中的项的顺序而不影响迹: ext{tr}(ABC) = ext{tr}(BCA) = ext{tr}(CAB)
特别注意并不意味着矩阵乘法是交换的,仅适用于迹。3、 特征值之和(Sum of eigenvalues): 矩阵的迹等于其所有特征值之和。如果 A 的特征值是 λ1, λ2, …, λn,则: ext{tr}(A) = sum_{i=1}^{n} λi

计算机图形学、几何形变中矩阵的迹大致有以下作用:

  • 物理模拟:在表征应力和应变等物理量时,矩阵的迹可以用来衡量表面或体积的变形程度。
  • 网格形变:在网格形变(例如 ARAP 形变)中,局部旋转的最佳拟合通常通过 SVD 来寻找,而迹被用来评价变换的刚性程度,确保局部结构尽可能保持刚性。
  • 几何处理:迹用来计算几何对象的局部描述符,例如用于估计曲面的均值曲率或高斯曲率。

前置知识-基于曲面的变形(Surface-Based Deformations):

根据《Polygon Mesh Processing》第七章的形变定义,如下图对一个正方形的曲面S进行变形,固定曲面S浅蓝色的部分F,然后选取黄色部分H的顶点作为控制顶,将其向上拉动。可以看到经过变形后,没有被固定的部分(R,即深蓝色部分)的顶点的位置发生了相应的变换。 根本的问题就是如何选取合适的位移函数d,使得变形的结果符合需求。
在这里插入图片描述

sbd:位移函数d是从曲面S到三位空间的映射,即计算时在三角形网格上进行的。这类方法能够有很高的控制度,能够对每一个顶点都加以控制,但是其鲁棒性不好,运行效率往往取决网格的的复杂度和质量。
只需设置个别离散点的新位置来表达他所想要的形变,计算出剩余离散点应有的位置,改变一个模型的姿势或者说大体形态(全局变形),而不是模型的表面细节和组成部分(局部不变)。

前置知识- 奇异值SVD的分解:

SVD(Singular Value Decomposition)将任意一个复数或实数矩阵分解为三个特定的矩阵乘积的形式。假设我们有一个矩阵A m×n。SVD就是找到三个矩阵U、Σ和V^T,使得它们相乘的结果等于A。形式上来说就是:A = UΣV^T 这里的三个矩阵具有以下特点

  1. U:左奇异向量矩阵矩阵大小为m×m,它是正交矩阵,即U的列向量互相正交,并且都是单位向量(长度为1)。
  2. Σ(西格玛):m×n的矩形对角矩阵。它的对角线上的元素是奇异值,并且奇异值按照从大到小的顺序排列。非对角线上的元素都是0。在实际应用中,奇异值越大表示那个方向上数据的变化越大。
  3. V^T:右奇异向量矩阵的转置矩阵,大小为n×n的。原来的V是正交矩阵, 它就是其转置形式。和U类似,V中的列向量也是互相正交的,并且是单位向量。
    SVD分解在信号处理、统计学、计算机图形学以及机器学习中的降维压缩数据(如PCA主成分分析)等场合都会用到SVD。

举一个压缩ML数据的例子:假设A是一个人脸图片的矩阵,SVD能够识别哪些特征(比如脸部轮廓、眼睛位置等)是构成这些人脸最重要的。

这是因为较大的奇异值所对应的方向上,数据的变化量大,蕴含的信息丰富。通过保留这些主要特征,甚至可以将数据进行压缩,即用更少的信息来近似描述原始数据。

SVD性质:

  1. 存在与唯一性:对于任何一个实数或复数矩阵A(不必是方阵),都存在一个奇异值分解,而且奇异值在Σ矩阵中是唯一确定的,即如果奇异值都是不相等的,那么这些奇异值是唯一的。然而,U和V矩阵的列向量可以有符号上的改变(即方向的镜像),因为奇异向量是根据A的A^TA 和 ATA和AAT 计算得到的,并且仅确定到正负号。
  2. 能量分布:A的Frobenius范数(即矩阵元素平方和的平方根)等于其奇异值的平方和如下:如果A的SVD为A = UΣV^T,并且Σ的对角线元素(即奇异值)为σ_1, σ_2, ..., σ_p,其中p是A的秩,则Frobenius范数满足
    ||A||_F = sqrt(σ_1^2 + σ_2^2 + ... + σ_p^2)。当你截取前k个最大奇异值及其对应的奇异向量时,这就给出了A的最佳k秩近似。
  3. 数据压缩与去噪:由于SVD可以提供关于数据能量分布的信息,保留最大的几个奇异值及其对应的奇异向量,可以用于图像压缩和去噪,同时损失的信息相对较少。
  4. 线性方程组的求解:SVD可用来计算矩阵的伪逆,进而找到线性方程组的最小二乘解。
  5. 矩阵的秩:矩阵A的秩等于非零奇异值的个数,这个性质可以帮助我们判断矩阵是否满秩或找出其秩的大小。

SVD 3*3的例子:
奇异值分解(SVD)
奇异值分解(SVD)原理详解及推导

前置知识-形变能量

第一次接触形变的时候天天提到了能量一开始云里雾里,看的很懵懂很懵逼后来理解了所以我特意在这里强调!计算几何的形变能量是指数学上定义的一个函数,它衡量形变后的模型和原始模型之间的差异程度能量通常用于指导网格形变的过程控制形变行为,并确保形变结果满足某些期望的性质,比如局部细节特征的保持、体积的不变性等。形变能量通常被用作最优化问题中的目标函数,使得通过找到最小化该能量函数的解(最小二乘法等)来获得最终的形变结果。
比如将要讲的能量:

  1. 平滑能量:要求形变后的网格保持平滑,常用于避免过度扭曲或皱折。(Mesh平滑处理的几种算法比较)
  2. ARAP 能量:As-Rigid-As-Possible 形变希望每个局部区域都能尽可能地保持原始的形状和大小,这就涉及了计算每个小区域的局部旋转,并试图最小化它们相对于全局变形的偏差。
  3. 拉普拉斯形变能量:使用拉普拉斯坐标定义的能量,它试图保持原始网格和形变网格顶点的拉普拉斯坐标一致,以此保持网格的局部属性。

Laplacian Deformation形变及其改进:

简单来说拉普拉斯形变是基于网格顶点的拉普拉斯坐标,它记录了顶点与其邻接顶点之间相对位置关系的系统。拉普拉斯坐标的定义通常基于网格的拉普拉斯算子,个描述网格局部几何特性的微分算子。对于三角网格中的每个顶点,其拉普拉斯坐标是该顶点与邻接顶点位置差的加权平均
拉普拉斯形变以前大致讲过(Mesh形变算法) 或者看大佬博客图形处理(三)简单拉普拉斯网格变形-Siggraph 2004以及图形处理(五)基于旋转不变量的网格变形-Siggraph 2007
如下图拉普拉斯形变在旋转过程中的缺点:

  1. 体积损失:在大范围的旋转下,传统的拉普拉斯形变可能导致模型体积的损失,产生塌陷的现象,特别是在模型的细长部分。这是因为拉普拉斯算子是一个线性算子,它不直接编码旋转信息。
  2. 形状扭曲:由于传统拉普拉斯形变保持局部差分坐标,这些坐标并不完全与旋转不变性兼容。因此,当网格发生较大的旋转时,原先的局部结构可能会扭曲。
  3. 细节损失:拉普拉斯形变是非刚性形变!在旋转之后,如果相同的拉普拉斯坐标被用于重建形状,那么模型的一些细节特征可能会丢失,导致形状的全局或局部特征改变。
    在这里插入图片描述

基于旋转不变性的拉普拉斯形变是拉普拉斯形变的一个改进。拉普拉斯坐标被分解成一个方向向量(长度)和一个大小(权重)。然后这个方向向量会被调整,使其适应网格的旋转变化。这个改进的方法的关键是,它增加了对网格局部旋转的考虑。不仅保持了拉普拉斯坐标的大小不变,还尽量保持了方向向量在局部旋转下的不变性。这种方法可以使变形的结果看起来更加自然,特别是当网格经历复杂的旋转运动时。这些方法的共同点在于它们都利用了拉普拉斯坐标来保持网格的某些局部属性,基于旋转不变性的拉普拉斯形变由于考虑了旋转,往往在处理需要保留体积和细节的场景时更为优越。
在这里插入图片描述

ARAP形变:

As-Rigid-As-Possible跟拉普拉斯形变也是基于表面的变形,arap如何保证刚体:

希望尽量使所有的边都只经历刚体变换。 已知三角形具有稳定性,即三条边长度确定时形状确定。 尽量去保持每条边的长度也就是在尽量地保持局部的形状


在这里插入图片描述

ARAP形变框架中有两个关键的子问题需要解决:

  1. 位置变量(p): 这些是变形后顶点的位置。p 代表网格上每个顶点移动后的位置坐标。在优化过程中,这些位置会被更新以寻找变形的最终状态。
  2. 旋转变量(R): 这些是局部旋转R 表示与网格顶点相关联的旋转矩阵,它们用于描述网格局部区域的刚体旋转。对每个顶点或网格单元,都会找到一个最佳的局部旋转矩阵 R,使得变形后的局部结构在旋转意义上保持与原始局部结构的一致性。
    求解子问题1与2的这个过程通常会迭代进行,直到满足一定的收敛条件为止。

所以如下图是ARAP整体流程:分别固定 R 和 P ,求解都很容易:固定 R ,计算P ,固定旋转变量 R,找到新的位置变量 P,以降低全局的变形能量求解问题2 ; 固定P ,计算R ,固定位置变量 P,解决旋转变量 R,使局部结构尽可能地保持刚性求解问题1;
在这里插入图片描述

上图公式左边是arap的约束,希望所有边发生变化后形变最小,就是能量公式。左边为0(接近0) 是被控制点不管约束然后尽可能的靠近控制点!min 是希望这个着整个等式最小, 因为都是范数的平方,所以最好情况下等于0。 上图公式右边是用户手动调整的一些点(控制点),添加一个参数alpha,用于调整拖动的力度。alpha越大假如接近无穷大即,这样形变的被控制点一定会到用户拖动的点(控制点)的指定位置。

子问题一、在这里插入图片描述

子问题二、在这里插入图片描述

详细的子问题1 与2求解这里就不展开说看了呢一改比我讲的好!能量函数的最小化问题需要在局部和全局做迭代求解:全局过程使用新的旋转矩阵更新线性系统右边的向量,从而求解并更新每个顶点的位置P;局部过程则使用新的顶点位置更新协方差矩阵,并对协方差矩阵做奇异值分解,求得旋转矩阵R。反复迭代直至满足终止条件,获得变形后的网格。ARAP方法有一个性质就是最小化目标函数会使网格的边长变化最小,所以前面才说ARAP是如何保证刚性变化的就是根据这个来的!
特别注意:操作过程不能保证所有的网格点都只有刚性变换,所以只能在最优解下(不能算最小二乘法但是其实是类似的,因为论文发表的时间比最小二乘法的时间要早),找到对网格所有顶点尽可能接近的旋转矩阵。

初始化问题:分解成子问题1与2求解它们(类似于先有鸡还是先有蛋的问题),对此需要一开始固定哪一组变量。原作者的做法是如下:先把R初始化为3*3的单位三维旋转矩阵。原文如下
在这里插入图片描述

ARAP形变的性能消耗init和render阶段:

init:

  • 预计算邻接关系:需要确定网格中每个顶点的邻域,这包括找到与每个顶点相连的边和顶点,建立数据结构来存储这些信息。
  • 系统矩阵构建:建立线性方程组的稀疏矩阵(一共三个),其复杂度与网格的顶点数和连接性有关!

render 每一帧:

  • 局部步骤(Local
    Step):对于每个顶点,需要找到一个最佳的旋转矩阵,这个旋转矩阵使得其邻域顶点的形变尽可能刚性。通过奇异值分解(SVD)来实现占实时消耗的60-70%左右。
  • 全局步骤(Global
    Step):更新顶点位置以最小化整体形变能量,求解一个线性方程组,该方程组的大小与网格的顶点数成正比。求解这样的方程组通常使用共轭梯度法占比不是很大。

每次迭代就上面提到的分别更新P和R,性能上主要是更新R,每个顶点都对应一个旋转矩阵,都需要进行svd分解计算,这一步占迭代时间的60-70%。由于 SVD 在局部步骤中的计算成本较高,确实,很多性能开销是发生在执行SVD分解上的。特别是对于大型网格,SVD的计算会导致显著的性能消耗。可以考虑在GPU端实现ARAP算法。

Laplacian Deformation形变与ARAP的比较:

基于旋转不变量的拉普拉斯形变: 利用了拉普拉斯坐标,它是描述顶点及其相邻顶点位置关系的相对坐标系统(主要是保持每个顶点与其邻接点的相对位置不变)。拉普拉斯坐标捕获了局部的微分几何特征,并倾向于保持物体形状的光滑性和连续性,但是不太考虑保持物体的刚性。
优点:

  • 拉普拉斯形变能够比较好地保持网格的几何细节,因此适合微调模型。
  • 相对于ARAP,它解决的线性系统通常更简单,求解速度可能更快,不需要SVD等的求解。

缺点:

  • 拉普拉斯形变在处理大的变形时可能产生体积损失,也就是网格可能会塌陷。
  • 因为它直接使用了原始的拉普拉斯坐标,所以没有显式地考虑刚体的运动。

ARAP形变:ARAP形变则着眼于局部的刚体旋转,尝试在变形过程中最小化顶点与其邻接点之间旋转导致的变形保持每个小片区域尽可能刚性,使局部网格在旋转后尽可能保持形状。局部形状应该像刚体一样旋转,而有限的弯曲只发生在连接这些局部刚体的接缝处。因此更好地应对旋转和扭曲操作,有效地保持物体的刚性。
优点:

  • ARAP形变非常适合处理大的形变,它能够更好地保持网格的体积不变性,因此广泛用于动画和复杂变形(替代骨骼形变方案)。
  • ARAP对用户交互友好,因为它允许直观的拖拽操作并且产生预期的结果。

缺点:

  • ARAP需要在每次迭代时解决一个非线性最优化问题,比拉普拉斯要慢。
  • 算法实现相对复杂,并且需要额外的步骤来计算和更新局部旋转。

算法对比总结:

  • 当需要精细调整网格或执行小范围变形时,Laplacian Deformation是一个合适的选择,因为它能快速操作并且很好地保持细节。
  • 对于广泛的、直观的大规模形变,ARAP提供了更加自然的结果,尤其是在动画和实时编辑应用中表现突出。

参考资料:

Mesh形变算法
用数学编辑3D模型(一)- Mesh Deformation with Laplacian Coordinates
用数学编辑3D模型(二)- As-Rigid-As-Possible
图形处理(三)简单拉普拉斯网格变形-Siggraph 2004
图形处理(五)基于旋转不变量的网格变形-Siggraph 2007
《As-Rigid-As-Possible Surface Modeling》
经典论文推导: As-Rigid-As-Possible(ARAP) Surface Modeling

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418456.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学校机房Dev c++解决中文乱码问题

工具->编译选项->勾选 编译时加入以下命令 -fexec-charsetGBK -finput-charsetUTF-8 显示中文:工具->编辑器选项->去掉第一个的勾勾。

WebFlux的探索与实战 - r2dbc的分页查询

自从上次立下这系列的FLAG之后就再也不想碰了。今天难得早起出门面试,回家之后突发奇想打算再写点儿什么敷衍一下,于是便有了这篇文章。 前言 虽然响应式API更加适合流式列表的查询,但是分页这东西可是很常见的。 也没什么前言可说&#xf…

opencv中的rgb转gray的计算方法

转换原理 在opencv中,可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下, import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

在实训云平台上配置云主机

文章目录 零、学习目标一、实训云升级二、实训云登录(一)登录实训云(二)切换界面语言(三)规划云主机实例 三、创建网络三、创建路由器2024-2-29更新到此四、添加接口五、创建端口六、添加安全组规则七、创建…

公网IP怎么获取?

公网IP是网络中设备的唯一标识符,用于在Internet上进行通信和定位。对于普通用户来说,了解如何获取自己的公网IP是很有必要的,本文将介绍几种获取公网IP的方法。 方法一:通过路由器查询 大多数家庭和办公室使用的路由器都会有一个…

生成式AI设计模式:综合指南

原文地址:Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时,都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

Maven【3】( 依赖的范围,传递性和依赖的排除)(命令行操作)

文章目录 【1】依赖的范围结论验证①验证 compile 范围对 main 目录有效②验证test范围对main目录无效③验证test和provided范围不参与服务器部署 【2】依赖的传递性①compile 范围:可以传递②test 或 provided 范围:不能传递 【3】依赖的排除 【1】依赖…

apollo cyber RT初学

一 初识 ROS无法调度协调,且通信开销大,耗资源。百度自动驾驶团队开发了Cyber RT。 CyberRT从下到上依次为: 基础库:高性能,无锁队列; 通信层:Publish/Subscribe机制,Service/Cli…

h5移动端开发,android常见面试题及答案

1、Android系统的架构 Android系统架构之应用程序 Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAV…

【进阶C语言】内存函数(详解)

前言 上一期讲的函数都是和字符串相关的,但是我们在操作数据的时候,不仅仅是操作字符串的数据,还得需要内存函数的应用 内存函数的应用 1. memcpy1.1 memcpy的介绍1.2 memcpy的使用1.3 模拟实现memcpy库函数1.4 我想在1,2后面打印…

day05_用户管理minIO角色分配(页面制作,查询用户,添加用户,修改用户,删除用户,用户头像,查询所有角色,保存角色数据)

文章目录 1 用户管理1.1 页面制作1.2 查询用户1.2.1 需求说明1.2.2 后端接口需求分析SysUserSysUserDtoSysUserControllerSysUserServiceSysUserMapperSysUserMapper.xml 1.2.3 前端对接实现思路sysUser.jssysRole.vue 1.3 添加用户1.3.1 需求说明1.3.2 页面制作1.3.3 后端接口…

C语言题目:指针

1. 下面代码的结果是&#xff1a; #include <stdio.h> int i; int main() {i--;if (i > sizeof(i)){printf(">\n");}else{printf("<\n");}return 0; }答案&#xff1a;> 解析&#xff1a; i作为全局变量且在未赋值的情况下初始值为1&…

每日一练:LeeCode-701、二叉搜索树中的插入操作【二叉搜索树+DFS+全搜】

本文是力扣 每日一练&#xff1a;LeeCode-701、二叉搜索树中的插入操作【二叉搜索树DFS全搜】学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 …

看视频,学习使用MindOpt APL 建模语言编码数学规划问题,练习语法,实战拿奖品

活动介绍 活动名称&#xff1a;看视频&#xff0c;补充代码&#xff0c;拿精美礼品 活动规则&#xff1a; 浏览视频学习MAPL&#xff0c;完善“例题”。需要完善的内容&#xff1a;补充约束条件、读取csv表格数据&#xff0c;将决策变量的取值输出为csv表格&#xff0c;验证一…

pyuic生成py文件到指定文件夹

pyuic生成py文件到指定文件夹 关于如何在pycharm配置外部工具的方法这里不做赘述&#xff0c;本文主要说明&#xff0c;如何利用pyuic将ui文件生成到指定的项目目录中。 前提条件&#xff1a;已配置的pyuic工具可以正常使用生成文件到目录中。 一、打开外部工具配置页面 打开…

Java注解之@PathVariable,一文掌握@PathVariable注解知识(2)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

Office/WPS 好用的PPT插件-智能选择布局

软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;能够轻松帮助您修改、优化和管理幻灯片。凭借丰富的功能和用户友好的界面&#xff0c;PPT大珩助手能够助力您打造出精美而专业的演示文稿。我们致力于为用户提…

“平民化”非结构数据处理

在全球信息产业高速发展的背景下&#xff0c;IDC预测&#xff0c;2018 到 2025 年之间&#xff0c;全球产生的数据量将会从 33 ZB 增长到 175 ZB&#xff0c; 复合增长率27%&#xff0c;其中超过 80%的数据都会是处理难度较大的非结构化数据&#xff0c;如文档、文本、图形、图…

【数据分享】2000~2023年MOD15A2H 061 叶面积指数LAI数据集

各位同学们好&#xff0c;今天和大伙儿交流的是2000~2013年MOD15A2H 061 LAI数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 Myneni, R., Y. Knyazikhin, T. Park. MODIS/Terra Leaf Area Index/FPAR 8-Day L4 Global 500m SIN Grid V061. 2021, d…

RK3568平台开发系列讲解(基础篇)互斥锁实验

🚀返回专栏总目录 文章目录 一、互斥锁二、驱动案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、互斥锁 互斥锁为资源引入一个状态:锁定或者非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将…