1. Введение

Частицы — это объекты, которые имеют массу, положение и скорость, реагируют на действие сил, но не имеют пространственной протяженности. Благодаря своей простоте, частицы являются самым легким объектом для моделирования. Но, несмотря на простоту, из частиц можно создавать системы, демонстрирующие весьма разнообразное поведение. Например, из частиц, соединенных пружинами с демпфированием, можно построить различные нежесткие конструкции. В этой части курса мы рассмотрим основы динамики частиц, делая упор на требованиях, выполнение которых обеспечивает интерактивность моделирования.

2. Фазовое пространство

Движение частицы определяется известным законом Ньютона

$$\textbf{f} = m\textbf{a},$$

или, как мы его будем здесь записывать

$$\ddot{\textbf{x}} = \textbf{f} / m.$$

Это уравнение отличается по форме записи ОДУ от уравнений, описанных в предыдущей главе, так как содержит вторую производную по времени, что делает его уравнением 2-го порядка. Чтобы решить такое уравнение, его нужно преобразовать в систему уравнений 1-го порядка1. Введем новую переменную \(\textbf{v}\), представляющую собой скорость частицы, и преобразуем исходное уравнение к паре связанных ОДУ 1-го порядка

$$\dot{\textbf{v}}=\textbf{f}/m, \quad \dot{\textbf{x}}=\textbf{v}.$$

Положение \(\textbf{x}\) и скорость \(\textbf{v}\) теперь можно объединить в единый 6-мерный вектор. Объединенное 6-мерное пространство, координатами в котором являются компоненты векторов положения и скорости, называют фазовым пространством. Теперь систему уравнений можно объединить в единое уравнение \( [\dot{x}_1, \dot{x}_2, \dot{x}_3, \dot{v}_1, \dot{v}_2, \dot{v}_3] = [v_1, v_2, v_3, f_1 / m , f_2 / m, f_3 / m]\), которое, предполагая что силы является функциями \(\textbf{х}\) и \(t\), соответствует нормальной форме записи \(\dot{\textbf{х}} = f (\textbf{x},t)\), известной из прошлой главы. Система \(n\) частиц описывается \(n\) экземплярами уравнения, которые объединяются в \(6n\)-мерный вектор. Концептуально, вся система может рассматриваться как точка, движущаяся в \(6n\)-пространстве.

Мы по-прежнему будем представлять себе фазовое пространство ОДУ как плоское векторное поле, ограничиваясь одномерным движением частиц. Одна ось фазового пространства представляет положение частицы, другая — ее скорость. Если каждая точка на фазовой плоскости представляет собой пару \((x, v)\), то вектор производной будут равен \((v, f / m)\). Все рассмотренные выше понятия интегральных кривых, полиномиальной аппроксимации, и т. п., переносятся в целости и сохранности в фазовое пространство. Несколько изменится только интерпретация траектории.

3. Система частиц

При программной реализации системы частиц, мы хотим сохранить две точки зрения на нашу модель: «извне», особенно с точки зрения решателя ОДУ, модель должна выглядеть как монолит — точка в пространстве большой размерности, чью производную по времени можно определить в любой момент. «Изнутри», модель должна быть структурирована и представлять собой совокупность различных взаимодействующих объектов. Эта двойственность будет постоянной темой рассмотрения в нашем курсе.

Моделирование частиц включает в себя две основные части — собственно частицы, и сущности, которые прикладывают к частицам силы. В этом разделе мы рассмотрим только частицы, оставляя до следующего раздела особенности расчета сил. Наша цель сейчас заключается в том, чтобы описать структуры, представляющие собой частицу и систему частиц, и показать как можно реализовать общие операции, требуемые для решателя ОДУ.

Частицы имеют массу, положение и скорость, а также подвергаются действию сил, что приводит к очевидному определению структуры. На языке C она может выглядеть так:

typedef struct{
  float m;  /* mass */ 
  float *x; /* position vector */
  float *v; /* velocity vector */
  float *f; /* force accumulator */
} *Particle;

На практике, вероятно, у структуры будет больше полей, описывающих ее внешний вид и другие свойства.

Система частиц представляется не менее очевидным образом, как

typedef struct{
  Particle *p; /* array of pointers to particles */
  int n;       /* number of particles */
  float t;     /* simulation clock */
} *ParticleSystem;

Предположим, что у нас есть функция CalculateForces(), которая, будучи примененной к системе частиц, добавляет соответствующие силы в поле f каждой частицы. Нас пока не заботит то, как эта функция реализована — она есть и ее можно использовать. Тогда операции, из которых состоит интерфейс решателя ОДУ, можно записать следующим образом:

/* get length of state, derivative, and force vectors */
int ParticleDims(ParticleSystem p)
{
  return (6*p->n);
};

/* gather state from the particles into dst */
int ParticleGetState(ParticleSystem p, float *dst)
{
  int i;
  for (i=0; i < p->n; i++) {
    *(dst++) = p->p[i]->x[0];
    *(dst++) = p->p[i]->x[1];
    *(dst++) = p->p[i]->x[2];
    *(dst++) = p->p[i]->v[0];
    *(dst++) = p->p[i]->v[1];
    *(dst++) = p->p[i]->v[2];
  }
}

/* scatter state from src into the particles */
int ParticleSetState(ParticleSystem p, float *src)
{
  int i;
  for (i=0; i < p->n; i++) {
    p->p[i]->x[0] = *(src++);
    p->p[i]->x[1] = *(src++);
    p->p[i]->x[2] = *(src++);
    p->p[i]->v[0] = *(src++);
    p->p[i]->v[1] = *(src++);
    p->p[i]->v[2] = *(src++);
  }
}

/* calculate derivative, place in dst */
int ParticleDerivative(ParticleSystem p, float *dst)
{
  int i;
  Clear_Forces(p);   /* zero the force accumulators */
  Compute_Forces(p); /* magic force function */
  for (i=0; i < p->n; i++) {
    *(dst++) = p->p[i]->v[0];   /* xdot = v */
    *(dst++) = p->p[i]->v[1];
    *(dst++) = p->p[i]->v[2];
    *(dst++) = p->p[i]->f[0]/m; /* vdot = f/m */
    *(dst++) = p->p[i]->f[1]/m;
    *(dst++) = p->p[i]->f[2]/m;
  }
}

Определив эти операции, и предполагая, что вспомогательные функции и временные векторы также реализованы, решатель ОДУ, реализующий метод Эйлера, может быть записан в виде

void EulerStep(ParticleSystem p, float DeltaT)
{
  ParticleDerivative(p,temp1);   /* get deriv */
  ScaleVector(temp1,DeltaT)      /* scale it */
  ParticleGetState(p,temp2);     /* get state */
  AddVectors(temp1,temp2,temp2); /* add -> temp2 */
  ParticleSetState(p,temp2);     /* update state */
  p->t += DeltaT;                /* update time */
}

Структуры, представляющие собой частицу и систему частиц показаны на рис. 1 и 2. Интерфейс между системой частиц и решателем ОДУ иллюстрируется на рис. 3.

fig1.png

Рис. 1. Частица может быть представлена ​​в виде структуры, содержащей данные о положении, скорости, силе, и массе. 6-мерный вектор формируется путем объединения векторов положения и скорости и описывает положение точки в фазовом пространстве.

fig2.png

Рис. 2. Система частиц, по сути, представляет собой просто список частиц.

fig3.png

Рис. 3. Взаимодействие между системой частиц и решателем дифференциального уравнения.

4. Силы

Все частицы, по сути, однотипны. В противоположность этому, объекты, вызывающие действие сил, весьма разнообразны. Для удобства реализации мы хотели бы создать набор объектов-генераторов сил, который можно было бы легко расширять без изменения базовой модели системы частиц.

Этого можно добиться если система частиц будет вести учет (в виде списка) объектов-сил, каждый из которых имеет доступ к любой или ко всем частицам, и «знает» как свою силу приложить. Функция CalculateForces(), использованная выше, просто проходит список объектов-сил, вызывая для каждого из них функцию ApplyForce(), с системой частиц в качестве единственного аргумента. Реальная работа по расчету сил ложиться, таким образом, на плечи индивидуальных объектов-сил. Смотрите рис. 4 и 5.

fig4.png

Рис. 4. Система частиц, дополненная списком объектов-сил. Каждый объект-сила содержит указатели на частицы, на которые он влияет, и функцию, которая «знает», как вычислить силу, действующую на эти частицы.

fig5.png

Рис. 5. Цикл вычисления производной для системы частиц с объектами-силами.

Силы можно разделить на три большие группы.

  • Унарные силы, такие как гравитация и сила сопротивления, которые действуют независимо на каждую частицу, оказывая постоянное действие, либо их действие, зависящее от одного или нескольких положений частицы, скорости частиц и времени.
  • n-арные силы, подобные пружинам, которые действуют на заданное множество частиц.
  • Силы взаимодействия в пространстве, такие как притяжение и отталкивание, которые могут возникать между любой парой частиц и зависят от их взаимного положения.

Каждая из них ставит перед программистом те или иные вопросы реализации. Рассмотрим эти группы сил подробнее.

4.1 Унарные силы

Гравитация. Реализовать силу гравитации, действующую на поверхности Земли, очень просто (в отличие от силы притяжения между двумя частицами). Для каждой частицы эта сила равна \(\textbf{f}=m\textbf{g}\), где \(\textbf{g}\) — постоянный вектор (предположительно направленный вниз), величина которого равна гравитационной постоянной. Если все частицы подвержены действию одинаковой гравитации, то гравитационная сила применяется просто путем обхода списка частиц системы, и добавления соответствующей силы в аккумулятор сил f каждой частицы. Гравитация используется часто, и потому разумнее включить ее в систему частиц, чем поддерживать отдельный объект «сила гравитации».

Вязкое трение. Идеальное вязкое трение описывается как \(\textbf{f} =-k_d\textbf{v}\), где постоянная \(k_d\) называется коэффициентом сопротивления. Действие трения выражается в сопротивлении движению, что заставляет частицы постепенно приходить в состояние покоя при отсутствии других воздействий. Рекомендуется прикладывать хотя бы небольшую силу трения к каждой частице для повышения устойчивости вычислений. Избыточное сопротивление, однако, приводит к тому, что частицы кажутся движущими сквозь патоку. Как и гравитация, сила трения может быть реализован непосредственно в системе частиц. Объект-сила, реализующий вязкое трение представлен на рис. 6.

fig6.png

Рис. 6. Схематическое изображение объекта, представляющего силу вязкого трения. Объект указывает на частицу, к которой прикладывается сила трения, а также на функцию, реализующую закон действия силы трения.

4.2 n-арные силы

Типичным примером таких сил является бинарная (т.е. действующая на две частицы) сила упругости, которая описывается законом Гука. Системы, в которых частицы соединяются пружинами, встречаются на практике очень часто. Сила, действующая между двумя частицами с радиусами-векторами \(\textbf{a}\) и \(\textbf{b}\), определяется как

\begin{equation} \textbf{f}_a = -\left[ k_s (|\textbf{l}|-r) + k_d \frac{\dot{\textbf{l}}\cdot\textbf{l}}{|\textbf{l}|} \right] \frac{\textbf{l}}{|\textbf{l}|}, \quad \textbf{f}_b = -\textbf{f}_a, \label{eq:hook} \end{equation}

где \(\textbf{f}_a\) и \(\textbf{f}_b\) — силы, действующие в \(\textbf{a}\) и \(\textbf{b}\), соответственно, \(\textbf{l}=\textbf{a}-\textbf{b}\), \(r\) — номинальное расстояние между частицами (длина ненапряженной пружины), \(k_s\) — коэффициент жесткости, \(k_d\) — коэффициент демпфирования. \(\dot{\textbf{l}}\) — производная по времени от \(\textbf{l}\), равная разности между скоростями частиц \(\textbf{v}_a-\textbf{v}_b\).

В уравнении \eqref{eq:hook}, сила, с которой действует пружина, пропорциональна разности между фактической длиной пружины и ее длиной в покое, тогда как сила трения пропорциональна скорости сближения частиц. Равные и противоположные силы действуют на каждую частицу вдоль соединяющей их линии. Трение в пружине (демпфирование) отличается от рассмотренного выше «глобального» трения тем, что действует симметрично на обе частицы, не влияя на движение их центра масс. Позже мы узнаем общую процедуру получения выражений для такого рода сил.

Пружина с демпфированием может быть реализована непосредственно, как структура, содержащая указатели на пару соединяемых ею частиц. Код, который применяет силу \eqref{eq:hook}, выбирает положения и скорости из структур каждой из частиц, выполняет расчет, и суммирует результаты в силовых аккумуляторов f частиц. В объектно-ориентированной среде эта операция может быть реализована в виде обобщенной функции. В чистом C, объект-сила будет содержать указатель на обычную функцию C. Объект-сила для пружины с демпфированием показан на рис. 7.

fig7.png

Рис. 7. Схематический вид объекта-силы, реализующего пружину с демпфированием, которая соединяет частицы \(p_1\) и \(p_2\).

4.3 Силы взаимодействия в пространстве

Сила упругости пружины применяется к фиксированной паре частиц. В отличие от этого, силы взаимодействия в пространстве могут действовать между любой парой (или n-кой) частиц. Если силы взаимодействия локальны, то частицы будут взаимодействовать, когда они находятся близко друг к другу, и прекращать взаимодействие при удалении на значительное расстояние. Частицы, между которыми действуют подобные силы, используются в качестве приближенных моделей поведения жидкости. Крупномасштабное моделирование методом частиц широко используется в физике [1]. Сложность крупномасштабного моделирования пространственного взаимодействия частиц связана с тем, что количество вычислений силы представляет собой \(O(N^2)\) от количества частиц \(N\). Если взаимодействия локальны, эффективность может быть улучшена посредством разделения области, в которой помещаются частицы, на ряд подобластей.

5. Взаимодействие с пользователем

Интерактивное моделирование системы материальных точек, соединенных пружинами — идеально подходит для пробы сил в физическом моделировании, поскольку такие модели относительно легко реализовать, а производительность, позволяющая интерактивную работу с ними, может быть достигнута даже на слабых компьютерах. Основными составляющими моделирования системы частиц, связанных пружинами, являются подсистемы построения модели и манипулирования объектами. Построение модели может выполняться при помощи мыши, щелчки которой создают частицы и соединяют их с пружинами. Интерактивная манипуляции с объектами требует реализации перетаскивания частиц. Математически, разница между двумерными и трехмерными моделями невелика, однако поддержка взаимодействия с пользователем в трехмерном пространстве значительно сложнее.

Большинство вопросов реализации достаточно стандартны и мы не будем здесь их рассматривать. Дадим, тем не менее, несколько полезных советов:

  • Управляемые частицы. Частицы, на движение которых не влияют силы, позволяют реализовать ряд интересных возможностей. Так, если зафиксировать положение частицы, ее можно будет использовать в качестве якоря или шарнирной точки. Частица, движущаяся по определенному закону (например, по кругу) позволяет создавать динамические элементы, такие как двигатели. Все, что нужно сделать для реализации управляемых частиц — это запретить решателю ОДУ обновлять их координаты. Тонкость состоит в том, что скорости управляемых частиц должны обновляться. Иначе, силы, зависящие от скорости, такие как пружины с демпфированием, будет вести себя некорректно.
  • Конструкции. Из точечных масс и пружин строится широкий спектр интересных нежестких конструкций - балок, блоков и т. п. Можно допустить, чтобы несколько пружин действовало на одну частицу, и соединять затем полученные фрагменты при помощью различных шарниров. Эксперимент и некоторая изобретательность позволяют построить целые механизмы, снабженные двигателями, состоящие из одних только масс и пружин. Тема использования регулярных структур «масса-частица» для приближенного моделирования поведения непрерывной среды будет обсуждаться позже [2].
  • Мышь на пружине. Самый простой способ манипулировать системами, состоящими из масс и пружин, заключается в непосредственном управления положением частиц при помощи мыши. Тем не менее, применять этот метод не рекомендуется, потому что очень быстрые движения мыши может привести к проблемам с устойчивостью. Этих проблем можно избежать, связывая положение схваченной частицы с положением указателя мыши при помощью пружины.

6. Энергетические функции

Формулы, зависящие от положения, скорости и времени, которые используются для вычисления сил, называют законами действия сил. Силы действия сил не обязательно являются законами физики — они, скорее, часть описания моделируемой нами системы. Некоторые из них стали стандартными, как закон деформации пружин (закон Гука), и представляют собой освященные веками идеализации поведения реальных материалов и конструкций. Тем не менее, если бы мы захотели точно смоделировать поведение пары частиц, склеенных жвачкой, то полученные уравнения, были бы, вероятно, весьма запутанными.

Часто можно рассматривать законы действия сил как законы, которые мы разрабатываем, чтобы сохранить требуемую конфигурацию объектов. Например, пружина с ненулевой длиной в непряженном состоянии, «старается» удерживать связываемые ею точки на заданном расстоянии друг от друга. Во многих случаях можно указать желаемую конфигурацию, задав функцию, которая равняется нуля, когда объекты расположены так, как нужно. Мы можем назвать этот вид функций функциями поведения (behavior function). Например, функция поведения, которая гласит, что две частицы \(a\) и \(b\) должны находится в одном и том же месте, имеет вид: \(C(\textbf{a},\textbf{b})=\textbf{a}-\textbf{b}\) (что является векторным выражением, в котором должна обнуляться каждая компонента). Если бы вместо этого мы захотели, чтобы \(a\) и \(b\) находились на расстоянии \(r\) друг от друга, то соответствующая функция поведения выглядела бы так: \(C(a,b)=|a-b| - r\) (что является скалярным выражением).

Позже, когда мы изучим динамику систем со связями, мы будем использовать этот вид функций как способ задания связей, и будем подробно рассматривать проблему сохранения таких связей. Сейчас, мы будем довольствоваться использованием их в качестве сил, которые приводят систему к желаемому состоянию. Эти силы могут использоваться, чтобы ввести приблизительные, «грубые» связи. Однако попытки сделать их точными за счет увеличения жесткости пружин приводят к численной неустойчивости [3].

Рецепт преобразования функции поведения \(\textbf{C}(\textbf{x}_1,\ldots \textbf{x}_n)\) в закон действия силы прост. Сначала мы определим скалярную функцию потенциальной энергии

$$ E = \frac{k_s}{2}\textbf{C}\cdot\textbf{C}, $$

где \(k_s\) является обобщенной постоянной жесткости. Поскольку действующая сила равна градиенту потенциала, взятому с противоположным знаком, то сила, действующая на частицу \(\textbf{x}_i\) запишется в виде

$$ \textbf{f}_i = -\frac{\partial E}{\partial \textbf{x}_i} =-k_s\textbf{C}\frac{\partial \textbf{C}}{\partial \textbf{x}_i}. $$

В общем случае \(\textbf{C}\) является вектором, и полученное выражение есть произведение этого вектора с транспонированной матрицей Якоби \(\partial \textbf{C} / \partial \textbf{x}_i\) (якобианом). Мы рассмотрим его подробно, когда будем изучать динамику систем со связями, и, в частности, множители Лагранжа. Сейчас достаточно представлять себе силы \(\textbf{f}_i\) как обобщенные силы упругости (обобщенные пружины), которые «притягивают» систему к состоянию \(\textbf{C}=0\). Если функция поведения зависит от положений нескольких частиц, то мы получим разные выражения для сил, в зависимости от того, по какой частице берется производная от \(C\).

Сила, которую мы только что определили, еще не совсем та, что нам нужна: в отсутствии демпфирования, эта консервативная сила заставит систему бесконечно колебаться около положения \(C=0\). Чтобы добавить демпфирование, нужно изменить выражение для силы на следующее

\begin{equation} \textbf{f}_i = (-k_s\textbf{C}-k_d\dot{\textbf{C}})\frac{\partial \textbf{C}}{\partial \textbf{x}_i}, \label{fi} \end{equation}

где \(k_d\) — обобщенная постоянная демпфирования (затухания), а \( \dot{\textbf{C}}\) является производной по времени от \(C\). Отметим, что, при выводе выражения для \( \dot{\textbf{C}}\) удобно использовать тот факт, что \(\dot{\textbf{x}}_i = \textbf{v}_i\). Так, в тривиальном случае, когда \(\textbf{C}=\textbf{x}_1-\textbf{x}_2\), это приводит к \(\dot{\textbf{C}}=\textbf{v}_1-\textbf{v}_2\).

В качестве простейшего примера рассмотрим функцию \(\textbf{C}=\textbf{x}_1-\textbf{x}_2\), которая «хочет», чтобы точки совпадали. У нас есть

$$ \frac{\partial\textbf{C}}{\partial\textbf{x}_1} = \textbf{I}, \quad \frac{\partial\textbf{C}}{\partial\textbf{x}_2} =-\textbf{I}, $$

где \(\textbf{I}\) — единичная матрица. Производная по времени равна

$$ \dot{\textbf{C}}=\textbf{v}_1-\textbf{v}_2. $$

Подставляя эти выражения в уравнение \eqref{fi}, получим

$$ \textbf{f}_1 = -k_s (\textbf{x}_1-\textbf{x}_2) - k_d (\textbf{v}_1-\textbf{x}_v), \quad \textbf{f}_2 = k_s (\textbf{x}_1-\textbf{x}_2) + k_d (\textbf{v}_1-\textbf{x}_v), $$

т.е. обычный закон действия силы упругости для пружины нулевой длины.

В качестве еще одного примера рассмотрим функцию поведения

$$ C = |\textbf{l}| - r, $$

где \(\textbf{l} = \textbf{x}_1 - \textbf{x}_2\), которая требует, чтобы две точки находились на расстоянии \(r\) друг от друга. Производная этой функции по \(\textbf{l}\) равна

$$ \frac{\partial C}{\partial\textbf{l}} = \frac{\textbf{l}}{|\textbf{l}|}, $$

т.е. единичному вектору, направленному по \(\textbf{l}\). Тогда, поскольку \(\textbf{l} = \textbf{x}_1 - \textbf{x}_2\)

$$ \frac{\partial C}{\partial\textbf{x}_1} = \frac{\partial C}{\partial\textbf{l}}, \quad \frac{\partial C}{\partial\textbf{x}_2} =-\frac{\partial C}{\partial\textbf{l}}. $$

Производная по времени от \(C\) имеет вид

$$ \dot{C} = \frac{\textbf{l}\cdot\dot{\textbf{l}}}{|\textbf{l}|} = \frac{\textbf{l}\cdot (\textbf{v}_1 - \textbf{v}_2)}{|\textbf{l}|}. $$

Полученные выражения подставим в \eqref{fi}, чтобы получить выражение для силы. Нетрудно убедиться, что будет сила упругости с демпфированием, описываемая уравнением \eqref{eq:hook}.

7. Столкновение и контакт частицы с плоскостью

В общем случае задача расчета столкновений и контактов весьма трудна, если не сказать больше. Позднее в этом курсе мы рассмотрим столкновения и контакты твердых тел. Здесь мы рассматриваем самые основы — столкновение частицы с плоскостью (например, землей или стеной). Но даже такая простая модель столкновений может сделать интерактивное моделирование более реалистичным.

7.1 Обнаружение

У задачи обработки столкновений есть две составляющие: обнаружение столкновений и реакция на них. Хотя в общем случае задача обнаружения (детектирования) столкновений достаточно сложна, обнаружение случаем столкновений частицы с плоскостью выполняется тривиально. Если \(\textbf{P}\) — точка на плоскости, а \(\textbf{N}\) — нормаль, направленная внутрь (т.е. в ту сторону от барьера, где нахождение частицы законно), то нужно лишь проверить знак величины \((\textbf{X}-\textbf{P})\cdot\textbf{N}\), чтобы выяснить, произошло или нет столкновение точки \(\textbf{X}\) с плоскостью. Значение, большее нуля, говорит о том, что частица находится внутри отведенной ей области (например, внутри помещения, огражденного стенами), меньшее нуля — что частица находится за пределами этой области (где ей не разрешено находиться) и равенство нулю означает, что имеет место контакт.

Если после шага решения ОДУ обнаружено столкновение, то вернее всего было бы найти (возможно, с помощью линейной интерполяции между старым и новым положением частицы) момент контакта, вернуть состояние системы на один из предшествующих ему моментов времени, и продолжить расчет, начиная с этого момента. Менее точный способ, требующий при этом меньших затрат на вычисления, заключается в том, чтобы скорректировать положение столкнувшейся частицы.

7.2 Реакция на столкновение

Для описания реакции на столкновение нужно разложить векторы скорости и силы на две взаимно перпендикулярные компоненты — нормальную к поверхности столкновения, и параллельную этой поверхности (тангенциальную). Если \(\textbf{N}\) — нормаль к плоскости столкновения, то нормальная составляющая вектора \(\textbf{x}\) есть \(\textbf{x}_n = (\textbf{N}\cdot\textbf{x})\textbf{x}\) и тангенциальная составляющая равна \(\textbf{x}_t = \textbf{x}-\textbf{x}_n\).

Простейшим столкновением является абсолютно упругое столкновение без трения. В этом случае в момент столкновения нормальная составляющая скорости частицы меняет знак, после чего частица направляется в обратный путь. При неупругом столкновении нормальная составляющая скорости умножается на \(-r\), где \(r\) — постоянная, принимающая значения от нуля до единицы, называемая коэффициентом восстановления. Если считать частицу мячом, сталкивающимся со стенкой, то при \(r=0\), частица вовсе не отскочит от стенки, а при \(r=0.9\) мы получим супермячик.

7.3 Контакт

Если частица находится на поверхности столкновения и имеет нулевую нормальную скорость, то говорят, что она находится в контакте с поверхностью. Если частица проникает вглубь плоскости контакта (\(\textbf{N}\cdot\textbf{f}<0\)), то возникает контактная сила \(\textbf{f}_c = -(\textbf{N}\cdot\textbf{f})\textbf{f}\), направленная на то, чтобы «погасить» нормальную составляющую \(\textbf{f}\). Однако, если приложенная сила направлена от контактной плоскости, то никакой контактной силы не возникает (если только поверхность не будет липкой), частица будет ускоряться, двигаясь по направлению от поверхности, и контакт нарушается.

В самой простой модели линейного трения, сила трения равна \(-k_f(-\textbf{f}\cdot\textbf{N})\textbf{v}_t\), т.е. действует в тангенциальном направлении, с величиной, пропорциональной нормальное силе. При моделировании идеальной поверхности без скольжения величина \(\textbf{v}_t\) просто обнуляется.

Ссылки

[1] R.W Hocknew and J.W. Eastwood. Computer Simulation Using Particles. Adam Hilger, New York, 1988. [2] Gavin S. P. Miller. The motion dynamics of snakes and worms. Computer Graphics, 22: 169–178, 1988. [3] Andrew Witkin, Kurt Fleischer, and Alan Barr. Energy constraints on parameterized models. Computer Graphics, 21(4): 225–232, July 1987.



  1. Эта операция называется приведением уравнения (системы уравнений) к нормальной форме или — к форме Коши. 



Комментарии

comments powered by Disqus