首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

还是关于球的碰撞力学,该怎么处理

2012-02-05 
还是关于球的碰撞力学两个球,相同体积(直径50米)、质量、速度、性质(刚性),忽略其他引力、磨擦力,碰撞后的运动

还是关于球的碰撞力学
两个球,相同体积(直径50米)、质量、速度、性质(刚性),忽略其他引力、磨擦力,碰撞后的运动方向。
好像碰向有很多种形式吧?好像是正面碰撞,V型碰撞,T型碰撞等等,请给出一个算法给我看看,谢谢。

[解决办法]
球体碰撞不需要考虑那么多的,只要计算它们的球心距离是否小于半径之和即可,下面是关于球体碰撞的代码,会计算是否碰撞、碰撞点、碰撞法线、穿透深度。
{ TSphereSphereContact }

constructor TSphereSphereContact.Create(ASphere1, ASphere2: TSphereShape);
begin
inherited Create;
FSphere1 := ASphere1;
FSphere2 := ASphere2;
end;

function TSphereSphereContact.Generate(ACacheInfo: TObject): Boolean;
var
detail, vertex: TVector3;
sumRadius: Single;
begin
Result := False;
detail := FSphere1.WorldFrame.Position - FSphere2.WorldFrame.Position;
sumRadius := FSphere1.Radius + FSphere2.Radius;
if detail.LengthSq > Sqr(sumRadius) then
Exit;

FPenetration := sumRadius - detail.Length;

FNormal := detail;
FNormal.Normalize;

vertex := FSphere2.WorldFrame.Position + FNormal * (FSphere2.Radius - FPenetration * 0.5);
AddContactPoint(vertex);
Result := True;
end;

[解决办法]
刚性球的意思是说动能守恒,没有外力所以动量守恒

球碰撞的时刻,就是两球球心距离正好等于二倍半径的时刻。此时碰撞发生的方向为两球球心连线的方向上。

把两球的速度都按和球心连线平行及垂直的方向分解,碰撞只发生在平行于球心连线的方向,垂直球心连线的速度在碰撞过程中不变。

好了 现在问题已经简化到高中教科书上的两球碰撞了
假设两球质量分别为 m1 m2,两球速度(实际是平行球心连线方向的分速度)分别为v1 v2,设碰撞后的速度为v1',v2'

解着个方程组 即可

m1 * v1 + m2 * v2 = m1 * v1' + m2 * v2'
0.5 * m1 * v1 * v1 + 0.5 * m2 * v2 * v2 = 0.5 * m1 * v1' * v1' + 0.5 * m2 * v2' * v2' 

碰撞结束后记得把新的速度和垂直于球心连线方向的速度合并
[解决办法]
1、动量守恒推论:质量相等的两个球正碰,彼此交换速度;
2、平面笛卡尔坐标,任意方向运动的速度矢量都可以分解到x、y轴向的两个速度分量Vx、Vy;
3、根据以上原理,任意两球碰撞都可以分解为X轴正碰(无论相向还是追击)、Y轴正碰;
4、交换两球的Vx、Vy以后,再合并向量即可;

设计算法的时候,用结构体或对象(Vx,Vy) 表示球体的速度矢量,按照上面的方法计算。

热点排行