随笔分类 -  有限元物理模拟笔记

摘要:Rig Space simulation can add detailed motion to an existing animation. Source code: https://github.com/league1991/RigFEM Simulation result: Input Anim 阅读全文
posted @ 2017-01-19 13:58 dydx 阅读(556) 评论(0) 推荐(0)
摘要:今天看到共轭梯度法的两种实现,一种称为fletcher-reeves(FR-CG)方法,另一种称为polak-ribiere(PR-CG)方法。在含体积蒙皮的模拟过程中,两者差别不大又对比了wolfe的c1,c2取值,发现c2取0.1时,共轭梯度法在初始阶段收敛较取0.45时快,但后期收敛慢在不含体积蒙皮的模拟过程中,两者性能略有差别。但差别与是否只取大于0的beta,是否在梯度与上次迭代梯度方向... 阅读全文
posted @ 2015-04-20 02:23 dydx 阅读(811) 评论(0) 推荐(0)
摘要:把硬度不均匀材料的模拟实现了。图中的T形物体左臂和右臂用了一样的变形器,但是材料的硬度不一样,硬度大的地方用橙色表示,小的地方用蓝色表示。可以发现,橙色的一侧摆动幅度较小。来自为知笔记(Wiz)附件列表tshape.gif 阅读全文
posted @ 2015-04-07 02:12 dydx 阅读(307) 评论(0) 推荐(0)
摘要:今天发现一个问题。在一个粒子中,模拟一根棍子的弯曲参数,但是这根棍子会自己移动,且移动动画是外部指定的。模拟之后,播放动画发现,网格与模拟结果(用线框显示)不重合。 产生这种现象的原因在于maya的节点求值机制。在模拟过程中,是不断进行以下步骤:1. maya自动对节点网络求值。包括粒子系统状态更新,动力学系统模拟2. 进行有限元模拟,算出网格顶点的位置、速度、加速度等结果3. 把结果写入下... 阅读全文
posted @ 2015-04-06 18:41 dydx 阅读(170) 评论(0) 推荐(0)
摘要:实现了系统与N布料的碰撞。可以发现图中多了很多蓝色的小球,这些小球是吸附到网格顶点的n粒子,用于碰撞检测。这是由于从头实现一个碰撞检测算法实在太麻烦,而且难以与maya原有的动力学系统兼容,所以利用n粒子作为"感应器",具体方法是:1. 创建等于表面网格点数的n粒子2. 利用goal命令,让每个n粒子与网格顶点一一对应3. 让物体碰撞n粒子,再让n粒子把碰撞力传到模拟节点4. 进行模拟,这样就可以... 阅读全文
posted @ 2015-03-31 11:15 dydx 阅读(361) 评论(0) 推荐(0)
摘要:尝试为场加入PD控制在之前的模拟中,需要最小化一个能量函数H。这样做的原因是,由理想约束的特性(约束反力垂直于虚位移),对于不含体积蒙皮的情况,可以推出对于表面点,有J^T * Σfs = 0对于内部点,有Σfn = 0而对于体积蒙皮的情况,对于表面点,仍有J^T * Σfs = 0对于内部点,有J^T * W^T * fn = 0其中W为蒙皮权重矩阵综合两种情况,可以发现,这些力平衡情况都同H函... 阅读全文
posted @ 2015-03-28 20:02 dydx 阅读(1564) 评论(0) 推荐(0)
摘要:看了 Real-Time Control of Physically Based Simulations using Gentle Forces这篇文章文章截图如下:文章要完成的任务是,首先给定一个参考网格序列,然后在实际物理模拟中,对照参考序列施加额外的力,使得模拟的序列既保持物理真实,又能够受到参考序列控制。对于有限元模拟,有动力学方程其中p是顶点位移,dp/dt是速度。令状态变量z=[p,d... 阅读全文
posted @ 2015-03-28 19:32 dydx 阅读(284) 评论(0) 推荐(0)
摘要:现在尝试用maya场去影响有限元模拟,这样就可以利用maya现有的变形功能,创造出更丰富的效果。初步的想法收到Example-Based Elastic Materials的启发,利用场给每个节点施加额外的力。但是这样会导致一个问题。原来的优化模型中,弹力、惯性力都是保守力,也就是说,这些力做功与路径无关,于是它们各自对应一个能量。弹力对应的是弹性势能,惯性力也有对应的能量形式。整个算法框架就是力... 阅读全文
posted @ 2015-03-26 11:22 dydx 阅读(203) 评论(0) 推荐(0)
摘要:今天把模拟节点与maya场的对接做好了,效果如图:图中黄色线为每个节点受到的外力,由于加了一个重力场,所以外力都是竖直向下。节点连线方式如图所示:交互的具体方法是在每次模拟之前,更新每个节点所受的外力。模拟过程中这个外力保持不变。更新外力的方法是,用当前每个节点的速度、位置、质量去设置fieldData组合属性,然后从inputForce读取各个场返回外力值,并求和。下一步考虑如果对参数进行控制。... 阅读全文
posted @ 2015-03-20 23:42 dydx 阅读(312) 评论(0) 推荐(0)
摘要:Rig-Space Physics论文中,提到了一种控制模型硬度的方法。此方法的关键是找到一种途径,缩放每个四面体元素的硬度。最直接的思路是,把某个位移下,参数空间的恢复力表示成四面体元素硬度的函数。这样,让某个恢复力增大k倍,再反求出此时四面体元素的硬度。但是有一个问题,那就是多数本构模型都是非线性的,函数关系十分复杂,基本上不可能求解。(似乎不一定,因为恢复力是位移的非线性函数,但一般来说是硬... 阅读全文
posted @ 2015-03-18 15:59 dydx 阅读(269) 评论(0) 推荐(0)
摘要:发现一个问题,一旦牛顿法的一维搜索失败,函数不降反升。需要修改代码,从避免被吸引到Hessian非正定的局部极值点。同时发现昨天做的模型模拟的时候有限差商导数步长设太小了,提高导数步长之后(设成0.05),牛顿法收敛速度明显加快(往往第一次迭代把梯度长度从几十万降到1k左右,第二次迭代进一步降到几十,接下来由于浮点误差(参数增量已经到达10^-6左右),在最优点附近震荡)另外牛顿法求hessian... 阅读全文
posted @ 2015-02-15 10:26 dydx 阅读(312) 评论(0) 推荐(0)
摘要:这两天找了一个模型进行测试,结果如下,注意肚子:后背如图:这是计算前的动画:各个模型如下:做法分为几点:1.给模型的rest pose加上三个soft modification变形器(图中的s标记)2.让蒙皮网格操纵一个粗网格3.建一个有限元模拟节点,让其操纵soft modification的控制手柄,接收粗网格4.进行有限元模拟当前可以把模拟结果“烘焙”成动画曲线,利用mel命令,能够根据所给... 阅读全文
posted @ 2015-02-13 20:40 dydx 阅读(650) 评论(0) 推荐(0)
摘要:今天实现了一个简单变形器,可以用一个网格的形状影响另一个网格的形状。如图,蓝色网格的形状被灰色网格操控。当前的算法非常简单,就是计算蓝色网格每个点到灰色网格每个点的距离,以距离x次方的倒数作为权重。没有使用均值坐标等高级算法。cage deformer节点的参数如下:max neighbour是影响蓝色网格每个点的最大灰色网格顶点数weight power是计算权重的参数下一步可以利用这个变形器尝... 阅读全文
posted @ 2015-02-11 14:20 dydx 阅读(277) 评论(0) 推荐(0)
摘要:接下来有一些功能上的改进:1. 增加选择显示的功能:显示模拟后的结果,还是直接显示初始参数(已做)2. 写一个节点,实现perlin噪声的效果(不用做,直接用noise节点)3. 写一个切换节点,从输入的两组数据中选择一组直接输出,并且能够把一组数据的每帧的值复制到另一组去4. 模型对于有洞的网格不能体网格化,要考虑如何处理。能否给定一个网格,生成一个包围它的简单网格,而且在原来网格变化了之后,简... 阅读全文
posted @ 2015-02-11 14:08 dydx 阅读(322) 评论(0) 推荐(0)
摘要:今天打算改进一维搜索算法要求一维搜索类做到以下几点:1.在失败时,能够返回失败的具体原因,以便根据不同情况分别处理2.尽可能找到使得函数充分下降的步长发现初始步长选得不是越小越好,太小的步长会出现数值误差,导致一维搜索出错能够把参数记下来下次使用当前采用了一些改进,包括1. 在共轭梯度法和牛顿法中,强制限制每次迭代的参数最大增量,避免Hessian不定、半正定等情况导致的参数突变2. 在共轭梯度法... 阅读全文
posted @ 2015-02-06 23:30 dydx 阅读(209) 评论(0) 推荐(0)
摘要:今天把一维搜索和共轭梯度法加在牛顿法前面,发现模拟比较顺利了。这个是模拟的结果,从左到右硬度递增在某些情况下还是有问题,如图在伸直姿态附近容易走到局部极值。发现模拟失败有以下几种情况:1. 牛顿法失败以下是其中失败的一步:G=[50482.700496 -243431.343366 ];f = 186558.898373, |GP| = 248610.784123, minGradSize = 1... 阅读全文
posted @ 2015-02-05 16:16 dydx 阅读(358) 评论(0) 推荐(0)
摘要:今天把蒙皮模拟算法实现了。具体方法是加载此前算出的权重矩阵,每个内部点都是表面点的加权平均。于是求解的时候唯一的未知数就是参数p了。这次牛顿法能够模拟,但是同之前不带权重的模拟算法一样,模拟过程中无法收敛到全局极值点。出问题的是这根棒。控制这根棒的参数有两个,一个是弯曲大小,另一个是弯曲方向。当强制令弯曲方向不起作用是,能够正常模拟,结果如上图。当让弯曲方向参数起作用时,结果如下,模型不弯曲。 检... 阅读全文
posted @ 2015-02-04 17:59 dydx 阅读(307) 评论(0) 推荐(0)
摘要:今天试图实现内部点权重的计算。在论文中,权重的计算过程是这样的:其中solveNNLS是求解这个方程s为表面点,q为内部点发现两种方法:1.一种是把内部点位置表示成表面点的线性组合2.另一种是把内部点的位移表示成表面点的线性组合第2种可以化成内部点位置表示成表面点的线性组合,加上某个常数向量估计代码中的while循环是为了避免过拟合。来自为知笔记(Wiz) 阅读全文
posted @ 2015-01-26 11:55 dydx 阅读(304) 评论(0) 推荐(0)
摘要:今天实现了把模拟状态保存为文件的功能。当前的模拟对话框为:模拟过后只需点 Save Simulation Result,即可保存结果。结果包括初始位置initPos、内部点索引intPntIdx、表面点索引surfPntIdx、每一帧偏移量q、速度v、加速度a、参数值param下一步实现模型的静态解算,就是给出一组表面点的运动序列,算出平衡位置下内部点的运动序列。做一个切换开关,就是把参数连接到初... 阅读全文
posted @ 2015-01-25 23:40 dydx 阅读(168) 评论(0) 推荐(0)
摘要:MQtUtilstaticMStringtoMString(const QString &qstr)Convenience utility to convert a QString to anMString.static QStringtoQString(constMString&mstr)Convenience utility to convert anMStringt... 阅读全文
posted @ 2015-01-25 10:46 dydx 阅读(309) 评论(0) 推荐(0)