Показать сообщение отдельно
Старый 09.03.2013, 15:13   #249
wppt
Нуждающийся
 
Регистрация: 25.11.2012
Сообщений: 83
Написано 2 полезных сообщений
(для 2 пользователей)
Ответ: Вопросы по XNA.

решил позаморачиваться со своим физ. движком... наткнулся на хорошую статью: 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;
(Offline)
 
Ответить с цитированием