• (转)Bullet 3D 物理引擎 简析(2)


    原创帖子, 转载请注明出处,作者信息. 
    这个是自己分析bullet的代码过程中的笔记,比较简陋, 希望抛砖引玉, 欢迎板砖

    作者: 马良 (http://www.iphonephysics.com/ ) (此blog需Over GW)

    //应朋友要求在最后附上书目

    理论准备:本科的数学分析,理论力学,线性代数。 尤其是理论力学中的朗格朗日动力学部分
      最好能回忆起来。 碰撞检测上面列的两本书的内容就足够了,如果进一步挖掘需要看
      计算几何方面的书
    补一个架构图 引自[1]的12页,其中的STC即为上次分析中的islandmanager  
    碰撞响应的分析
      约束分类:可积约束,不可积约束 ,摩擦力(见[1]第四章)
    整个bullet在动力学方面的核心就是btSequentialImpulseConstraintSolver 这个类及其实现
    这个类名字可以翻译为基于顺序冲量处理方法的约束求解过程(这是个缩略的函数名不可直译)。
    这个名字的含义很重要,表示了这个求解方法是按照顺序来处理约束以及接触点,摩擦力,one by one
    并且求解的结果是冲量的范数。整个的原理部分可以参照[1]的第4章节,[2]的第7章。 
    btSequentialImpulseConstraintSolver 的全部重心在于solveGroupCacheFriendlySetup
    负责对于三种约束进行计算准备(包括计算一些解方程要用到的常量以及中间变量等)和 solveGroupCacheFriendlyIterations 负责应用PGS[9]求解。
    solveGroupCacheFriendlySetup 分析
    首先是关于可积约束的计算准备:首先是遍历约束数组,每一个约束都需要计算自己的jacbian(关键概念参照[1]的第四章)
    初始化一些常量和中间变量 这里有些概念和公式比如惯性张量等都可以在[1],[8]中找到
    关于接触点约束的计算准备:这里有个重要的函数convertContact, 把从碰撞检测阶段获得的接触点转化为不可积约束并初始化常量和中间变量,
    以及初始化摩擦力的相关数据,摩擦力计算参照[1]第4章第6节 其中引用的公式也来自[1] 但是考虑到实时性,并不完全一致。
    solveGroupCacheFriendlyIterations 分析
      分别根据[9]中的PGS算法求解3类约束,重点是基于SIMD的优化,以及递归次数10的设置。
      对于PGS的理解最好从Gauss-Sidel数值解法入手。
      对于各类约束类型对应的jacbian 参照[1]第四章节71页
    核心的数据结构
        btSolverConstraint  存储每个约束的计算常量中间变量
        btSolverBody        几何刚体对象和动力学求解对象的连接体
    其它
        整个过程中涉及到了穿透矫正[1]111页,时间递进[1]90页,bullet 没有采用多接触点同时求解的方法,会带来一些误差
     
    [1]的第4章是整个动力学模拟的灵魂,理解了这章,整个求解过程都容易理解

    下一步计划写softbody的分析

    参考书目
    [1]Stable, Robust, and Versatile Multibody Dynamics Animation
    Kenny Erleben
    关于多刚体-动力学模拟必读的文章 bullet很多实现都参考了此文
    很好的一篇综述论文,实际上是下面这本书的草稿
    网上可以下到免费的pdf版本

    [2]physics based animation 
    Kenny Erleben
    同作者的一本全面且用较为严格的数学语言描述物理模拟的经典好书
    涵盖刚体,流体,非刚体
    国内尚未引进,目前暂无电子版。 适合深度挖掘者使用。

    [3]Game Physics, David H. Eberly
    从游戏开发角度来阐释物理模拟,比较实用,内容稍显陈旧。 有电子版,不好找

    [4]Physics.Engine.Development
    同样是阐述物理模拟,不过是为入门读者准备,比较浅显易懂。 有电子版

    [5]Collision Detection in Interactive 3D Environments
    对照作者自己实现的solid碰撞检测引擎来讲述,很好的一本书。又电子版

    [6]Real-Time Collision Detection
    比较全面的阐述了碰撞检测,是一个初步入门的好书, 有电子版
    [7]Computational Geometry in C
    如果想在几何结构方面进一步挖掘,这本书不错,清华翻译的二版有卖,翻译的也好
    三版已出,似乎还没引进

    [8]Classical Mechanics. Prentice Hall, 3rd edition, January 2002.
    理论力学,很多东西忘记了可以查看这本书 有电子版

    [9]Iterative Dynamics with Temporal Coherence
    一篇在GDC2005?上的ppt,简短描述有关PGS算法的问题,是Box2D的作者


    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/superwiles/archive/2009/11/20/4839074.aspx

  • 相关阅读:
    C++为什么不可以把一个数组直接赋值给另一个数组
    Eigen 矩阵库学习笔记
    HTTP请求报文和HTTP响应报文
    剔除三个(包括三个以上)的子串
    c语言实现:4和7幸运数字的题
    oracle顺序控制语句goto、null和分页过程中输入输出存储、java程序的调用过程
    oracle的控制语句if和循环语句loop while for
    oracle函数、包、变量的定义和使用、重点”结构体和数组”
    oracle pl/sql简介、块、过程
    oracle角色
  • 原文地址:https://www.cnblogs.com/lancidie/p/1833905.html
Copyright © 2020-2023  润新知