решил позаморачиваться со своим физ. движком... наткнулся на хорошую статью:
http://tt.pstu.ru/mnp09/mnp09/s5/bazin.htm
кто может прокомментировать сл код:
procedure Contact_Solve(c1, c2 : PBody; c : PContact);
var
v1, v2, vr, t, j: TVector2;
vrn, jn, jnOld, bounce, e, u, mass_sum,
r1cn, r2cn, vrt, kn, nMass, jtMax, jt, jtOld,
r1ct, r2ct, kt, tMass, jnAcc, jtAcc : TReal;
begin
e := c1^.e*c2^.e; // вычисляем общий коэффициент трения поверхностей
u := c1^.f*c2^.f; // и общий коэффициент эластичности
{расчет общих коэффициентов может быть другой, например, средний арифметический: (c1^.f+c2^.f)/2.0}
jtAcc := 0.0;
jnAcc := 0.0;
v1 := V2Add(c1^.velocity, V2Mul(V2Perp(c^.r1), c1^.w));
v2 := V2Add(c2^.velocity, V2Mul(V2Perp(c^.r2), c2^.w));
vr := V2Sub(v2, v1);
vrn := V2Dot(vr, c^.n);
bounce := V2Dot(c^.n, V2Sub(v2, v1))*e;
mass_sum := 1/c1^.m + 1/c2^.m;
r1cn := V2PerpDot(c^.r1, c^.n);
r2cn := V2PerpDot(c^.r2, c^.n);
kn := mass_sum + r1cn*r1cn/c1^.i + r2cn*r2cn/c2^.i;
nMass := 1.0/kn;
jn := -(bounce + vrn)*nMass;
jnOld := jnAcc;
jnAcc := max(jnOld + jn, 0.0);
jn := jnAcc - jnOld;
t := V2Perp(c^.n);
vrt := V2Dot(vr, t);
t := V2Perp(c^.n);
r1ct := V2PerpDot(c^.r1, t);
r2ct := V2PerpDot(c^.r2, t);
kt := mass_sum + r1ct*r1ct/c1^.i + r2ct*r2ct/c2^.i;
tMass := 1.0/kt;
// трение
jtMax := u*jnAcc;
jt := -vrt*tMass;
jtOld := jtAcc;
jtAcc := min(max(jtOld + jt, -jtMax), jtMax);
jt := jtAcc - jtOld;
j := V2Add(V2Mul(c^.n, jn), V2Mul(t, jt));
// накладываем импульсы
Body_ApplyImpulse(c1,V2Negative(j),c^.r1);
Body_ApplyImpulse(c2,j,c^.r2);
end;