浮力:
浮力使刚体受到一个与重力方向相反的推力,当刚体的密度比浸泡它的液体密度小的时候,就会产生浮力,就像苹果在水里或者氢气球在天空中,浮力的大小取决于被排掉的液体体积 注:高中物理的知识,浮力(F)= 液体密度(p) x 重力加速度(g) x 该物体排开液体的体积(v)。
我们可以计算出排出液体的质量来模拟浮力效果,而这又可以通过液体密度x物体排开液体的体积来计算,所以现在的主要任务是计算出刚体跟液体的重叠部分的体积。
我们可以用一个感应夹具来代表水,然后计算水跟其他夹具的重叠面积,一个完整的执行需要计算两个多边形,两个圆,一个多边形跟一个圆的交叉区域,在这篇文章里面,我们只讨论两个多边形的交叉区域。
一旦两个多边形的重叠区域被找到,我们就可以用这个区域去计算需要的力,并且施加这个力在交叉区域的质心上,而且我们也需要提供一个拉力。
浮力需要在每一个时间步上被计算出来,并且施加到刚体上,我们在BeginContact跟Endcontact这两个函数上跟踪一个链表,这个链表里面的元素是一个交叉夹具组,而且在每一个时间步我们都要遍历这个链表,并且施加必要的力,下面定义一个夹具组来方便后面的操作:
typedef std::pair<b2Fixture*, b2Fixture*> fixturePair;