今天看了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. SharePoint 2013 Workflow 分布式配置问题记录

    SharePoint 2013 发布已经有一段时间,前段事件主要是做财务项目,用到Oracle和HFM,由于从来没了解过这两个软件,把大部分时间用在了学习Oracle和HFM的API,目前对HFM的A ...

  2. jQuery Flickerplate 幻灯片

    Flickerplate 是个轻量级 jQuery 插件,大小仅为 12 kb.它允许用户点击鼠标然后转换内容,非常容易使用,响应式,支持触摸设备 在线实例 默认 圆点导航位置 动画方式 深色主题 H ...

  3. Bootstrap 我的学习记录3 导航条理解

    以下理论内容copy自Bootstrap中文网 (一个不错的bootstrap学习网站) 导航条 默认样式的导航条 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并 ...

  4. React 初学整理

    1,通过createElement创建元素 HELLO Word ps:切记组建名称首字母大写 2,虚拟DOM 在虚拟DOM上操作 通过render来渲染真是DOM 3,JSX JSX 是对JS的语法 ...

  5. 更换SAP主界面右边区域背景主题

    1)  Tcode:SMW0(注意,最后面是零,不是英文字母O),选择第二个单选按钮 2)点击回车后,直接点击运行按钮. 3)在SAP WEB 资源库:对象显示 页面,点击:新建 4)创建对象名称,名 ...

  6. 编写简单的C/S聊天程序

    找了点资料看了下,于是自己动手做了一个练习一下, 主要用到TServerSocket和TClientSocket这个控件. 客户端: var Form1: TForm1; NewTime:string ...

  7. bootstrap 学习笔记

    bootstrap作为当下的流行框架不知道它怎么能行呢? 之前也看过好多bootstrap的网上教程,可是发现光看真的记不住,说起来也真是忧桑~重点还是要自己做才是真正的印象深刻.后来我发现解析模板是 ...

  8. 安卓开发_浅谈Service

    一.Service(服务) Service是Android程序中四大基础组件之一,它和Activity一样都是Context的子类,区别在于它没有UI界面,是在后台运行的组件. public abst ...

  9. C语言中void*详解及应用

    void在英文中作为名词的解释为“空虚:空间:空隙”:而在C语言中,void被翻译为“无类型”,相应的void *为“无类型指针”.void似乎只有“注释”和限制程序的作用,当然,这里的“注释”不是为 ...

  10. 【读书笔记】iOS-GCD-Dispatch Queue

    一,Dispatch Queue的实现: 1,用于管理追加的Block的C语言层实现的FIFO队列. 2,Atomic函数中实现的用于排他控制的轻量级信号. 3,用于管理线程的C语言层实现的一些容器. ...