PD仿真算法中变形梯度矩阵的极分解

news2025/7/10 6:10:42

1.背景

PD(Projective Dynamics)仿真算法是一种“可并行化计算的”高效的软体形变模拟(或成为仿真、动画)算法,与传统的基于力的有限元方法不同的是,PD算法直接作用于顶点位置,通过最小化能量函数的方式来求得一个稳定的解。能量函数一般包括“系统偏离预期位置的能量”和“顶点位置约束能量”两部分组成,最小化能量函数可以通过引入辅助变量的方法转换为求解一个线性方程组的问题。详细的PD算法不在这里展开。

image-20221125101402737

本文要讨论的是PD算法中对于四面体网格模型“形状约束”的求解中矩阵论知识的应用。

四面体网格模型的“元”为四个顶点组成的四面体 { x 1 , x 2 , x 3 , x 4 } \{\mathbf{x}_1,\mathbf{x}_2,\mathbf{x}_3,\mathbf{x}_4\} {x1,x2,x3,x4},我们定义其形状
X = [ x 2 − x 1 , x 3 − x 1 , x 4 − x 1 ] , (1.1) \mathbf{X}=[\mathbf{x}_2-\mathbf{x}_1,\mathbf{x}_3-\mathbf{x}_1,\mathbf{x}_4-\mathbf{x}_1], \tag{1.1} X=[x2x1,x3x1,x4x1],(1.1)
定义形状的方式可能有很多,但是需要与空间位置无关,也就是要满足平移不变性。假设初始形状为“非奇异的” X 0 \mathbf{X}_0 X0,那么对于变形之后的四面体形状 X \mathbf{X} X,有
X = F X 0 或 F = X X 0 − 1 , (1.2) \mathbf{X}=\mathbf{F}\mathbf{X}_0 \quad \text{或} \quad \mathbf{F}=\mathbf{X}\mathbf{X}_0^{-1}, \tag{1.2} X=FX0F=XX01,(1.2)
其中 F \mathbf{F} F就是变形梯度矩阵。在PD算法中对于约束需要导出一个能量项,因此本文探讨的是如何导出变形梯度矩阵的能量函数。


2.极分解

为了对变形梯度矩阵进行“符合物理规律”的分解,首先需要了解极分解(polar decomposition)定理。

定理2.1(极分解):设 A \mathbf{A} A n n n阶实方阵,则一定存在正交矩阵 Q \mathbf{Q} Q唯一的半正定矩阵 T \mathbf{T} T,使得 A = Q T \mathbf{A}=\mathbf{Q}\mathbf{T} A=QT。若 A \mathbf{A} A可逆,则 Q \mathbf{Q} Q也是唯一的,并且 T \mathbf{T} T是正定的。

证明:

存在奇异值分解 A = V S U T \mathbf{A}=\mathbf{V}\mathbf{S}\mathbf{U}^T A=VSUT,其中 V , U \mathbf{V},\mathbf{U} V,U是正交阵, S = diag { σ 1 , … , σ r , 0 , … , 0 } \mathbf{S}=\text{diag}\{\sigma_1,\dots,\sigma_r,0,\dots,0\} S=diag{σ1,,σr,0,,0} σ 1 ≥ ⋯ ≥ σ r > 0 \sigma_1\ge\dots\ge\sigma_r>0 σ1σr>0,做变换
A = V S U T = V U T U S U T = Q T , Q = V U T , T = U S U T , (2.1) \begin{aligned} \mathbf{A}&=\mathbf{V}\mathbf{S}\mathbf{U}^T \\ &=\mathbf{V}\mathbf{U}^T\mathbf{U}\mathbf{S}\mathbf{U}^T \\ &=\mathbf{Q}\mathbf{T} ,\\ \mathbf{Q}&=\mathbf{V}\mathbf{U}^T , \quad \mathbf{T}=\mathbf{U}\mathbf{S}\mathbf{U}^T, \end{aligned} \tag{2.1} AQ=VSUT=VUTUSUT=QT,=VUT,T=USUT,(2.1)
Q \mathbf{Q} Q是正交矩阵, T \mathbf{T} T是半正定矩阵(特征值不小于0,对称);注意到
T = U S U T = ( U S U T U S U T ) 1 2 = ( U S S U T ) 1 2 = ( A T A ) 1 2 , (2.2) \begin{aligned} \mathbf{T}&=\mathbf{U}\mathbf{S}\mathbf{U}^T \\ &= (\mathbf{U}\mathbf{S}\mathbf{U}^T\mathbf{U}\mathbf{S}\mathbf{U}^T)^{\frac{1}{2}} \\ &= (\mathbf{U}\mathbf{S}\mathbf{S}\mathbf{U}^T)^{\frac{1}{2}} \\ &= (\mathbf{A}^T\mathbf{A})^{\frac{1}{2}}, \end{aligned} \tag{2.2} T=USUT=(USUTUSUT)21=(USSUT)21=(ATA)21,(2.2)
其中 A T A \mathbf{A}^T\mathbf{A} ATA是半正定矩阵,有 r = r ( A T A ) = r ( A ) r=r(\mathbf{A}^T\mathbf{A})=r(\mathbf{A}) r=r(ATA)=r(A)个非零特征值,则其平方根共有 2 r 2^r 2r种可能性,显然对于每个非零特征值都有正负两种平方根(即 ± σ i \pm\sigma_i ±σi)可以选取。而当所有非零特征值都选择正平方根( σ i \sigma_i σi)时,“半正定矩阵” T \mathbf{T} T就是唯一的。为什么 Q \mathbf{Q} Q不唯一呢?因为 T \mathbf{T} T里面有些特征值是 0 0 0

A \mathbf{A} A可逆,也就是 A \mathbf{A} A的特征值都不为 0 0 0,此时显然 T \mathbf{T} T是正定的,也是可逆的,因此 Q \mathbf{Q} Q唯一确定:
Q = A T − 1 (2.3) \mathbf{Q}=\mathbf{A}\mathbf{T}^{-1} \tag{2.3} Q=AT1(2.3)

3.变形梯度的分解

回顾变形梯度的定义式1.1,首先规定一点,四面体形状 X \mathbf{X} X在任何时候都是“非奇异”的,也就是不会退化成平面的情况。因此,变形梯度是可逆的

根据定理2.1,可对变形梯度进行极分解:
F = R S , (3.1) \mathbf{F}=\mathbf{R}\mathbf{S}, \tag{3.1} F=RS,(3.1)
其中 R \mathbf{R} R是“唯一的“正交阵, S \mathbf{S} S是”唯一的”正定阵。

这么做的好处是分解后的矩阵将“变形”的旋转部分和其它部分分离开来, R \mathbf{R} R是旋转部分(“rotation”), S \mathbf{S} S是拉伸和切变部分(“stretch"和"shear”)。 ∣ S ∣ |\mathbf{S}| S描述了四面体的体积变化。

具体分解步骤(前面的公式是教材上的公式,这里为了适应NumPy的定义换了符号):

  1. 奇异值分解: F = U S V \mathbf{F}=\mathbf{U}\mathbf{S}\mathbf{V} F=USV
  2. 计算 R = U V \mathbf{R}=\mathbf{U}\mathbf{V} R=UV S = V T S V \mathbf{S}=\mathbf{V}^T\mathbf{S}\mathbf{V} S=VTSV

4.实验

为了可视化地验证变形梯度矩阵的极分解,我设计了一个小实验:固定四面体的顶点 x 1 = ( 0 , 0 , 0 ) T \mathbf{x}_1=(0,0,0)^T x1=(0,0,0)T,变形前后的形状矩阵设置为
X 1 = [ 1 0 0 0 1 0 0 0 1 ] , X 2 = [ − 0.5 − 1.3 0 1.5 0 0 0 0 2.3 ] , (4.1) \begin{aligned} \mathbf{X}_1=\left[\begin{matrix} 1&0&0\\0&1&0\\0&0&1 \end{matrix}\right], \quad \mathbf{X}_2=\left[\begin{matrix} -0.5&-1.3&0\\1.5&0&0\\ 0&0&2.3 \end{matrix}\right], \end{aligned} \tag{4.1} X1=100010001,X2=0.51.501.300002.3,(4.1)

image-20221126103734809

直观上来看上述变形就是将四面体绕 z z z轴旋转90°,并且每个轴的方向拉伸一个系数,然后把 x 2 \mathbf{x}_2 x2沿 x x x轴移动 − 0.5 -0.5 0.5

根据第3节讲的变形梯度矩阵极分解的步骤,得到的结果为
R = [ − 0.17579064 − 0.98442758 0 0.98442758 − 0.17579064 0 0 0 1 ] , S = [ 1.56453668 0.22852783 0 0.22852783 1.27975585 0 0 0 2.3 ] , ∣ R ∣ = 1 , ∣ S ∣ = 4.485 , (4.2) \begin{aligned} &\mathbf{R}=\left[\begin{matrix} -0.17579064&-0.98442758&0\\0.98442758&-0.17579064&0\\0&0&1 \end{matrix}\right], \quad \mathbf{S}=\left[\begin{matrix} 1.56453668&0.22852783&0\\0.22852783&1.27975585&0\\ 0&0&2.3 \end{matrix}\right], \\ &|\mathbf{R}|=1, \quad |\mathbf{S}|=4.485, \end{aligned} \tag{4.2} R=0.175790640.9844275800.984427580.175790640001,S=1.564536680.2285278300.228527831.279755850002.3,R=1,S=4.485,(4.2)
单独对初始形状 X 1 \mathbf{X}_1 X1应用 R \mathbf{R} R S \mathbf{S} S的结果如下:

image-20221126103802678

实验结果符合预期。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wireshark Lab: Ethernet and ARP v7.0

Wireshark Lab: Ethernet and ARP v7.0 实验内容戳这里 介绍部分转自乌漆WhiteMoon Ethernet 以太网 以太网在现在的有线局域网中有着支配者的地位,就像是因特网使得全球互联那样。其实局域网技术还有令牌环、FDDI 和 ATM 等,但是以太网仍然具有很多…

第十三届蓝桥杯 C++ B 组省赛 G 题———积木画(AC)

目录1.积木画1.题目描述2.输入格式3.输出格式4.样例输入5.样例输出6.样例说明7.数据范围8.原题链接2.解题思路AC_code1.积木画 1.题目描述 小明最近迷上了积木画, 有这么两种类型的积木, 分别为 III 型(大小为 2 个单位面积) 和 LLL 型 (大小为 3 个单位面积): 同…

java面试强基(12)

什么是泛型?有什么作用? Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。使用泛型参数,可以增强代码的可读性以及稳定性。 编译器可以对泛型参数进行检测,并且通过泛型参数可以指定传入的对象类型。…

多媒体技术论文研读报告

多媒体技术论文研读报告 一、论文基本信息 论文题目为:基于多模态特征融合嵌入的相似广告检索方法,作者信息:南京大学计算机软件新技术国家重点实验室,南京大学软件学院冯奕、周晓松、李传艺、葛季栋、骆斌,深圳市腾…

2022最新JUC+多线程面试题

Java中实现多线程有几种方法 创建线程的常用的几种方式: 继承Thread类 实现Runnable接口 (重写run方法,无返回值) 实现Callable接口( JDK1.5>,重写call方法,可以自定义返回值 ) 线程池方…

带式输送机的传动装置设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1设计概述 1 1.2研究内容及参数 1 1.3 带传动 2 1.4圆锥-圆柱齿轮传动减速器 2 2结构设计 4 2.1V带传动 4 2.2减速器内部的传动零件 4 2.3联轴器的选择 4 3 设计计算过程及说明 6 3.1选择电动机 6 3.1.1电动机类型和结构型式选择 6 3.1.2…

android源码-ContentProvider实现原理分析

前言: 最初的目的是想研究下ContentProvider产生ANR原因的,但是如果要讲ANR的原因,那么必须要了解ContentProvider的完整实现原理,所以本篇就先讲一下ContentProvider的实现原理,下一篇再去讲ANR的原因。 本篇主要会讲…

估值破千亿,被资本疯抢的广汽埃安会是广汽的未来吗?

最近,广汽埃安在新能源市场上捷报频传,先是宣布完成了182.94亿元的A轮融资,成近年国内新能源整车最大的单笔私募融资。品牌估值更是达到了震撼人心的1032.39亿,基本等于广汽集团AH总市值,也远超港股小鹏、零跑汽车的市…

就两秒?这说出去谁信啊!

文 | xiaoyi(转载请后台联系)关注公众号:小一的学习笔记截止发文,北上广深一共有6510条公交线路为了获取上面的这些线路信息,我写了一个爬虫,大概用了2秒左右就搞定,真爽!说出来你们…

Maven环境搭建

目录一、安装及环境配置1.1、下载1.2、Maven目录结构介绍1.3、环境配置二、关于Maven仓库的说明2.1、仓库基本分类(私服仓库和中央仓库均为远程仓库)2.2、本地仓库的默认位置(在setting.xml中配置)2.3、中央仓库连接位置的体现&am…

K8S部署后的使用:dashboard启动、使用+docker镜像拉取、容器部署(ubuntu环境+gpu3080+3主机+部署深度学习模型)

0、k8s安装、docker安装 参考:前两步Ubuntu云原生环境安装,dockerk8skubeedge(亲测好用)_爱吃关东煮的博客-CSDN博客_ubantu部署kubeedge 配置节点gpu: K8S调用GPU资源配置指南_思影影思的博客-CSDN博客_k8s 使用gpu…

机器学习-(手推)线性回归1-最小二乘法(矩阵表达)、几何意义

一、最小二乘法(矩阵表达)误差平均分散每个样本 如下数学推到过程(手推!!!): 数据介绍: D{(x1,y1),(x2,y2),......(xn,yn), Xi(P维列向量&…

留学Essay写作主要靠哪些步骤得分?

期末来了,留学生该怎么办?如何做Essay?下面我们介绍提高写作能力的有效技巧! What should international students do when the end of the semester comes?How to do Essay?Here we introduce effective skills to improve your writing …

[附源码]SSM计算机毕业设计农贸产品交易系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

SSM框架-从JDBC到Mybatis,你今天CRUD了吗?

1 Jdbc 1.1 jdbc入门使用 导入驱动jar包 新建一个目录lib,把jar包放进去 add as library 具体代码 public class JDBCdEMO {public static void main(String[] args) throws Exception{//1.注册驱动Class.forName("com.mysql.jdbc.Driver");//2.获取连…

vue2 - 基于Export2Excel.js导出Excel案例(js-xlsx插件二次封装使用)

目录一、项目场景二、实现思路三、准备工作1、下载js-xlsx2、下载Export2Excel.js3、下载file-saver和script-loader4、下载mock四、代码实现1、mock数据2、使用Export2Excel.js导入导出excel数据3、App.vue代码五、运行结果六、进阶(复杂表头的导出)一、…

让我们拥抱DataV,感受数据可视化的魅力

最近领导给安排了一个工作,做原型设计。看了37万字的项目需求文档,发现客户对数据可视化要求很高。为什么用户对可视化要求这高呢?可以说,可视化也是这两年的热点了,大数据,可视化,数字孪生频繁…

[HFCTF2020]EasyLogin

有注册登录,先注册一个账号然后登录进去 在登录页面的源代码发现 访问得到 /*** 或许该用 koa-static 来处理静态文件* 路径该怎么配置?不管了先填个根目录XD*/function login() {const username $("#username").val();const password $(…

树形表,自关联表查询技巧

方法一:部门表,部门表中除了自身主键id外,还有另一个字段parentId父id,可以一直递归下去 数据库表: 菜单这样展示就需要我们在接口的返回值中,返回这样的层级数据: [{"id": 1,"…

Mybatis-plus使用教程

注意点:我们在主启动类上需要扫描我们持久层文件下的所以接口 MapperScan("com.kuang.mapper") 配置日志 mybatis-plus.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImplCRUD扩展 1.插入测试 //测试插入Testpublic void testInse…