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
  • 相关阅读:
    商业软件太贵?找开源替代品
    Odoo9发行说明
    Odoo(OpenERP)配置文件openerp-server.conf详解
    MyBatis-Generator最佳实践
    elasticsearch 口水篇(1) 安装、插件
    log4j直接输出日志到flume
    Maven编译时跳过Test
    Flume1.5.0的安装、部署、简单应用(含伪分布式、与hadoop2.2.0、hbase0.96的案例)
    Flume 1.5.0简单部署试用
    一共81个,开源大数据处理工具汇总(下),包括日志收集系统/集群管理/RPC等
  • 原文地址:https://www.cnblogs.com/fishboy82/p/1556074.html
Copyright © 2011-2022 走看看