
Box2D-Lite源码阅读
ARTELE
爱好计算机
展开
-
Box2D-Lite源码阅读笔记(12)
简介这次讲解动理学的最后一部分,动量计算后更新速度。正文下面这段代码,主要流程就是分别计算分离轴方向的动量和垂直分离轴方向的动量。void Arbiter::ApplyImpulse(){ Body* b1 = body1; Body* b2 = body2; for (int i = 0; i < numContacts; ++i) { Contact* c = contacts + i; c->r1 = c->position - b1->posi.原创 2020-11-24 22:43:28 · 642 阅读 · 1 评论 -
Box2D-Lite源码阅读笔记(11)
简介这次我来看详细的运动处理函数。计算准备工作看下面的这个函数里的实现。void World::Step(float dt){ ... for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb) { arb->second.PreStep(inv_dt); } ...}代码如下,注释和后面都会有说明void Arbiter::PreStep(float inv_dt){ //补偿系数参数.原创 2020-11-24 22:26:56 · 597 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(10)
简介这次我来探究一下step剩下的部分。动量计算,位移计算void World::Step(float dt){ float inv_dt = dt > 0.0f ? 1.0f / dt : 0.0f; //碰撞检测并获取碰撞信息 BroadPhase(); // Integrate forces. for (int i = 0; i < (int)bodies.size(); ++i) { Body* b = bodies[i]; //质量无穷大作为固定的物体.原创 2020-11-24 17:46:28 · 493 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(9)
简介到这里就是碰撞检测的最后一个阶段,在前面已经获取了粗略位置点的时候,这里要获取精确的碰撞点。碰撞点筛选目前位置,待定的碰撞点已经处于A的宽度范围内了,但是是否与A碰撞,或者是否在A内还需要判断。int numContacts = 0; for (int i = 0; i < 2; ++i) { //计算出相交深度 float separation = Dot(frontNormal, clipPoints2[i].v) - front; //深度小于等于0的点说明点相交.原创 2020-11-24 09:27:50 · 515 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(8)
简介上一篇完成了碰撞点的初步获取,这回阅读的是碰撞点的第二步获取。碰撞点截取因为有一定可能使得取得的B上的碰撞点在A的宽度范围之外,这样一来,范围之外的点属于没有意义的点,所以需要根据A的宽度将点截断在A的宽度范围内。代码/*参数列表:vOut[2]输出结果,vIn[2]输入的碰撞点候选点,normal侧方向上的向量(假设以矩形A坐标系为主)offset侧方向上的坐标值。这假设前面是以A坐标系为主,vIn[2]是获取自矩形B上的顶点且已经转换到世界坐标*/int ClipSegment.原创 2020-11-24 08:56:58 · 590 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(7)
简介上一篇阅读了碰撞点计算框架和碰撞深度获取的代码,这次阅读碰撞点计算的具体步骤之一,计算候选点。选择候选点候选点说明现在计算的并不是具体的碰撞点,而是一些可能的碰撞点,或者与碰撞点相关的点,或者是需要加工一个才能成为碰撞点。/*参数列表:返回结果(预测相交点),另一个矩形的半径大小,另一个矩形的位置 另一个矩形的旋转矩阵,调用这个函数的矩形的正面方向*/static void ComputeIncidentEdge(ClipVertex c[2], const Vec2& h, .原创 2020-11-23 15:27:32 · 535 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(6)
0.简介上一篇介绍了碰撞检测部分,这次阅读后面的碰撞点计算和最小碰撞深度计算的代码。1.获取碰撞点和碰撞深度碰撞后要计算出碰撞点,因为在计算运动方向,转动惯量等数据的时候需要碰撞点信息,碰撞深度是为了分离两个物体用的信息,因为物体碰撞时刻,不能正好点边接触,两个物体可能会有一些交叉,这个交叉导致碰撞点会落在形状内部,而不是边界,并且两个物体分离,运动状态信息也需要这个交叉深度来进行各种视觉效果上的平衡。 // Find best axis Axis axis;//选定的轴 float原创 2020-11-23 13:38:06 · 621 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(5)
0.简介前一篇对碰撞检测的准备工作做了阅读,这回我们看第一步,分离轴定理检测矩形是否相交。1.分离轴定理这里面简单对分离轴定理做一个说明,这个里面有详细说明分离轴定理详细说明大概就是比如两个凸多边形,这两个多边形分别向每条边的垂直方向做投影,如果有一个方向上的投影不相交,则两个多边形不相交,反之则相交。具体就看上面的链接吧。2.代码阅读int Collide(Contact* contacts, Body* bodyA, Body* bodyB){ ...原创 2020-11-22 20:39:26 · 963 阅读 · 4 评论 -
Box2D-Lite源码阅读笔记(0)
0.简介一直对物理引擎比较感兴趣,始终想找一些比较好的教程来学一学,但是资料太少,所以通过阅读源码来学习吧,我将我阅读Box2D-Lite的笔记和新的会记录在这里,是Box2D-Lite,不是Box2D,从简单的读起。1.记录流程记录过程也没什么顺序可以确定,我就是根据我调试代码的顺序来进行阅读,调到哪里就看到哪里。box2d-lite源码相关文档阅读源码的时候,必要时刻可以看看相关文档。...原创 2020-11-20 10:54:43 · 574 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(4)
0.简介前面我们发现了物体碰撞检测的函数,这回我将来读物体碰撞检测函数的代码。1.碰撞检测这个碰撞检测主要是针对矩形与矩形的碰撞检测,以为例子中只给了矩形的物理碰撞。这里先对开始部分做一个阅读和注释。这段代码是一些准备工作,主要目的是获取物体在空间中的姿态和基本位置信息。int Collide(Contact* contacts, Body* bodyA, Body* bodyB){ // Setup //取A B两个物体的半径,width中存储的是边长 //这里获取到的是一半原创 2020-11-21 14:23:16 · 713 阅读 · 1 评论 -
Box2D-Lite源码阅读笔记(3)
0.简介这次来看step函数。1.step开始step函数里看起来如下的样子,当然我们只关注一块。void World::Step(float dt){ float inv_dt = dt > 0.0f ? 1.0f / dt : 0.0f; // 碰撞检测 BroadPhase(); ...}BroadPhase函数是碰撞碰撞检测函数。具体讲解在代码注释void World::BroadPhase(){ //这是一个O(n^2)的循环 for原创 2020-11-21 13:52:27 · 785 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(2)
0.初始化函数static void InitDemo(int index){ world.Clear(); numBodies = 0; numJoints = 0; bomb = NULL; demoIndex = index; demos[index](bodies, joints);}在这个初始化函数中,一般会默认执行index=0的函数,这个函数就是一个示例,因为示例比较简单,所以也便于研究,示例效果如下。就是一个方块。进入第一个示例函数。(忽略我加的注释)原创 2020-11-20 22:16:19 · 799 阅读 · 0 评论 -
Box2D-Lite源码阅读笔记(1)
0.简介先从工程配置开始。1.环境配置下载好源码后,我在源码包里发现了build.bat,我的电脑里有VS2019,于是我运行了一下,生成了一个VS工程,之后看代码就用VS来看了,打开工程后,直接就编译ALL_BUILD那个项目,编译好后,我们选择sample这个项目 ,之后的源码阅读都从这里开始。2.起点找到了main函数,大概在下面这个位置,我们开始进入源码探究。int main(int, char**){ ... InitDemo(0); ... world.原创 2020-11-20 21:55:58 · 796 阅读 · 0 评论