还是关于球的碰撞力学 两个球,相同体积(直径50米)、质量、速度、性质(刚性),忽略其他引力、磨擦力,碰撞后的运动方向。好像碰向有很多种形式吧?好像是正面碰撞,V型碰撞,T型碰撞等等,请给出一个算法给我看看,谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 球体碰撞不需要考虑那么多的,只要计算它们的球心距离是否小于半径之和即可,下面是关于球体碰撞的代码,会计算是否碰撞、碰撞点、碰撞法线、穿透深度。{ 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' 碰撞结束后记得把新的速度和垂直于球心连线方向的速度合并 先找数学模型,在IEEE 或 ACM 上面会有吧 1、动量守恒推论:质量相等的两个球正碰,彼此交换速度;2、平面笛卡尔坐标,任意方向运动的速度矢量都可以分解到x、y轴向的两个速度分量Vx、Vy;3、根据以上原理,任意两球碰撞都可以分解为X轴正碰(无论相向还是追击)、Y轴正碰;4、交换两球的Vx、Vy以后,再合并向量即可;设计算法的时候,用结构体或对象(Vx,Vy) 表示球体的速度矢量,按照上面的方法计算。 1.在碰撞方向,等质量的两个球,速度分量交换;2.垂直于碰撞方向,速度分量各自保持不变;假设在笛卡尔直角坐标系中,在x方向发生碰撞:碰撞前:(Vx1,Vy1) 。。(Vx2,Vy2)碰撞后:(Vx2,Vy1) 。。(Vx1,Vy2)注解:碰撞方向是垂直于瞬间接触球面切线方向。 你物理学的真够次的。当然守恒了。只不过这里的冲量,是矢量,速度也是矢量。位置等因数都是三维立体坐标系(x,y,z)。从矢量的角度来做。我都给你写的那么清晰了。冲量和守恒,两球在球心连线方向上的冲量分量投影发生了一个无损失交换。通过能量、冲量守恒方程,能够求出冲量变化量来,分别除以两个球的质量,就求出了速度变化量(也是两个矢量),不就出来了吗。 看下那个DELPHI算法这本书,然后再参考下其他语言的算法,再用DELPHI写代码 关于界面的问题 delphi如何应用动态sql? 怎么才可以使用 IPX 协议??? 菜鸟问题 在dephi中动态创建存储过程问题(在线等待!) 想做一个单项选择考试系统!那位高手可以指导或提供源代码 怎样过滤时间,急啊!!!!!!!!!!!! 在打开EXCEL文档时,怎么样能实现弹出一个提示窗口 告诉各位一个很有意思的事!关于delphi使用内存的!(很有用哟!) 关于类型文件,请进来灌水! 帮帮忙 delphi2010不是说今天发布?哪个给个消息
{ 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' 碰撞结束后记得把新的速度和垂直于球心连线方向的速度合并
2、平面笛卡尔坐标,任意方向运动的速度矢量都可以分解到x、y轴向的两个速度分量Vx、Vy;
3、根据以上原理,任意两球碰撞都可以分解为X轴正碰(无论相向还是追击)、Y轴正碰;
4、交换两球的Vx、Vy以后,再合并向量即可;设计算法的时候,用结构体或对象(Vx,Vy) 表示球体的速度矢量,按照上面的方法计算。
2.垂直于碰撞方向,速度分量各自保持不变;假设在笛卡尔直角坐标系中,在x方向发生碰撞:
碰撞前:
(Vx1,Vy1) 。。(Vx2,Vy2)
碰撞后:
(Vx2,Vy1) 。。(Vx1,Vy2)注解:碰撞方向是垂直于瞬间接触球面切线方向。