zoukankan      html  css  js  c++  java
  • Position Correction

        在模拟中由于timestep的关系,实际上是假定了一个系统的Jacobian矩阵在该时间步长timestep中是个常量,由此而得到的是一个关于约束的线性系统,也就是认为在(t,t+detat)时间段内该矩阵处处相等,但是实际上并非如此,该矩阵实际在这个时间段中一直是变化的,所以其实这是一个非线形的系统,应次timestep越大,导致使用线形系统描述非线性系统的误差越大,有时候就会出现比如铰链断裂的情况,解决该问题的方法有:
     1:Baumgarte 这种放法在每一次构造Jacobian矩阵的时候将约束误差作为反馈参数,这种方法在自己的系统里已经采用
    但是这种方法由于是采用检查后反馈的方式,应此断裂现象不可避免,虽然通过后面的反馈这种断裂在模拟若干步后可以被fix但是从视觉上来说怎又那么一小个时间段Joint是断裂的。
    所以正确的方法是:Solve完整个系统的速度和位置以后,立即对约束进行校正。也就是说约束校正不再作为反馈,而是一个额外的步骤插入。
    常用的方法有:
    Pseudo Velocities
    Modified Nonlinear Gauss-Seidel
    Full NGS
    可以参考http://www.gphysics.com/archives/35
    我准备实现Pseudo Velocities 和  NGS
    NGS 从原理上来说是通过一个外部的Newton循环加上一个内部的高斯-赛德尔迭代组成,将这2个合并为一个就是
    while(iterator < max)
    {
        for(every constraint)
       {
          重新计算约束的雅可比(根据该约束所对应的2个物体的最新位置,转向,转动惯量)
          重新计算约束错误(根据该约束所对应的2个物体的最新位置,转向)
          Solve该约束后得到对应的lambda
          根据该lambda跟新2个物体的位置和转向,当然还有转动惯量
       }
    }
    Pseudo Velocities
    这个没什么好讲的,和普通的高斯-赛德尔迭代一样,整个jacobian矩阵在整个过程中保持
    不变
    http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=4&t=3583
  • 相关阅读:
    BZOJ4416 SHOI2013阶乘字符串(状压dp)
    雅礼集训 Day2 T3 联盟 解题报告
    雅礼集训 Day1 T2 折射
    雅礼集训 Day1 T1 养花
    P1494 [国家集训队]小Z的袜子/莫队学习笔记(误
    洛谷 P2155 [SDOI2008]沙拉公主的困惑 解题报告
    动态MST
    洛谷 P2606 [ZJOI2010]排列计数 解题报告
    牛客 2018NOIP 模你赛2 T2 分糖果 解题报告
    洛谷 P3396 哈希冲突 解题报告
  • 原文地址:https://www.cnblogs.com/fishboy82/p/1556074.html
Copyright © 2011-2022 走看看