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
  • 相关阅读:
    如何查找YUM安装的JAVA_HOME环境变量详解
    Linux下设置和查看环境变量
    jar包部署脚本
    CentOS7开启防火墙及特定端口
    nohup 命令(设置后台进程): appending output to ‘nohup.out’ 问题
    重点|183道Java面试题可以说很详细了
    JVM性能调优
    【Notepad++】notepad++主题和字体设置(非常好看舒服的)
    spring-boot-maven-plugin 安装本地jar 包
    UserAgentUtils 获取浏览器信息
  • 原文地址:https://www.cnblogs.com/fishboy82/p/1556074.html
Copyright © 2011-2022 走看看