DBVT 在bullet 引擎中是很基础且重要的一个数据结构,本质上是一个可以动态更新的AABB树。

碰撞响应的分析

约束分类:可积约束,不可积约束 ,摩擦力(见[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]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的作者

Bullet碰撞检测的更多相关文章

  1. bullet物理引擎与OpenGL结合 导入3D模型进行碰撞检测 以及画三角网格的坑

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11681069.html 一.初始化世界以及模型 /// 冲突配置包含内存的默认设置,冲突设置. ...

  2. Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)

    实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...

  3. windows下Bullet 2.82编译安装(Bullet Physics开发环境配置)

    平台:Win7,VS2010 1. Bullet库的组织 下图是Bullet_User_Manual中的截图: 从中可见,Bullet的LinearMath(线性数学模块),其上是BulletColl ...

  4. Bullet的学习资源(用Doxygen生成API文档)

    Bullet 全称 Bullet Physics Library,是著名的开源物理引擎(可用于碰撞检测.刚体模拟.可变形体模拟),这里将bullet的学习资源整理一下,希望能帮助入门者少走弯路. 看下 ...

  5. cocos2dx游戏开发——微信打飞机学习笔记(十)——碰撞检测的搭建

    一.七说八说        大家都发现了= =,做了那么多,发现就是摆设,完全没有打飞机的感觉,没有实现碰撞的监测.比如说呢,子弹和敌机,玩家与敌机就是需要有碰撞检测的说,然后在这篇我想会很长很长的教 ...

  6. cocos2d-x游戏开发系列教程-坦克大战游戏之子弹的碰撞检测处理

    在上篇我们加上了简单的坦克之间的碰撞检测,这篇我们继续加上子弹之间, 子弹与坦克之间的碰撞检测,对于上一篇碰撞处理不太完美的地方我们继续改进. 1.子弹之间的碰撞 //玩家子弹和敌方子弹之间的碰撞 C ...

  7. [Bullet3]三种碰撞检测及实现

    官方文档:http://bulletphysics.org 开源代码:https://github.com/bulletphysics/bullet3/releases API文档:http://bu ...

  8. pygame 笔记-6 碰撞检测

    这一节学习碰撞检测,先看原理图: 2个矩形如果发生碰撞(即:图形有重叠区域),按上图的判断条件就能检测出来,如果是圆形,则稍微变通一下,用半径检测.如果是其它不规则图形,大多数游戏中,并不要求精确检测 ...

  9. Bullet物理引擎的安装与使用

    图形赋予游戏一种视觉的吸引力,但是能够让游戏的世界鲜活起来的还应该是内部的物理引擎.物理引擎是游戏引擎中的子模块,是一种软件组件,可仿真物理系统.它根据牛顿力学定律,计算游戏中物体的合理的物理位置,并 ...

随机推荐

  1. 【noi 2.6_7627】鸡蛋的硬度(DP)

    题意:其中n表示楼的高度,m表示你现在拥有的鸡蛋个数. 解法:f[i][j]表示 i 层楼有 j 个鸡蛋时,至少要扔多少次.3重循环,k为测试的楼层,分这时扔下去的鸡蛋碎和不碎的情况.要注意初始化. ...

  2. Codeforces #624 div3 C

    You want to perform the combo on your opponent in one popular fighting game. The combo is the string ...

  3. 牛客编程巅峰赛S1第5场 - 黄金&钻石&王者 B.牛牛的字符串 (DP)

    题意:有一个字符串\(s\),我们可以选择\(s_{i}\),如果\(s_{i+k}>s_{i}\),那么就可以交换\(s_{i}\)和\(s_{i+k}\),问最多能够交换多少次. 题解:因为 ...

  4. 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query

    目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...

  5. codeforces 1077D Cutting Out 【二分】

    题目:戳这里 题意:给n个数的数组,要求找k个数满足,这k个数在数组中出现的次数最多. 解题思路:k个数每个数出现次数都要最大化,可以想到二分下限,主要是正确的二分不好写. 附ac代码: 1 #inc ...

  6. CodeForces 1047C Enlarge GCD(数论)题解

    题意:n个数的gcd是k,要你删掉最少的数使得删完后的数组的gcd > k 思路:先求出k,然后每个数除以k.然后找出出现次数最多的质因数即可. 代码: #include<cmath> ...

  7. js inheritance all in one

    js inheritance all in one prototype & proto constructor Object.definepropety Object.create() js ...

  8. how to input special keyboard symbol in macOS(⌘⇧⌃⌥)

    how to input special keyboard symbol in macOS(⌘⇧⌃⌥) emoji ctrl + command + space / ⌘⇧⌃ ⌘⇧⌃ Character ...

  9. Online analog video interview

    Online analog video interview 在线模拟视频面试 English 口语 https://www.pramp.com/#/ https://www.pramp.com/faq ...

  10. COOP & COEP

    COOP & COEP Cross-Origin Opener Policy (COOP) and Cross-Origin Embedder Policy (COEP) https://de ...