Box2D-Lite源码阅读笔记(10)

本文深入探讨了物理引擎中的Step函数,主要涉及动量和位移的计算。首先进行碰撞检测,然后根据时间步长和受力情况更新物体的速度和角速度。接着,通过迭代计算碰撞瞬间的冲量,模拟形变过程中的速度变化。最后,依据速度和角速度更新物体的位置和姿态,完成一帧的物理模拟。
摘要由CSDN通过智能技术生成
  • 简介
    这次我来探究一下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];
		//质量无穷大作为固定的物体,没有运动特性
		if (b->invMass == 0.0f)
			continue;
		//根据时间和受力情况更新速度和角速度
		b->velocity += dt * (gravity + b->invMass * b->force);
		b->angularVelocity += dt * b->invI * b->torque;
	}

	//这里是计算了碰撞时刻的分离轴方向的和其垂直方向的的冲量公式的
	//分母部分
	for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb)
	{
		arb->second.PreStep(inv_dt);
	}
	for (int i = 0; i < (int)joints.size(); ++i)
	{
		//暂时不看
		joints[i]->PreStep(inv_dt);	
	}
	// Perform iterations
	//对每个顶点都有一定次数的迭代,可能模拟的是
	//两个物体碰撞时刻发生的形变过程中,速度变化但是位置不变的过程
	//现实中两个物体产生碰撞的时候不会立刻分开,而会有一个冲量和速度
	//变化的过程,如果没有迭代次数的时候,就是碰撞就立刻分开,没有任何形变
	//以及速度变化过程
	for (int i = 0; i < iterations; ++i)
	{
		for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb)
		{
			arb->second.ApplyImpulse();
		}
		for (int j = 0; j < (int)joints.size(); ++j)
		{
			//暂时不看
			joints[j]->ApplyImpulse();
		}
	}
	//这里是根据速度和角速度来更新物体的姿态和位置
	for (int i = 0; i < (int)bodies.size(); ++i)
	{
		Body* b = bodies[i];
		b->position += dt * b->velocity;
		b->rotation += dt * b->angularVelocity;
		b->force.Set(0.0f, 0.0f);
		b->torque = 0.0f;
	}
}

详细的物理部分计算后面会阅读讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值