我在cocos2d-x 3测试中看到了以下代码:
m_world->SetWarmStarting(settings->enableWarmStarting > 0);
m_world->SetContinuousPhysics(settings->enableContinuous > 0);
m_world->SetSubStepping(settings->enableSubStepping > 0);
但在Box2D manual中找不到这些功能的作用。我可以在哪里获得信息?
答案 0 :(得分:0)
m_world-> SetWarmStarting(settings-> enableWarmStarting> 0);
b2World::SetWarmStarting
方法启用或禁用*m_world
实例的热启动状态。 暖启动表示脉冲状态(在每步速度约束点和关节中)被赋予潜在的非零值,这些值是步骤dtRatio
的倍数。当暖启动被禁用时,这些只是设置为零。
要亲眼看到这一点,您可以在Box2D C ++代码中搜索文本warmStarting
,该文本是b2TimeStep
类的字段,该字段是从世界m_warmStarting
字段设置的(从引用的方法设定)。
m_world-> SetContinuousPhysics(settings-> enableContinuous> 0);
b2World:: SetContinuousPhysics
方法启用或禁用连续碰撞检测(CCD)。
如果CCD被禁用,动态物体 - 即使它们被设置为 bullet 物体 - 当它们的组合速度将物体放在上面时,它们将隧道通过任何其他物体在时间步长之后,彼此的相对侧。 隧道意味着物体已经相互穿过,与预期的实体物理特性相反。取决于形状,即使在时间步长时在另一个物体内(甚至穿透另一个物体)也可能导致发生隧道效应。禁用CCD后,碰撞岛仅计算时间步长将使世界进入的时间点。
如果启用了CCD,则 bullet 主体或静态主体的主体将对它们以及它们可能发生碰撞的任何对象执行连续碰撞检测。在这种情况下,确定与这些特殊实体在时间步长内的可能接触(称为 CCD启用的接触)以及计算的影响时间(基本上是当前时间步长的百分比)。这些联系人按照他们的影响时间顺序迭代 - 在最晚的时间之前处理最快的联系人。为适当的接触创建碰撞岛,然后就像禁用CCD一样,这些岛被解决;除了现在这些岛屿在时间步长不是碰撞,而是在每个子时间点的岛屿,确定接触实际上会触及。
您可以在Box2D C ++代码中搜索文本m_continuousPhysics
以查找对SolveTOI
方法的调用,并跟踪该源以了解Box2D CCD处理。不可否认,我花了一段时间阅读并重构此代码以识别我在此解释的内容,但我相信我的解释比SolveTOI
方法中原始的Box2D C ++源代码更准确,更容易理解(本身就是b2World.cpp
文件中的大约318行。或者,您可以查看my fork of Box2D中World::SolveTOI
文件中的Box2D/Dynamics/World.cpp
方法。
m_world-> SetSubStepping(settings-> enableSubStepping> 0);
b2World::SetSubStepping
方法在b2World::Step
方法的连续碰撞检测中启用或禁用子步进。
启用子步进后,b2World::Step
方法将在每个下一个 CCD启用的联系解析后返回,而不是在整个时间步骤内的所有这些都解决之后工作。这为观察者提供了一种方法,可以一次查看一个 CCD启用的联系人的内容。请注意,在特定时间步骤处理每个启用CCD的触点之前,不会再次发生常规触点分辨率。
至少在概念上,禁用子步进应该更具性能。我认为调用b2World::Step
也更直观简单,并期望在每次调用之后,给定的时间步骤实际上会在物理模拟方面实际发生(这不是在启用子步进的情况下。
要了解此方法,您可以搜索文字:m_subStepping
。