太极图形学——弹性物体仿真 1

news2024/11/24 15:39:03

1.仿真基础,时间和空间的离散化

        渲染对于物体的展现来说是一件很重要的事

        但除了渲染之外,还需要物理来控制,形成动画

弹性物体的仿真实际上非常重要,特别是对于头发,衣物的仿真,虚拟手术中软组织的仿真

仿真无非就是求在不同的时间下,物体在什么位置,就像是下面这张图,经典的中学物理题

那么今天就会搭建一个可以形变的物体模型

那么我们需要的就是这个details是怎么实现的,在代码例程中包含的有质点弹簧和线性有限元模型

在时间和空间上做积分,重点将放在如何制作一个仿真器

要用到的一些基础的公式

对于线性材料而言,就是胡克定律,利用此定律可以求出力和加速度,很多时候,现实中的材料都不是线性材料,这种仿真一般都是用于声音的仿真

大部分材料都是非线性材料,弹性仿真无非是用力来更新速度,用速度来更新位置

2.时间积分

        从直观的角度上理解,仿真我们所需要的是一个黑盒,这个黑盒的作用是若我们给黑盒输入一个物体当前的位置和速度,我们就能知道下一时刻的该物体的位置和速度,而要实现这一些就是黑盒所做的工作

        那这个黑盒要怎么写呢,根据前面所写的公式,我们可以很容易的知道,速度是位置的导数,加速度是速度的导数,又根据所呈现在屏幕上的图像永远是离散化的,那么就有一个时间的步长,我们需要做到的是根据这一时间的位置和速度求出下一时间的位置和速度,结合牛顿第二定律,那么就有位置的变化是当前位置加上位置的变化量,也就是速度对于时间的积分,速度则是当前的速度加上速度的变化量,也就是加速度对于时间的积分,加速度可以由物体的质量和外力和来表示

        这个公式的存在,有一个问题,首先就是积分问题本身就不好求解,这是其一,第二是我们事实上并不知道任何在tn,也就是当前时间之后的值,也就是一时刻的力和速度,这也同时就代表着我们无法使用类似蒙特卡洛的方法来进行这些估值计算

        这样的话,我们就只能使用数值积分的方法,那么从这里开始就出现了两种经典的方法

方法一:前向欧拉算法(显式积分法)

        因为此时我们的问题是不知道在当前时间之后下一时刻的任何值,那么我们就从加速度出发,因为加速度对于时间的积分为速度,且在积分的表现上就是两时刻之间,加速度(力)函数所代表的面积,那么我们就认为此时(当前时间到下一时刻)的力是恒定的,面积的求法直接使用当前时刻的加加速度(力)为高乘以时间的长度,就可以得到速度,那么传统的前向欧拉算法的过程就是使用当前的速度更新我的位移,再使用当前的加速度(力)来更新速度

        但这个方法的问题在于,随着时间的增长,这个系统的能量会不断的膨胀,用不了很长的间,速度和位置的更新就会发散

        这种前向欧拉算法很容易理解,也很容易实现,但由于能量的问题,很少会用在仿真上,现在我们讲的显示积分法都是先以力更新速度,再用更新过的速度来更新位置,这样做的好处就是整个系统的能量会处于一种振荡波动的状态,也可以认为是一种稳定的状态,保持了动量守恒

        在高精度的仿真,或者天体仿真中,这种显示积分法一般是首选

方法二:后向欧拉法(隐式积分法)

所谓的隐式积分法,就是一个解方程的过程,直观的理解就是使用下一时刻的力作为不变的力来更新速度,再用速度来更新位移

隐式积分在使用的过程中,能量会一直减小,虽然会产生数值阻尼,但是,随着能量的减小,也代表着我们可以采用更大的时间步长,可以防止系统的爆炸

这种积分的使用方式一般用在对时间要求比较高的模拟系统中,例如游戏,动画,混合现实这些系统运用中

显式积分做法实际操作

        整个对时间积分的显式方法的流水线可以被很简单的概括,首先若是对于弹性物体的模拟,我们需可以先根据能量求出力,再由力来更新速度,再由更新好的速度来更新位置,这个流程从理解上十分的容易

以之前的天体运动来作为例子,首先是根据能量求导得到力

最大的问题是,对于保守力来说,我们一直所需要的就是能量,用这个推导就可以得到之后的一切

但是对于弹性物体呢,弹性物体是一个连续介质物体,能量需要对整个空间的能量密度求积分,那么我们应该怎么对能量密度求解积分呢

空间积分:

需要做到的就是对空间进行积分,那么对于空间进行积分的方法主流的有两种,一种是质点弹簧系统,一种是线性有限元

在进行这两种方法的总结时,最重要的问题就两个,一个是怎样去描述形变的,一个是有了形变之后怎样去描述能量的

方法一:质点弹簧系统(MSM)

这是一种简单但却有效的方法,首先,对于一个连续介质的弹性物体,我们需要将其离散化成很多的顶点,每一个顶点具有质量,根据三角形或者体积的大小将整个物体的质量分配到这些顶点上,然后使用弹簧来连接这些顶点,在物体未形变的时候,弹簧会被回归原长

每一个连接顶点的边都被认为是一个弹簧,那么这种弹簧是怎样去描述形变的呢,很简单,根据弹簧本身的性质,两个质点之间的距离是弹簧的原长,而在形变后质点之间的距离是弹簧的现在的长度,两个长度之间的差值就代表了物体的形变

那么是怎么定义能量和力呢,也很简单,根据胡克定律就可以了,根据弹簧长度的变化就可以求出能量的变化

根据这个能量,就可以求倒数,根据能量对位置的求导就可以求出某一点所受到的力的大小

那么在空间中的积分是怎么做的呢,总能量对其中每一个点的位置进行求导就可以得到每一个点位置的力的大小

代码写起来也很直观,分为空间积分部分和时间积分部分,空间积分部分用于求梯度,也就是力的大小(方向相反),再在时间积分中首先计算加速度,再利用加速度更新速度,再用速度更新位置,使用了显式积分的更新方法

弹簧系统常常用于布料和头发的仿真当中,特别是这种一维的系统

但是在体积的更新方法中,很难使用弹簧系统来进行更新,因为很容易出现翻转

所以对于有面积和体积的物体,大量的研究还是倾向于使用线性有限元的方法

方法二:线性有限元(FEM)

对于形变表达的映射

这个映射我们称为形变图,这个map在很多的方面都很像渲染中的仿射变换,包括位移,旋转以及拉伸

使用微分的方法去思考的话

        可以被描述为一个仿射变换,这个F就被称为形变梯度(constant matrix),这一块的内容在game103课程中也有详细的描述,在这里我们是认为在一个很小的范围里,可以认为这个很小的地方是一个仿射变换

举几个例子,首先是平动的例子,矩阵F就是映射对X求导,最后得到的就是一个单位矩阵

如果是旋转,也是一样的,F此时就是R

当然,对拉伸的映射也是

       ,其实从上图中就可以看到,这个形变梯度只和旋转以及拉伸有关,那么严格的定义中,对于某一个较小的位置,我们都可以认为形变后的位置是一个形变前位置的仿射变换,这个变换中,形变梯度是一个雅克比矩阵

        对于能量,我们是怎样去理解的呢,我们希望任何一个非刚体的形变,希望它的形变梯度可以带来一个非0的能量,也就是说物体在做非刚体运动时,能量不置0

        那么能量怎么定义呢,通过能量密度来定义,也就是在一个非常小的空间内能量是一个什么样子的

        这个能量密度公式中,x可以由X的映射来表示,所以能量可以写成一个X的函数。又因为,事实上能量和平动没有关系,继续化简,x和X只是物体的初始或者静止位置,所以说,能量可以完全定义成只和形变梯度F有关系的东西

这样就完成了对能量密度的定义,一个关于F的函数

这个应该怎么具体来定义呢

        需要这个形变的定义是纯粹的,具有旋转不变性和平移不变性,在没有形变的时候,能量需要为0,所以这时候就需要引入应变张量来描述形变,需要满足当为初始状况时,形变应该为0,但有旋转的时候,该张量是不变的,有哪些张量可以用来使用呢,需要找到一些本构模型,其中stvk在图形学中用的是最多的,满足了上述的条件

        stvk model使用格林应变张量,这个的好处是使用了一个F的转置,因为如果此时有旋转的话,那么代入旋转矩阵,由于旋转举证的转置等于其逆矩阵,所以具有旋转不变性

        此时应变就是用来描述形变的东西,那么有了对于形变的描述,接下来就是如何描述能量,能量的公式一般用第二个,也分为两个部分,第一个部分表示硬度,一个部分用来保体积

        那么在能量密度定义后我们需要将其离散化,也就是知道总能量是多少,用能量密度对于整个物体的面积做一次积分

那么此时就轮到FEM登场对物体做离散化了、依然将整个物体分为很多的区块,使用FEM还有一个假设,就是在每一个区块内,所有的点都是平均的,做的是相同的线性映射,也就是F形变梯度是一个常数

这样就将其转换成了一个对空间求和的过程,每一个小的元素的能量,由于在每一块区域的内部,能量密度是一个常数(F不变,应变张量就不变,能量密度就不变),和此时的位置没有关系,就可以提取出来

有了线性元素的存在,可以直观的将F求出来,也就是说在已知形变前和形变后的位置后,能够很容易的求解出形变矩阵的大小

我们要求力的话,首先能量对于位移的导数是力,那么能量密度对应变张量的求导呢

最后得到的是第一皮尔科舍夫应力张量,所谓的应力张量就是在张量空间中,力的扰动对能量的变化,也就是这是张量空间下,力是怎么表示的

第一皮尔科舍夫应力张量

所以,第一皮尔科舍夫应力张量是怎么得来的呢,总的来说,首先需要得到的是位移前的位置X和位移后的位置x,因为已知的位置就知道了边的位置向量,再根据几条边的位置向量我们可以根据公式x = FX + t 得到F(形变梯度),得到形变梯度后,求解得到格林应变张量 Green strain,由格林应变张量我们可以结合空间积分得到的能量公式,结合stvk的本构方程,得到能量密度,再由能量密度对应变求导可以得到应力张量,此时的应力张量其实是第二皮尔科舍夫应力张量,还需要乘以一个F,才是第一

实际上也就是之前在games103中的这个过程

那么此时我们需要知道的就是能量对于位置的导数

在太极中的用法

在太极中具有可以直接求出总能量的公式

用线性有限元的公式来表示质点弹簧,也就是一种变体的FEM

        胡克定律也可以认为是一个线性有限元公式

计算机图形学入门Games103——线性有限元模型FEM_csdn 有限元模型-CSDN博客

计算机图形学入门games103——fvm体积有限元-CSDN博客

        

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

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

相关文章

JupyterNotebook添加Anaconda中已有的虚拟环境

比如,在Acaconde中存在一个我已经配置好的虚拟环境pose,现在我想在Jupyter中使用它 那么可以使用ipython kernel install --user --name 你要添加的环境 添加到Jupyter中。 对于Jupyter中已有的代码,就可以在Kernel - chanage kernel中改变内核。

大模型+XDR!打开网络安全攻防演练新范式!

网络安全领域面临着日益复杂的挑战,外部攻击与内部安全威胁交织的双重压力。技术革新成为筑牢安全防线的关键,随着新一代技术的崛起,特别是大数据与人工智能的深度融合,引领着网络安全进入全新阶段。 通过构建网络安全大模型&…

批量重命名图片文件名,这几种方法告别手打!

在这个数字化时代,图片已成为我们日常生活和工作中不可或缺的一部分。无论是整理旅行照片、管理项目素材,还是编辑文章配图,图片的管理都显得尤为重要。然而,面对成百上千的图片文件,如果还在逐一手动修改文件名&#…

OpenSNN推文:研究发现,人工智能以牺牲集体多样性为代价提升个人创造力

 ChatGPT 等生成式 AI 工具的兴起引发了关于它们对创造力和新颖想法产生的影响的争论。 伦敦大学管理学院和埃克塞特大学研究人员开展的一项新研究探索了生成模型对创意写作的影响。该研究考察了获取大型语言模型 (LLM) 生成的故事创意如何影响人类创…

使用 Python 执行 JavaScript

案例引入 网站: https://spa7.scrape.center 这里是一个简单的 NBA 球星的网站, 用卡片形式展示了一些球星的基本信息。另外,每张卡片其实都有一个加密字符串,这个加密字符串其实和球星的信息是由关联的, 并且每个球星…

数据库范式及其示例,看完这一篇足够

1. 什么是数据库规范化? 1.1 规范化概念 规范化是一种数据库设计技术,可减少数据冗余并消除插入、更新和删除异常等不良特征。规范化规则将较大的表划分为较小的表并使用关系链接它们。SQL 中的规范化的目的是消除冗余(重复)数据…

Java面试题:Spring循环引用(循环依赖)

Spring中的循环引用 在创建A时需要B,创建B时需要A 三级缓存解决循环依赖问题 在Spring中定义了一个类 DefaultSingletonBeanRegistry 中定义了三个map singletonObjects 一级缓存 单例池,存放完整初始化的bean对象 earlySingletonObjects 二级缓存 缓存早期的bean对象…

【JavaEE初阶】CAS(比较和交换)

目录 🌲 什么是 CAS 🌳 CAS的应用 🚩 实现原子类 🚩 实现自旋锁 🎄 CAS 的 ABA 问题 🚩 什么是 ABA 问题 🚩 ABA 问题引来的 BUG 🚩 解决方案 🍀CAS相关面试题 …

自动化测试客户端程序 时,选择使用什么自动化测试工具?

自动化测试客户端程序时,可以选择多种自动化测试工具,这些工具根据测试的具体需求、目标平台以及开发语言等因素有所不同。以下是一些常用的自动化测试工具,它们分别适用于不同的测试场景: 1. Appium 简介:Appium是一…

你要动态建表,还要动态导入Excel?

背景 ⭐⭐⭐⭐⭐转载请注明出处:https://juejin.cn/post/7400945359192866828 前几天和公司的小伙伴聊天的时候,得知他们的项目里正要做一个功能。大概就是每家公司都会建一张表,这张表会有什么字段不确定,可能有的表10个字段,有的8个字段。然后会有导入的功能,就是给这张…

java实现解析pdf格式发票

为了减少用户工作量及误操作的可能性&#xff0c;需要实现用户上传PDF格式的发票&#xff0c;系统通过解析PDF文件获取发票内容&#xff0c;并直接将其写入表单。以下文章记录了功能实现的代码。 发票样式 发票内容解析 引用Maven 使用pdfbox <dependency><groupI…

API可观察性对于现代应用程序的最大好处

API可观察性是提升性能、加速问题诊断和增强安全的关键。它在理解和管理错综复杂的API交互方面发挥着至关重要的作用。利用API可观察性&#xff0c;您可以深入洞察API的工作状态&#xff0c;保障服务的可靠性&#xff0c;并优化用户体验。 在当今的数字环境中&#xff0c;API …

kubernetes集群部署sql server数据库服务

背景&#xff1a; 因业务上线需要&#xff0c;研发中心要求在kubernetes测试集群部署一个sql server 2017的数据库&#xff0c;用于业务功能调试。 一、实施部署sql server数据库&#xff1a; 1、拉取sql server 2017的镜像&#xff1a; [rootharbor-02 ~]# docker pull mcr…

POI导出复杂Excel表格

记录在遇到复杂统计报表业务时&#xff0c;无法使用Excel模板生成对应报表&#xff0c;则采用最原始poi方式进行创建生成 业务所需统计报表如下图 麻烦所在各类型订单下方餐别为动态数据&#xff0c;废话不多说直接上代码 new CellRangeAddress(起始行号, 终止行号, 起始列号,…

Android Studio 设置打开layout.xml文件的默认视图split

Android Studio 设置打开layout.xml文件的默认视图 Android Studio 设置打开layout.xml文件的默认视图 androd studio 在使用的时候打开我们自己的布局文件默认展示的视图为Design,我们想要编辑的时候还有手动切换成splite 视图或者Code视图&#xff0c;不上很方便&#xff0c…

CA证书和openssl介绍

文章目录 一、加密和算法常见的安全攻击加密算法和协议对称加密非对称加密算法 二、CA和证书中间人攻击CA和证书安全协议SSL/TLS协议介绍HTTPS 三、opensslopenssl介绍使用openssl实现对称加密使用openssl命令生成加密密码生成随机密码建立私有CA证书申请颁发建立私有CA实际例子…

Java-数据库基本概念

数据库DataBase 定义: 保存一组数据的仓库就是数据库 例 BirdBoot项目中&#xff0c;我们为了保存一组用户信息&#xff0c;创建了一个目录users。里面用若干个文件保存每一个用户信息 此时users目录就可以称为是一个数据库 只不过对于这些数据的维护操作&#xff0c;要么…

【最多可以参加的会议数目】python刷题记录

R4-贪心篇 结束时间升序排列优先队列 class Solution:def maxEvents(self, events: List[List[int]]) -> int:dictdefaultdict(list)for i,val in enumerate(events):dict[val[0]].append(val[1])#优先队列&#xff08;小根堆&#xff09;h[]ret0for i in range(1,100001)…

C语言求平方和倒数

文章目录 1. 代码实现float类型数据double类型数据使用 double 类型的调整 2. 魔数与位级别操作浮点数表示位级别魔数操作 3. 牛顿迭代4. 复杂代码具体解释具体解释&#xff1a;目的&#xff1a;举例&#xff1a; 5.感谢 平方和倒数 广泛用于计算机图形学中&#xff0c;尤其是在…

Qt实现类似淘宝商品展示看板功能简版

前一篇文章的简化版本只有浏览功能&#xff0c;前一篇文章链接如下&#xff1a; Qt实现类似淘宝商品看板的界面&#xff0c;带有循环翻页以及点击某页跳转的功能 效果如下&#xff1a; 代码留给有需要的人。 #ifndef ModelDashboardGroup_h__ #define ModelDashboardGroup_…