zoukankan      html  css  js  c++  java
  • 看ImplicitBackwardEulerSparse关于static solve的代码

    当选择static solve的时候,求解的流程如下:
    1.获得内力
    2.qresidual = 外力-内力,qdelta = qresidual, qdelta的非约束元素赋给bufferConstrained
    3.用tangentStiffnessMatrix给systemMatrix A赋值
    4.求解A * buffer = bufferConstrained
    5.把buffer指定为qdelta不受约束的部分

    由此可见,实质上是求解 tangentStiffnessMat * dx = 外力 - 内力
    而tangentStiffnessMatrix*dx等于内力增量,于是式子就是 内力 + 内力增量 = 外力
    实际上就是牛顿法求平衡位置

    关于static solve有个问题,就是static solve不考虑点自身的加速度,于是如果不存在约束,一直迭代下去,最终结果一般就是rest pose,这样如何进行动态的物理模拟?
    Efficient Simulation of Secondary Motion in Rig-Space这篇论文,大概是认为惯性力与弹力相比是小到可以忽略不计的,可以认为是把物体的运动无限放慢,直到每个时刻物体加速度都接近0;也可以认为物体的硬度十分大,于是惯性力可以忽略。于是每个运动时刻,物体的内部点位置就与受力平衡时的位置一样。

    进行了这个假定之后,内部点的位置就可以用外部点去表示,于是自然就想到用某种方式去逼近这种表示。上述论文就是用外部点的线性组合去表示。


    为了获得权重,可以有以下两种方法:
    1.由用户指定几组参数配置,得出模型的不同姿态,利用这些姿态完成权重的计算。最后利用算出的权重进行模拟。模拟过程中,内部顶点可能需要有较好的初始化位置,可以考虑用重心坐标这类方法。这种方法可以让用户任意指定姿态。
    2.论文的方法,在rest pose下,给表面点一些初速度,进行模拟。模拟过程中内部点只求平衡位置,而表面点还是要考虑质量和加速度(也就是去掉 H = h^2 / 2 * (as^T * Ms * as + aq^T * Mq * aq) + W 中的 aq^T * Mq * aq 项,这样不需要对原有的模拟算法进行大改,实现比较方便,无需专门初始化

    大概看了调和坐标的论文Harmonic Coordinates for Character Articulation,大概意思是通过给边界点i指定δ函数的边界条件,通过求解拉普拉斯方程来算得这个点对周围区域的影响权重。方法计算量比较大。


    当前要完成的任务有:
    1.实现static solve求内部点的平衡位置。为了获得较好的初始化位置,可以考虑用重心坐标这类方法
    具体可以往rigSimulate加一个shake的flag,功能是求解关键帧动画的内部点位置,并保存。保存成文件?可以保存成rigState,然后允许用户读取、保存rigState,这样就可以自由读取结果而不担心结果冲突。rigState可以用Matlab矩阵的格式,这样就可以容易被matlab插件读取了。
    此时要搞一个切换开关,就是把参数param赋值为initParam的值,而不是赋值为内部的模拟值。用户通过给initParam设置动画控制shaking参数。
    2.用python完成权重的计算
    可以考虑先读取保存好的rigState,运行算法,再把结果保存。算法实现好之后再考虑变成mel命令。
    3.实现消除了内部点自由度的模拟算法
    读取权重算法结果,进行模拟。







  • 相关阅读:
    case when then 根据不同条件 查询不同的数据 相当于 if-else if-else
    完美的拼接sql语句,中间可以加字符等东西,
    C++抽象类
    C #引用NuGet程序包MySQLData问题
    win10磁盘100%占用解决方法
    C# ASP.NetCore 检测到包降级
    VS 命令“npm install”已退出的问题
    序列化和反序列化含义
    数据库MySQL忘记本地密码
    MongoDB授予权限
  • 原文地址:https://www.cnblogs.com/dydx/p/4243844.html
Copyright © 2011-2022 走看看