解读Box2D (1)核心入口 void b2World::Step
最近在转型做游戏,那么阅读Box2D当然是件必要且愉快的事情。
Box2D的源码地址https://github.com/erincatto/Box2D
Box2D的官网 http://www.box2d.org
Paladin的Box2D克隆地址 https://github.com/PaladinDu/Box2D.git
这个克隆目前并没有新增内容,只是增加了一些中文注释。
在后续的学习过程中可能会添加一些demo到Testbed中。
选择从void b2World::Step说起是因为Step是Box2D对一个逻辑针的实现。
我想这应该是一个物理引擎核心的代码了。
了解了Step,你就了解了物理引擎的逻辑结构。
当然Box2D之所以这么优秀,与其背后高超的结构设计,碰撞算法,逻辑优化同样密不可分。
不过本文旨在在流程上了解Box2D。
将只会对Step进行一定的展开。
首先让我们看下step的声明
/**@brief 处理一个逻辑帧*@param dt 逻辑帧的时间长度*@param velocityIterations 速度计算迭代次数,*@note 将一个逻辑帧内的速度计算迭代velocityIterations次,迭代的次数越多,碰撞传导的速度越快*@param positionIterations 位移计算迭代次数*@note 迭代的次数越多,解决刚体重叠的速度越快*/void b2World::Step(float32 dt,int32 velocityIterations,int32 positionIterations);
b2World::Step 的流程:
1 如果有新的刚体(Fixture)就执行一次基础碰撞检测。
这里有两点需要说明:
1.1 Box2D创建了一个AABB碰撞树,来对物体的碰撞进行基础检测。
1.1.1 先说AABB是什么鬼。
AABB的描述:
- AABB是一个旋转永远为0的矩形。
- 每一个刚体都会产生一个AABB。
- AABB会将刚体包裹,且比刚体略大(至少是略大)。
1.1.2 再说说AABB碰撞树是什么鬼
- AABB碰撞树是二叉平衡树。
- 每一个叶子节点都是一个刚体的AABB。
- 非叶子节点也是一个AABB,但并不是刚体的AABB。
- 父节点的AABB总是包涵子节点的AABB。
- 新的叶子节点插入是第一优先级是保持树的平衡。
- 第二是插入到而两个子节点中(由于两个节点并没有排序,所以请允许我使用第二个来形容它的位置)。
- 详细的树处理操作在b2DynamicTree.cpp中。
1.2.3 使用AABB碰撞树进行初步检测
1.2 并不是说没有新的刚体产生就不进行碰撞处理
2 进行准确碰撞检测,并对真实碰撞的碰撞元素进行碰撞初始化
void b2Collide??(b2Manifold* manifold,constb2CircleShape* circleA,constb2Transform& xfA,constb2CircleShape* circleB,constb2Transform& xfB)
中。当??为一个刚体类型是,是同类型刚体碰撞否则将形如b2Collide{typeA}And{typeB}。
不同类型的碰撞是有向的不会出现b2CollideTypeAAndTypeB与b2CollideTypeBAndTypeA两种碰撞。
碰撞初始化的内容主要是记录碰撞体的发力点(point),以方便后续物理模拟计算。比如说圆与圆碰撞时point并不是交点二十圆心。
碰撞完毕后还会更具条件触发开始碰撞或者结束碰撞。
值得注意的是,如果一个刚体被标记为传感器(sensor)的话,他是不会触发碰撞初始化处理的。需要注意的是,他只会出发开始碰撞和结束碰撞,并不会持续发送碰撞信号。如果一个刚体没有被标记为传感器,在发送碰撞时她还会回调
virtual void PreSolve(b2Contact* contact,constb2Manifold* oldManifold)
这个方法本意是允许用户进行自定义个物理模拟。当然了,你也可以拿来作别的事情。
2.1. 传感器是什么鬼
3 在需要的时候进行物理模拟
3.1 island是什么鬼
island的定义:
- island 由刚体,碰撞元素,连接器(joint)组成。
- island 与island 之间互不影响(这是island存在的理由,也使得Box2D对island可以生成一个处理一个)。
大量的刚体,碰撞事件和连接器被分为多个island后可以有效的降低物理模拟是消耗的计算资源。原因是碰撞的算法复杂度为O(n2)。这也是为什么一个复杂机器我们会将其分为几个小的模块进行模拟,而不是使用单个动力驱动并将其组为一个整体。
3.2 连接器又是什么鬼
- 将绳子分割为无数个(很多,比如1个单位分割为10000份,这里有夸张的成分)小线段。
- 相邻的两个小线段受到大小相同方向相反的拉力(绳子是没有压力的,当然在滑轮中不需要考虑这一点)。
- 将滑轮设定为一个可以旋转,永远进行静摩擦,且旋转阻力为0的圆。
- 对其进行物理模拟。绳子一端的开始线段受到一个拉力,并不断的通过下一线段进行传导力,滑轮可以有效的改变力的方向。
- 力的发力方向为 发力点与圆的切点 指向 发力点 的方向。
- 力的受力方向为 受力点 指向 受力点与圆的切点 的方向。
- 发力与受力大小相同。
综上所诉,使用模拟的方式表现某些物理结构会更高效且真实。然后Box2D将这些模拟进行了一些整合,也就成了现在的连接器了。
3.3 物理碰撞模拟的流程
4 在需要的时候进行连续物理模拟
4.1 为什么要进行连续物理模拟
4.2. 连续碰撞物理模拟的对象
4.3 连续碰撞物理模拟的流程
解读Box2D (1)核心入口 void b2World::Step相关推荐
- DDIM代码详细解读(3):核心采样代码、超分辨率重建
Diffusion models代码解读:入门与实战 前言:之前写过三篇详细解读DDPM代码的博客,随着时间已经来到2022年10月,单纯使用DDPM已经逐渐被淘汰,最新的论文更多使用DDPM的改进版 ...
- MeanTeacher文章解读+算法流程+核心代码详解
MeanTeacher 本博客仅做算法流程疏导,具体细节请参见原文 原文 原文链接点这里 Github 代码 Github代码点这里 解读 论文解读点这里 算法流程 代码详解 train_transf ...
- FixMatch文章解读+算法流程+核心代码详解
FixMatch 本博客仅做算法流程疏导,具体细节请参见原文 原文 查看原文点这里 Github代码 Github代码点这里 解读 FixMatch算法抓住了半监督算法的两个重要观点,第一个是一致性正 ...
- 【智能制造】38页超赞PPT解读智能制造核心要素及其标准化!
文丨 欧阳劲松 机械工业仪器仪表综合技术经济研究所所长.教授级高工欧阳劲松先生在首届世界智能制造大会标准化分论坛上的演讲PPT.欧阳劲松先生也是工信部最新成立的智能制造专家咨询委员会委员. BCG波士 ...
- 【观察】解读StarCard新核心系统:全新跨越,生态赋能
申耀的科技观察 读懂科技,赢取未来! <Bank 4.0>一书在2019年席卷全球,此书的副标题是"金融服务无处不在,就是不在银行网点",看似大胆的预测却在今年成为了现 ...
- 2022年的网络工程师就业前景解读三个核心转变方向
许多朋友都在我的后台留言,询问我们作为网络工程的的就业前景或者说未来是什么样子的? 网络工程师是弱电与通讯工业中的一个重要组成部分,一般来说,网络工程师分为售前.实施.售后.运维,当然也有一些以产品开 ...
- 飞桨全新发布,核心框架首次完整公开解读
导读:11 月 5 日,在 Wave Summit+2019 深度学习开发者峰会上,飞桨全新发布和重要升级了最新的 21 项进展,在深度学习开发者社区引起了巨大的反响.很多未到场的开发者觉得遗憾,希望 ...
- Box2D v2.0.1 用户手册
Box2D v2.0.1 用户手册 原文:Box2D v2.0.2 User Manual 译者:Aman JIANG(江超宇),翻译信息. 1. 导言 1.1 关于 Box2D 是一个用于游戏的 2 ...
- Box2D物理引擎的使用方法
转:http://www.toswf.com/blog/blogview.asp?logID=103 众所周知的Box2DFlash是一款不错的物理引擎,如果我们了解了他的使用的技巧,我们也可以做出不 ...
最新文章
- 查看linux系统版本信息 lsb_release -a
- BUGKU 密码题:这不是摩斯密码
- 信息安全系统设计基础第六周学习总结—20135227黄晓妍
- HDU 5936 Difference
- C语言自增自减运算辨析
- timequest静态时序分析学习笔记之命令约束
- svn 迁移到git下全过程
- 北斗芯片是如何决定着北斗产业的未来?
- 开源软件,自由软件,免费软件三者的区别
- 软件测试面试题:一个输入手机号获取验证码的页面,说出测试过程
- 折腾开源WRT的AC无线路由之路-3
- openlayers在线地图:高德地图、天地图、谷歌、geoq(智图)
- python解椭圆方程的例题_椭圆标准方程典型例题及练习题
- 2021最热门的后端编程语言排行榜出炉!
- ELF中的.data段和.bss段
- Placing Lampposts ,UVa 10859 树形dp
- 「5.29 开源市集参与指南」因为相信所以看见
- Web自动化测试(Selenium自动化测试框架)
- npm 安装 node-sass 失败问题分析及解决方案
- 【Jetpack篇】LiveData取代EventBus,flutter安装
热门文章
- 大四web前端网页制作课作业——HTML+CSS+JavaScript仿小米手机商城网站(37页)
- VMware-server-2.0.0-101586注册码备下来
- 图片放大神器: waifu2x
- 程序员成长道路上必经的几个阶段
- 关于ar9331 gpio调试遇到的问题
- 对于语句:f=(3.0,4.0,5.0),(2.0,1.0,0.0);的判断中,( )是正确的。
- MLX90316KGO-BDG-100-RE传感器 旋转位置 角度测量
- Java List<Long>转List<String>
- 手机office使用 手机office不登录 手机office不联网 手机office查询功能
- 微信小程序从注册appid到熟悉静态微信特有标签