今天看了Corotational模型的代码。

在Vega中,获得模型内力的方法是先构造一个ForceModel对象,再调用其对应方法。

对于Corotational模型,构造的流程为:

构造CorotationalLinearFEM  -> 构造CorotationalLinearFEMForceModel

获取内力时,调用顺序为:

CorotationalLinearFEMForceModel::GetInternalForce ->

CorotationalLinearFEM::ComputeForceAndStiffnessMatrix ->

CorotationalLinearFEM::ComputeForceAndStiffnessMatrixOfSubmesh

其中ComputeForceAndStiffnessMatrixOfSubmesh 计算指定的体网格元素范围(给出下标上下限)的内力。

其中包含以下几种计算的方法:1. 线性(wrap=0)2. 把旋转矩阵抵消后的线性模型(wrap = 1) 3. 准确模型(wrap = 2)

以下是源代码注释:

// computes the internal forces and (warped) stiffness matrix for the entire mesh

  // vertex displacements (input) and internal forces (output) must be (pre-allocated) vectors of length 3 * numVertices

  // the internal forces are returned with the sign corresponding to f_int(x) on the left side of the equation M * x'' + f_int(x) = f_ext

  // i.e., the computed internal forces are *negatives* of the actual physical internal forces acting on the material

  // warp:

  //   0: no warping (linear FEM)

  //   1: stiffness warping (corotational linear FEM with approximate stiffness matrix) [Mueller 2004]

  //   2: corotational linear FEM with exact tangent stiffness matrix (see the technical report [Barbic 2012])

说明计算的内力是实际的负值。

先说明后两种的计算方法。

1.得到变形后的点P、 变形前的点M

2.F = P M^-1 得到变形梯度F

3.对F做极分解, F = RS, F正交, S对称正定

4.KElement = R * K * R^TKElement = R * K * R^T 其中K为线性模型的单元刚度矩阵

5.f = R * K  * (R^T x - x0)得到每个元素的f

6.若wrap=2 计算tangent stiffness matrix,十分复杂,暂时忽略。

对于线性模型,方法很简单,就是用单元刚度矩阵乘以位移。

下一步证明,wrap=1/2的方法与 Siggraph12的course note  FEM Simulation of 3D Deformable Solids给出的构造是等效的。这篇course先说明各个本构模型的能量,再推出每个本构模型力的表示法。

对于线性模型,弹性能量 E = 1/2 * d^T * K * d, K为刚度矩阵,d为每个顶点的位移向量,这一点可以通过把小变形应变张量代入线性模型的能量密度,再离散化得出。整个过程也是刚度矩阵的推导过程。

对于Corotate模型,弹性能量E = 1/2 * d‘^T * K * d’,K仍为刚度矩阵,但d‘为顶点位移抵消了旋转(乘以R^T)后的差值。这一点可以严格证明。证明的方法与刚度矩阵的推导方法类似,是根据F = RS = d(X +u ) / dX, 以及对corotate模型 ε  = S - I  ,推出 ε 与 du / dX 的表达式,推出 E = 1/2 * d‘^T * K * d’ 。

由此可见,Corotate模型就是把变形映射回旋转前的状态后的线性模型。

Corotational 模型代码的更多相关文章

  1. 多路复用I/O模型poll() 模型 代码实现

    多路复用I/O模型poll() 模型 代码实现 poll()机制和select()机制是相似的,都是对多个描述符进行轮询的方式. 不同的是poll()没有描述符数目的限制. 是通过struct pol ...

  2. Windows Socket五种I/O模型——代码全攻略(转)

    Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操 ...

  3. Matlab 图论最短路问题模型代码

    最短路问题的基本内容 最短路问题研究的是,在一个点与点之间连接形成的网络图中,对应路径赋予一定的权重(可以理解为两点之间的距离),计算任意两点之间如何和走,路径最短的问题.在这里的距离可以理解成各种两 ...

  4. [原创] Matlab 指派问题模型代码

    指派问题的基本内容 一般来说指派问题解决的是如何将任务分配到人,使得任务完成的效益最大化(成本型效益则求最小值,利润型效益则求最大值).上述问题一个 0 - 1 整数规划问题. 问题围绕着任务和人展开 ...

  5. Matlab 整数线性规划问题模型代码

    整数线性规划问题的基本内容 整数线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题.其中自变量只能取整数.特别地,当自变量只能取0或者1时,称之为 0-1 整数规 ...

  6. Matlab 非线性规划问题模型代码

    非线性规划问题的基本内容 非线性规划解决的是自变量在一定的非线性约束或线性约束组合条件下,使得非线性目标函数求得最大值或者最小值的问题. 当目标函数为最小值时,上述问题可以写成如下形式: \[ \mi ...

  7. Matlab 线性规划问题模型代码

    线性规划问题的基本内容 线性规划解决的是自变量在一定的线性约束条件下,使得线性目标函数求得最大值或者最小值的问题. \[ \min z=\sum_{j=1}^{n} f_{j} x_{j} \] \[ ...

  8. 多图上传控制器及模型代码(2)thinkphp5+layui实现多图上传保存到数据库,可以实现图片自由排序,自由删除。

    公共css代码 <style> .layui-upload-img { width: 90px; height: 90px; margin: 0; } .pic-more { width: ...

  9. iOS/macOS推荐个高效苹果开发工具, JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,支持Swift/Objective-C,极速转换

    CCJSON 是一款运行在macOS上 JSON 转模型代码工具,不再为复杂JSON数据写模型而烦恼,可识别嵌套模型,字典/数组,支持Swift/Objective-C,操作方便,极速转换.下载 效果 ...

随机推荐

  1. jQuery eislideshow 图片轮播

    在线实例 基础演示 自动播放 使用方法 <div id="ei-slider" class="ei-slider"> <ul class=&q ...

  2. Javascript面向对象编程(二)--- 构造函数的继承

    这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个"动 ...

  3. mysql innoDB 挂了的临时解决方案

    Mysql InnoDB: Error: checksum mismatch by Mattias Hemmingsson on December 23, 2013 in Linux • 6 Comm ...

  4. 浅谈ClickableSpan , 实现TextView文本某一部分文字的点击响应

    超文本:http://www.baidu.com 这么一个效果:一行文本当中 前面显示黑色颜色的“超文本:”,后面显示红色颜色的“http://www.baidu.com” 并且要求红色字体的部分可以 ...

  5. Google可能会用苹果的Swift 为什么?

    Google可能会用苹果的Swift 为什么? 2014 年夏天,苹果在 WWDC 大会上宣布了全新的程序语言 Swift,主要用来开发 iOS 与 OSX 应用. 去年年底,苹果将 Swift 开源 ...

  6. 【原/转】iOS中非常强大的过滤器:NSPredicate

    在APPLE的官方Demo:UICatalog中实现UISearchBar模糊搜索功能是这么做的: - (void)viewDidLoad { [super viewDidLoad]; self.al ...

  7. C语言-11-可变参数的实现方案

    概述 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法 C语言实现可变参数的方案是基于标准库的 可变参数的类型 可变参数可以放在一个集合中,可以使用指针类型的参 ...

  8. iOSQuartz2D-03-定制个性头像

    效果图 将一张图片剪切成圆形 在图片周围显示指定宽度和颜色的边框 实现思路 效果图中主要由不同尺寸的两大部分组成 蓝色的背景区域,尺寸等于图片的尺寸加上边框的尺寸 图片区域,尺寸等于图片的尺寸 绘制一 ...

  9. windows log 打印语句

    1.格式化字符串(Writes formatted data to the specified string) wchar_t szMessage[260]; PWSTR pszFunction = ...

  10. virtualbox 安装 虚拟机的时候报错不能创建新任务

    找到原因是因为自己的windows是破解的, 找到C:\Windows\system32\uxtheme.dll这个文件,我的破解的windows在这里自带了一个uxtheme.dll.backup的 ...