Моделирование движения транспортного средства. Моделирование движения самобалансирующегося велосипеда Моделирования движения

Сокращенный перевод-пересказ статьи: .

Введение

В статье описаны основы подхода к моделированию движения объектов, который удобно применять в компьютерных играх. Этот подход прост, реализующие его программы работают быстро и достаточно устойчиво. Кроме того, для понимания его основ не требуется особых математических знаний (хотя сам подход имеет под собой твердые математические основания). С его помощью можно моделировать движение тканей, мягких и твердых тел, а также тел с учетом связей.

Физическое моделирование, т. е. моделирование движения персонажей, основанное на законах физики (а точнее - механики), изучается достаточно давно. В литературе (см. и др.) предлагаются различные подходы, много усилий вложено в создание точных и надежных алгоритмов. Точные методы моделирования движения известны в физике уже давно. Однако для игр и систем виртуальной реальности, точность - не самое главное достоинство (хотя хорошо, когда она есть). Гораздо важнее правдоподобие (программист может искажать модель реальности сколько угодно, лишь бы при этом ему удалось увлечь игрока) и скорость выполнения (на выполнение расчетов по моделированию движения отводится лишь часть времени, которое длится кадр анимации). В случае физического моделирования, термин "правдоподобие" подразумевает также устойчивость: нельзя признать удачным метод моделирования, при котором тела проникают сквозь препятствия или подпрыгивают, когда должны лежать неподвижно. Методы, описанные в данной работе, разрабатывались в первую очередь для достижения правдоподобия и скорости расчета. Они имеют высокую производительность и достаточно просты в реализации (по крайней мере, в сравнении с другими методами, решающими те же задачи).

Рассматриваемый метод является итеративным, так что, начиная с определенного шага, он может быть остановлен в любой момент. Это дает возможность выбирать между точностью расчетов и затраченным временем: если некоторая величина погрешности считается приемлемой, коду можно разрешить работать быстрее; причем величина погрешности может подбираться адаптивно во время выполнения. Метод также обрабатывает столкновения и контакты покоя (resting contact) и справляется с моделированием стопки сложенных друг на друга тел, что для многих физических движков является проблемой.

Успех применения метода складывается из правильного комбинирования и использования преимуществ нескольких техник:

  • метода численного интегрирования Верле;
  • обработки столкновений и проникновения тел при помощи проецирования (by projection);
  • простого решателя связей (constraint solver), использующего релаксацию;
  • аппроксимации квадратного корня, повышающей скорость вычислений;
  • моделирования твердых тел, как частиц, соединенных связями.

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

Содержание организовано следующим образом. В разделе 2, описано представление системы частиц без использования скорости. Такое представление имеет ряд преимуществ, из которых наиболее существенными являются устойчивость и простота реализации связей и других ограничений (constraints). В раздел 3 описано, как происходит обработка столкновений. Затем, в разделе 4, система частиц дополняется связями, позволяющими моделировать движение ткани. Раздел 5 объясняет, как настроить систему связанных между собой частиц для моделирования твердого тела. Далее, в разделе 6, показано как реализовать соединения между телами (в частности, шарниры). Раздел 7 содержит различные короткие заметки и некоторый опыт по реализации трения.

В дальнейшем, векторы обозначаются буквами со стрелочками, а их компоненты - нижними индексами: \(\vec{x}=(x_1,x_2,x_3)\) .

Метод интегрирования Верле

Сердцем симуляции (т. е. имитации физического процесса при помощи компьютерной системы) является система частиц. Обычно, при реализации такой системы предполагается, что каждая частица имеет две основные характеристики: координату (положение, position) \(\vec{x}\) и скорость \(\vec{v}\) . Тогда, новые значения координат \(\vec{x}^\prime\) и скорости \(\vec{v}^\prime\) вычисляются по формулам

$$ \begin{aligned} \vec{x}^\prime &= \vec{x} + \vec{v} \Delta t, \\ \vec{v}^\prime &= \vec{v} + \vec{a} \Delta t, \end{aligned} $$

где \(\Delta t\) - шаг по времени, \(\vec{a}\) - ускорение, вычисленное в соответствии со 2-м законом Ньютона \(\vec{f}=m \vec{a}\) (где \(\vec{f}\) - суммарная сила, действующая на частицу). Приведенные формулы реализуют простейший метод численного интегрирования - метод Эйлера.

Мы рассмотрим другое описание частицы, в котором скорость не используется: вместо хранения положения и скорости каждой частицы, мы будем сохранять текущее положение частицы \(\vec{x}\) и ее положение на предыдущем шаге интегрирования \(\vec{x}^{*}\) . Предполагая шаг интегрирования постоянным, получим следующие формулы для вычисления новых значений:

$$ \begin{aligned} \vec{x}^\prime &= 2\vec{x} - \vec{x}^{*} + \vec{a} \Delta t^2, \\ \vec{x}^{*} &= \vec{x}. \end{aligned} $$

Этот способ численного интегрирования называется методом Верле (см. ) и активно используется в молекулярной динамике.

Метод Верле опирается на приближенную формулу вычисления второй производной

$$ \frac{\Delta^2 \vec{x}}{\Delta t^2} = \frac{ \frac{\vec{x}^\prime - \vec{x}}{\Delta t} - \frac{\vec{x} - \vec{x}^{*}}{\Delta t} }{\Delta t} = \frac{\vec{x}^\prime - 2\vec{x} + \vec{x}^{*}}{\Delta t^2} = \vec{a} $$

Такое приближение не является самым точным (есть и более совершенные методы численного интегрирования), зато оно устойчиво и работает быстро. Уменьшая коэффициент 2 до, скажем, 1.99, мы тем самым вводим силу сопротивления, рассеивающую энергию системы. Отметим также, что \(\vec{x}-\vec{x}^{*}\) - это расстояние, пройденное за последний шаг интегрирования (\(\vec{v}\Delta t\) ).

В конце шага интегрирования текущее положение каждой частицы \(\vec{x}\) сохраняется в соответствующей переменной \(\vec{x}^{*}\) для использования на следующем шаге. Если частиц в системе много, то вместо копирования их координат удобно использовать перенаправление указателей.

Код, реализующий описанные выше идеи, может выглядеть так (класс Vector3 содержит все необходимые операции над векторами)

class ParticleSystem { Vector3 m_x [ NUM_PARTICLES ]; // Текущее положение Vector3 m_oldx [ NUM_PARTICLES ]; // Предыдущее положение Vector3 m_a [ NUM_PARTICLES ]; // Суммарная сила (ускорение) Vector3 m_vGravity ; // Гравитация float m_fTimeStep ; public : void TimeStep (); private : void Verlet (); void SatisfyConstraints (); void AccumulateForces (); // (конструкторы, инициализацию полей и т.п. опустим) }; // шаг интегрирования методом Верле void ParticleSystem :: Verlet () { for (int i = 0 ; i < NUM_PARTICLES ; i ++ ) { Vector3 & x = m_x [ i ]; Vector3 temp = x ; Vector3 & oldx = m_oldx [ i ]; Vector3 & a = m_a [ i ]; x += x - oldx + a * fTimeStep * fTimeStep ; oldx = temp ; } } // суммирование сил, действующих на каждую частицу void ParticleSystem :: AccumulateForces () { // Все частицы находятся под действием гравитации for (int i = 0 ; i < NUM_PARTICLES ; i ++ ) m_a [ i ] = m_vGravity ; } // проверка соблюдения наложенных связей void ParticleSystem :: SatisfyConstraints () { // Сейчас нам не важно, как это реализовано. } // шаг расчета void ParticleSystem :: TimeStep () { AccumulateForces (); Verlet (); SatisfyConstraints (); }

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

Попробуйте задать \(\vec{a}=(0,0,1)\) и начальные условия \(\vec{x}=(1,0,0)\) , \(\vec{x}^*=(0,0,0)\) . Вычислите вручную несколько шагов и посмотрите, что получится.

Столкновения и обработка контактов при помощи проецирования

Способы обработки контактов между телами, основанные на использовании штрафных функций (penalty-based schemes), предполагают, что в месте контакта, где возможно проникновение тел друг в друга, нужно вставить пружину для моделирования этого контакта. Такой подход прост в реализации, но приводит к ряду серьезных проблем. В частности, очень трудно подобрать жесткость пружины так, чтобы, с одной стороны, объекты не проникали друг в друга слишком глубоко, а с другой - чтобы система не потеряла устойчивость из-за слишком большой жесткости пружин. Еще один подход к обработке столкновений заключается в том, что при обнаружении столкновения время "отматывается" назад, вплоть до точного момента контакта тел (например, с помощью бинарного поиска), затем корректируются положения и скорости тел (по известным из курса физики формулам для столкновений), после чего расчет начинается заново с этого момента времени. И так - для каждого столкновения. Не слишком экономный подход, если предполагается моделировать в реальном времени движение множества тел.

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

Рассмотрим следующий пример. Пусть наш "мир" представляет собой внутренность куба размером (0,0,0)--(1000,1000,1000) и, кроме того, коэффициент восстановления (restitution coefficient) частиц равен нулю (т. е. столкнувшиеся с поверхностью куба частицы не отражаются от нее). Чтобы координаты частиц оставались внутри куба, запишем следующий код, реализующий проецирование:

// Заставляет частицы оставаться внутри куба void ParticleSystem :: SatisfyConstraints () { for (int i = 0 ; i < NUM_PARTICLES ; i ++ ) { // Для всех частиц Vector3 & x = m_x [ i ]; x = vmin (vmax (x , Vector3 (0 , 0 , 0 )), Vector3 (1000 , 1000 , 1000 )); } }

(vmax представляет собой покомпонентную операцию вычисления максимума, а vmin - аналогичное вычисление минимума). Это код позволяет обработать как столкновения, так и неподвижные контакты (resting contact) (т. е. случаи, когда точка покоится на поверхности куба), и сохраняет положение всех частиц внутри куба. Прелесть метода Верле в том, что соответствующие изменения в значения скоростей вносятся автоматически. В последующих вызовах TimeStep() скорость уже будет скорректирована так, чтобы не содержать составляющей, перпендикулярной поверхности куба (что соответствует нулевому значению коэффициента восстановления). См. рис.1.

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

Обработка нескольких одновременно наложенных связей методом релаксации

Модель ткани обычно представляет собой систему частиц, соединенных пружинами. Дифференциальные уравнения такой системы построить несложно. Но одно дело построить, и совсем другое - решить. При этом всплывают все те проблемы, что мы имели при использовании штрафных функций: слишком жесткие пружины приводят к тому, что система уравнений сама становиться "жесткой" (stiff system), а это приводит к неустойчивости, если используются простейшие методы численного интегрирования или к медленной работе, если используются методы более совершенные - в обоих случаях головная боль обеспечена. И наоборот, слишком мягкие пружины приводят к тому, что ткань будет выглядеть нереалистично упругой.

Однако самое интересное произойдет, если устремить жесткость пружин к бесконечности: система вдруг становится разрешима даже для весьма простого (и быстрого) метода интегрирования, оставаясь при этом устойчивой. Но прежде чем мы продолжим разговор о ткани, давайте вернемся к предыдущему примеру. Куб, с которым мы имели дело, можно рассматривать как совокупность односторонних (unilateral) связей (т. е. связей, записываемых в форме неравенств) - по одной для каждой стороны куба - которые должны выполняться все время моделирования.

\begin{equation} x_i \geq 0 \ \text{and}\ x_i \leq 1000 \quad (i=1,2,3). \label{eq:C1} \end{equation}

В рассмотренном примере, для того чтобы соблюсти ограничения, накладываемые связями (чтобы частицы оставались внутри куба), достаточно просто спроектировать координаты "вылезших" частиц на поверхность куба. Эта идея описывается следующим псевдокодом:

// Псевдокод, позволяющий выполнить ограничения (1) for i = 1 , 2 , 3 set xi = min { max { xi , 0 }, 1000 }

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

Расширим нашу модель, добавив к ней стержень длиной 100. Для этого нам понадобится задать две частицы (\(\vec{x}_1\) и \(\vec{x}_2\) ) и потребовать, чтобы расстояние между ними всегда было равно 100. Математическая запись этой двухсторонней (bilateral) связи имеет вид:

\begin{equation} |\vec{x}_2-\vec{x}_1| = 100. \label{eq:C2} \end{equation}

Даже если в начальный момент времени положения частиц удовлетворяют условиям \eqref{eq:C2}, то уже в следующий момент эти условия, скорее всего, выполняться не будут. Для того чтобы получить корректное значение расстояния, переместим частицы, проецируя их на множество решений, описанных \eqref{eq:C2}. Для этого частицы либо отодвигаются друг от друга, либо подтягиваются ближе, в зависимости от того, мало или велико расстояние, полученное численным интегрированием. См. рис.2.

Перемещение частиц для исправления расстояния, не удовлетворяющего ограничению \eqref{eq:C2}

Псевдокод, реализующий выполнение условий \eqref{eq:C2}:

Delta = x2 - x1 ; deltalength = sqrt (delta * delta ); diff = (deltalength - restlength ) / deltalength ; x1 -= delta * 0.5 * diff ; x2 += delta * 0.5 * diff ;

Заметим, что delta - вектор, а delta*delta - скалярное произведение. Этот псевдокод будет раздвигать или сдвигать частицы так, чтобы добиться требуемого расстояния между ними. И вновь мы можем рассматривать это как бесконечно жесткую пружину, мгновенно возвращающую себе нормальную длину, равную 100.

Теперь предположим, что, помимо условия \eqref{eq:C2}, должно выполняться и условие \eqref{eq:C1} (частицы обязаны находиться внутри куба). Может оказаться, что при попытке соблюсти условие \eqref{eq:C2}, какая-то из частиц стержня нарушит требования \eqref{eq:C1} (стержень будет торчать из куба). Можно, конечно, снова спроектировать частицу-нарушителя на поверхность куба, выполняя \eqref{eq:C1}, но тогда будет нарушено уже \eqref{eq:C2}.

Чтобы удовлетворить одновременно требованиям \eqref{eq:C1} и \eqref{eq:C2} нам нужно решить систему уравнений. Мы это и сделаем, но не напрямую: просто будем повторять два фрагмента псевдокода друг за другом какое-то количество раз, в надежде, что результат окажется полезным. Такой подход реализован в следующем коде:

// реализация моделирования стержня внутри куба void ParticleSystem :: SatisfyConstraints () { for (int j = 0 ; j < NUM_ITERATIONS ; j ++ ) { // Сначала выполним условия (1) for (int i = 0 ; i < NUM_PARTICLES ; i ++ ) { // Для всех частиц Vector3 & x = m_x [ i ]; x = vmin (vmax (x , Vector3 (0 , 0 , 0 )), Vector3 (1000 , 1000 , 1000 )); } // Теперь удовлетворим (2) Vector3 & x1 = m_x [ 0 ]; Vector3 & x2 = m_x [ 1 ]; Vector3 delta = x2 - x1 ; float deltalength = sqrt (delta * delta ); float diff = (deltalength - restlength ) / deltalength ; x1 -= delta * 0.5 * diff ; x2 += delta * 0.5 * diff ; } }

(здесь опущена инициализация частиц). Хотя такой способ "тупого" повторения и может показаться несколько наивным, тем не менее, он сходится к решению, которое мы ищем! В математике он называется методом релаксации (или Якоби, или Гаусса-Зейделя - в зависимости от того, как именно вы это делаете, см. ). Он работает, последовательно удовлетворяя отдельные ограничения, и сходится к глобальной конфигурации, которая удовлетворяет всем ограничениям одновременно. Этот метод очень полезен в ситуациях, когда должны одновременно выполняться несколько независимых ограничений.

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

Моделирование ткани

Тот факт, что связь типа стержня можно рассматривать как очень жесткую пружину, позволяет использовать этот вид связей для моделирования тканей. Предположим, например, что ткань представляется шестиугольной сеткой, состоящей из треугольников. Каждый узел сетки представляет собой частицу, а каждая грань - связь типа стержня, соединяющую частицы (нормальная длина стержня равна расстоянию между соединяемыми им узлами).

Функция HandleConstraints() , отвечающая за обработку связей, использует релаксацию по всем ограничениям. Цикл релаксации может повторятся несколько раз. Однако, чтобы получить хорошо выглядящую анимацию, в большинстве случаев достаточно всего одной итерации. Это означает, что расход времени в симуляции ткани зависит в основном от того, как долго выполняются \(N\) операций вычисления квадратного корня и \(N\) делений (где \(N\) - число ребер в сетке, моделирующей ткань). Ниже мы покажем один трюк, позволяющий избавиться от вычисления квадратного корня. Но сначала рассмотрим как выглядит обработка ограничений.

// Реализация моделирования тканей struct Constraint { int particleA , particleB ; float restlength ; }; // Предположим, что массив ограничений m_constraints уже существует void ParticleSystem :: SatisfyConstraints () { for (int j = 0 ; j < NUM_ITERATIONS ; j ++ ) { for (int i = 0 ; i < NUM_CONSTRAINTS ; i ++ ) { Constraint & c = m_constraints [ i ]; Vector3 & x1 = m_x [ c . particleA ]; Vector3 & x2 = m_x [ c . particleB ]; Vector3 delta = x2 - x1 ; float deltalength = sqrt (delta * delta ); float diff = (deltalength - c . restlength ) / deltalength ; x1 -= delta * 0.5 * diff ; x2 += delta * 0.5 * diff ; } // Прикрепим одну из частиц, составляющих ткань, к началу координат m_x [ 0 ] = Vector3 (0 , 0 , 0 ); } }

Теперь обсудим, как избавиться от вычисления квадратного корня. Если все ограничения соблюдены (ну, или почти соблюдены), то, как мы уже знаем, результат вычисления квадратного корня стремится к \(r\) - нормальной длине связи (стержня). Мы используем этот факт чтобы получить приближенное выражение для функции квадратного корня. Заменим функцию \(\sqrt{x}\) членом 1-го порядка из ее разложения в ряд Тейлора в окрестности длины \(r\) (это эквивалентно одной итерации метода Ньютона-Рафсона с начальным приближением \(r\) ). После некоторых преобразований, получим следующий псевдокод:

// Псевдокод для соблюдения ограничений (2), использующий приближение sqrt delta = x2 - x1 ; delta *= restlength * restlength / (delta * delta + restlength * restlength ) - 0.5 ; x1 -= delta ; x2 += delta ;

Обратите внимание, что если расстояние уже удовлетворяет ограничениям (т. е., если |delta|=restlength), то мы получим delta равное (0,0,0) и никаких изменений не произойдет.

Теперь при обработке каждой связи мы больше не используем квадратные корни. Кроме того, квадрат значения restlength * restlength можно вычислить заранее. Трудоемкие операции сокращены до выполнения \(N\) делений за кадр (и доступа к соответствующей памяти) - трудно придумать что-то, работающее существенно быстрее.

Ограничения не обязательно будут удовлетворены за одну итерацию, но, благодаря методу Верле, система быстро сходится к правильному состоянию (когда все ограничения соблюдены) - буквально за несколько кадров. На самом деле, использование только одной итерации и аппроксимации квадратного корня снимает проблему жесткости системы уравнений, которая обязательно проявилась бы у системы с абсолютно жесткими стержнями.

Размещая связи-стержни между парами соседних вершин, можно распространить алгоритм моделирования ткани на моделирование растений.

Код и уравнения, рассмотренные в этом разделе предполагают, что все частицы имеют одинаковую массу. Тем же способом можно моделировать и частицы с разными массами, но полученные уравнения будут немного сложнее.

Так, соблюдение ограничения \eqref{eq:C2} для частиц с разными массами реализует следующий псевдокод:

// Псевдокод для соблюдения ограничений (2) delta = x2 - x1 ; deltalength = sqrt (delta * delta ); diff = (deltalength - restlength ) / (deltalength * (invmass1 + invmass2 )); x1 -= invmass1 * delta * diff ; x2 += invmass2 * delta * diff ;

Здесь invmass1 и invmass2 хранят обратные массы частиц \(\vec{x}_1\) и \(\vec{x}_2\) . Если мы хотим, чтобы частица оставаться неподвижной, нужно установить для нее invmass = 0 , что соответствует бесконечной массе. Как и выше, для ускорения расчетов можно использовать приближенное вычисление квадратного корня.

Твердые тела

Уравнения движения твердых тел были предложены задолго до изобретения современных компьютеров. Для того, чтобы в те времена получить какие-то полезные результаты, математики должны были выполнять преобразования формул. Это привело к появлению таких полезных понятий и инструментов, как тензор инерции, момент импульса, момент сил, кватернионы для представления ориентации и т. п. Между тем, имеющиеся сейчас возможности обрабатывать огромные объемы данных в цифровой форме позволяют проводить расчеты для более простых элементов, а в некоторых случаях даже делают такие расчеты более выгодными. В случае трехмерных твердых тел, это означает, что может оказаться удобным моделировать твердое тело с помощью четырех частиц и шести связей (дающих правильное количество степеней свободы: \(4 \cdot 3 - 6 = 6\) ). Это упрощает множество вещей, и именно этим мы займемся далее.

Рассмотрим тетраэдр, в каждую из четырех вершин которого помещена частица. Кроме того, каждое из шести ребер тетраэдра представляет собой ограничение типа стержня, рассмотренное в предыдущем разделе. Этого вполне достаточно, чтобы имитировать твердое тело. Тетраэдр можно поместить внутрь куба, рассмотренного выше, и интегратор Верле обеспечит его правильное движение. Функция SatisfyConstraints() должна позаботиться о двух вещах: 1) чтобы частицы оставались внутри куба, и 2) чтобы были соблюдены шесть ограничений-стержней. Сделать это, как и раньше, можно с использованием релаксации: обычно достаточно 3-х--4-х итераций. Не забывайте также об эффективном вычислении квадратного корня.

Однако ясно, что при столкновениях твердые тела будут вести себя не так как "скелетные" тетраэдры. Существует и другая проблема: до сих пор мы обнаруживали факт столкновения между твердым телом и окружающим "миром" только на основе информации о вершинах: если вершина оказывалась вне куба, она снова проектировалась вовнутрь. Это прекрасно работает, пока внутренняя часть "мира" выпукла. Если же это не так, то тетраэдр сможет проникнуть сквозь границу "мира" даже когда ни одна из его вершин эту границу не пересекала (см. рис.3, где треугольник представляет собой плоский аналог тетраэдра). Рассмотрим, как решается эта проблема.

Сначала разберем более простой вариант задачи. Возьмем стержень, поместим его в кубический "мир" и предположим, что у куба есть небольшой выступ, направленный внутрь. Теперь стержень может пересечь границы "мира", хотя обе частицы на его концах остаются внутри куба (рис.4). Мы не будем вдаваться в тонкости разработки механизма обнаружения столкновений (collision detection), так как это целая отдельная наука. Вместо этого предположим, что подсистема обнаружения столкновений уже существует и делает свое дело: позволяет определить глубину проникновения и координаты точек проникновения для каждого из двух сталкивающихся объектов. Одно из определений точек проникновения и глубины проникновения звучит так: глубина проникновения \(d_p\) - это кратчайшее расстояние, на которое нужно развести два объекта в подходящем направлении, чтобы избежать их столкновения. Точки проникновения - это точки на каждом из объектов, которыми объекты касаются друг друга после того, как упомянутый выше перенос состоялся.

Взгляните еще раз на рис.4. Здесь, после этапа численного интегрирования, стержень проник через границу. Детектор столкновений определил две точки проникновения: \(\vec{p}\) и \(\vec{q}\) . На рис.4а, точка \(\vec{p}\) фактически совпадает с одной из концевых частиц: \(\vec{p}=\vec{x}_1\) . На рис.4б, \(\vec{p}\) лежит между \(\vec{x}_1\) и \(\vec{x}_2\) на расстоянии 1/4 длины стержня от \(\vec{x}_1\) . В обоих случаях, точка \(\vec{p}\) лежит на стержне и, следовательно, ее координаты могут быть выражены в виде линейной комбинации координат точек \(\vec{x}_1\) и \(\vec{x}_2\) : \(\vec{p} = c_1\vec{x}_1 + c_2\vec{x}_2\) такой, что \(c_1 + c_2 = 1\) . В первом случае \(c_1 = 1\) , \(c_2 = 0\) , а во втором - \(c_1 = 0.75\) и \(c_2 = 0.25\) . Эти значения говорят нам, на какое расстояние нужно передвинуть соответствующие частицы.

Чтобы скорректировать положение стержня, переместим его так, чтобы точка \(\vec{p}\) совпала с \(\vec{q}\) . Для этого передвинем частицы \(\vec{x}_1\) и \(\vec{x}_2\) в направлении, заданном вектором, соединяющим \(\vec{p}\) и \(\vec{q}\) : .

В первом случае (рис.4а), мы просто cпроектируем \(\vec{x}_1\) за пределы области, где ей "запрещено" находиться, также как это делали раньше (в направлении \(\vec{q}\) ). Этого будет достаточно, а координаты \(\vec{x}_2\) вообще не нужно изменять. Во втором случае (рис.4б) точку \(\vec{x}_1\) также нужно перенести на большее расстояние, чем \(\vec{x}_2\) , поскольку точка \(\vec{p}\) расположена ближе к \(\vec{x}_1\) (действительно, так как \(\vec{p} = 0.75\vec{x}_1 + 0.25\vec{x}_2\) , то всякий раз перемещая \(\vec{x}_1\) на величину 0.75, мы перемещаем \(\vec{x}_2\) только на 0.25). Другими словами, новые положения частиц \(\vec{x}_1^\prime\) и \(\vec{x}_2^\prime\) задаются соотношениями

\begin{equation} \begin{aligned} \vec{x}_1^\prime &= \vec{x}_1 + 0.75\lambda\cdot\vec{\Delta}, \\ \vec{x}_2^\prime &= \vec{x}_2 + 0.25\lambda\cdot\vec{\Delta}, \end{aligned} \label{eq:x_new} \end{equation}

где \(\lambda\) - неизвестная величина. Новое положение частицы \(\vec{p}\) - \(\vec{p}^\prime\) - вычисляется по формуле

$$ \vec{p}^\prime = c_1\vec{x}_1^\prime + c_2\vec{x}_2^\prime . $$

Вспомним, что мы хотим добиться, чтобы \(\vec{p}^\prime = \vec{q}\) , т. е. должны выбрать \(\lambda\) в точности таким, чтобы \(\vec{p}^\prime\) в результате совпало с \(\vec{q}\) . Так как мы перемещаем частицы только в направлении \(\vec{\Delta}\) , то \(\vec{p}\) также перемещается в направлении \(\vec{\Delta}\) и, следовательно, решение уравнения \(\vec{p}^\prime = \vec{q}\) можно найти, выразив \(\lambda\) из

\begin{equation} \vec{p}^\prime\cdot\vec{\Delta} = \vec{q}\cdot\vec{\Delta} . \label{eq:pq} \end{equation}

Расписывая выражение, стоящее в левой части равенства, получим

$$ \begin{aligned} \vec{p}^\prime\cdot\vec{\Delta} &= (0.75\vec{x}_1^\prime + 0.25\vec{x}_2^\prime) \cdot\vec{\Delta} \\ &= (0.75 (\vec{x}_1 + 0.75\lambda\cdot\vec{\Delta}) + 0.25 (\vec{x}_2 + 0.25\lambda\cdot\vec{\Delta})) \cdot\vec{\Delta} \\ &= ((0.75\vec{x}_1 + 0.25\vec{x}_2)\cdot\vec{\Delta} + \lambda(0.75^2 + 0.25^2)\cdot\Delta^2 \\ &= \vec{p} \cdot\vec{\Delta} + \lambda(0.75^2 + 0.25^2)\cdot\Delta^2 , \end{aligned} $$

что, с учетом правой части \eqref{eq:pq}, дает

$$ \lambda = \frac{(\vec{p}-\vec{q}) \cdot\vec{\Delta}}{(0.75^2 + 0.25^2)\cdot\Delta^2} . $$

Подставляя найденное \(\lambda\) в \eqref{eq:x_new}, получим скорректированные положения частиц \(\vec{x}_1\) и \(\vec{x}_2\) , при которых \(\vec{p}^\prime\) совпадет с \(\vec{q}\) .

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

В случае тетраэдра описанная выше стратегия будет работать аналогично. Сначала находятся точки взаимопроникновения \(\vec{p}\) и \(\vec{q}\) (они также могут находится внутри треугольника) и \(\vec{p}\) представляется линейной комбинацией четырех частиц \(\vec{p}=c_1\vec{x}_1+c_2\vec{x}_2+c_3\vec{x}_3+c_4\vec{x}_4\) таких, что \(c_1+c_2+c_3+c_4=1\) (это потребует решения небольшой системы линейных уравнений). После того, как будет найден \(\vec{\Delta} = \vec{q}-\vec{p}\) , можно будет найти значение \(\lambda\) по формуле

$$ \lambda = \frac{(\vec{p}-\vec{q}) \cdot\vec{\Delta}}{(c_1^2 + c_2^2 + c_3^2 + c_4^2)\cdot\Delta^2} , $$

а исправленные положения частиц определяются как

$$ \begin{align*} \vec{x}_1^\prime &= \vec{x}_1 + c_1\lambda\cdot\vec{\Delta}, \\ \vec{x}_2^\prime &= \vec{x}_2 + c_2\lambda\cdot\vec{\Delta}, \\ \vec{x}_3^\prime &= \vec{x}_3 + c_3\lambda\cdot\vec{\Delta}, \\ \vec{x}_4^\prime &= \vec{x}_4 + c_4\lambda\cdot\vec{\Delta}. \end{align*} $$

Итак, мы рассмотрели столкновение одного твердого тела с неподвижным "миром". Описанный выше метод можно легко обобщить для обработки столкновений нескольких твердых тел. При этом столкновения обрабатываются для одной пары тел в один момент времени и, вместо того, чтобы перемещать только \(\vec{p}\) , понадобится перемещать \(\vec{p}\) и \(\vec{q}\) по направлению друг к другу.

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

Во-первых, куб должен быть каким-то образом прикреплен к тетраэдру. Один из подходов состоит в том, что в качестве центра куба выбирается центр масс тетраэдра \(0.25\cdot (\vec{x}_1 + \vec{x}_2 + \vec{x}_3 + \vec{x}_4)\) , а затем по текущим координатам тетраэдра вычислить координаты вершин куба. При обнаружении столкновения, точка контакта \(\vec{p}\) (которая теперь расположена на кубе) обрабатывается также, как и выше. Аналогично вычисляются и обновленные значения координат частиц. Для ускорения расчетов можно заранее вычислить коэффициенты \(c_1\) --\(c_4\) для всех вершин куба. Если \(\vec{p}\) окажется вершиной, то значения \(c_1\) --\(c_4\) могут быть найдены и использованы непосредственно. В противном случае, \(\vec{p}\) лежит внутри треугольника или на одной из его сторон, и значения \(c_1\) --\(c_4\) можно получить из предварительно вычисленных значений вершин треугольника при помощи интерполяции.

Как правило, для обработки столкновений достаточно 3--4 итераций. Если релаксацию остановить слишком рано, то тела не будут вести себя как абсолютно твердые. Но это даже хорошо, ведь абсолютно твердых тел в природе не существует. Кроме того, это делает систему более устойчивой.

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

По тому же принципу, что и тетраэдр, можно задать другую подобную конфигурацию частиц и связей, расположив частицы в точках с координатами \((0,0,0)\) , \((1,0,0)\) , \((0,1,0)\) и \((0,0,1)\) . Пусть \(\vec{a}\) , \(\vec{b}\) , и \(\vec{c}\) - векторы, направленные из частицы 1 к частицами 2, 3 и 4, соответственно. Ограничим положения частиц, требованием, чтобы векторы \(\vec{a}\) , \(\vec{b}\) , и \(\vec{c}\) имели единичную длину, и угол между каждой из трех пар векторов был равен \(90^\circ\) (соответствующие скалярные произведения должны быть равны нулю). Заметим, что это снова, как и в случае с тетраэдром, даст 4 частицы и 6 связей.

Сочлененные тела

Теперь мы можем соединять несколько твердых тел при помощи шарниров (цилиндрических, сферических и т. п.). Предположив, что два тела имеют одну общую частицу, мы получим сферический шарнир (pin joint), а если общими являются две частицы, то получим цилиндрический шарнир (hinge) (рис.7). Таким же образом можно связать два тела при помощью стержня или любого другого вида связи - надо только не забыть добавить код для обработки нового вида связи в цикл релаксации.

Такой подход позволяет построить полную модель сочлененного человеческого тела. Реалистичность увеличится, если дополнительно реализовать ограничения на угловые перемещения в шарнирах. Существует несколько способов реализации таких ограничений. Простейший способ предполагает использование ограничения типа стержня, которые срабатывает только тогда, когда расстояние между двумя частицами станет ниже некоторого порогового значения (в данном случае мы имеем дело с односторонней связь вида \(|\vec{x}_2 - \vec{x}_1| > 100\) ). Как следствие этого, обе частицы никогда не смогут слишком приблизиться друг к другу (рис.8).

Другой метод создания ограничений на угловые перемещения требует соблюдения следующего условия для скалярного произведения

$$ (\vec{x}_2 - \vec{x}_0)\cdot (\vec{x}_1 - \vec{x}_0) < \alpha . $$

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

К этому уроку прилагается 3D-сцена

Краткое предисловие

Собственно говоря, в предыдущих уроках уже были упомянуты отдельные аспекты физики в Cinema 4D: так, например, в самом первом уроке на данном сайте мы с вами роняли шар на плоскую поверхность , позже физическую модель Cinema 4D рассматривали как один из способов моделирования генератора бесконечного движения . Но до сих пор это были лишь частные, крайне поверхностные и самые примитивные аспекты физики.

В данном же уроке мы с вами перейдём к самому интересному: к углублённому изучению физики в Cinema 4D на основе конкретного примера - мы попробуем создать и настроить (хотя бы в самом примитивном варианте) вполне работоспособную физическую модель движения автомобиля по пересечённой местности, имитирующую в общих чертах те же принципы, по которым автомобиль движется в реальном мире.

Необходимость применения физической модели перемещения автомобиля кроется в словах «по пересечённой местности». В большинстве случаев при моделировании автомобильного движения нет никакой необходимости в использовании физической модели: автомобили равномерно движутся по траектории (именно такой транспортный поток мы с вами учились создавать из одной модели автомобиля , помните?), визуально практически никак не взаимодействуя с окружающей обстановкой, и это легко и просто изобразить простыми средствами, не прибегая к физике. Однако как только речь заходит о сложном рельефе местности, по которой едет автомобиль, или о неординарном поведении самого автомобиля (дрифт, заносы или столкновения) - вот тут-то и настаёт черёд физики, если только мы с вами не хотим вручную расставлять огромное количество ключей и править кривые поведения трёхмерной модели для каждой секунды поведения последней (и это без гарантии визуального праводоподобия финального рендера).

Цели и задачи

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

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

Приступаем?

Начнём с моделирования внешнего вида автомобиля (именно внешнего вида, а не физической модели - это не одно и то же!). Состоять наш с вами автомобиль будет всего лишь из пяти трёхмерных элементов: кузов и четыре колеса. Надеюсь, вам понятно, что каждое колесо должно быть отдельным элементом модели. Кроме того, каждое из колёс желательно сделать цельным (монолитным), то есть состоящим из одного-единственного элемента, а не из набора элементов, иначе впоследствии вы столкнётесь с массой сложностей - вам придётся скреплять между собой все элементы каждого из колёс при помощи физических модификаторов, что, на мой взгляд, было бы совершенно излишней тратой времени. Основной принцип, исходя из которого мы с вами разделили элементы модели - это возможность последующего визуального смещения элементов друг относительно друга во время движения внедорожника.

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

А теперь переходим к самому главному: к созданию непосредственно физической модели внедорожника. Возможно, вы сразу же предположите, что наступила пора прикрепить колёса к кузову. Ни в коем случае! Ни сейчас, ни позже. И вот почему. Дело в том, что прикрепи вы колёса непосредственно к кузову - у вас опять-таки возникла бы куча сложностей: физическая модель Cinema 4D воспринимала бы колёса как находящиеся внутри кузова (т. е. как бы завязшие внутри него), и во что бы то ни стало пыталась бы высвободить их, вследствие чего вместо более-менее правдоподобного поведения колёс вы увидели бы главным образом их мелкую, безостановочную вибрацию и минимум реакции на физическое взаимодействие с прочими окружающими внедорожник объектами. Конечно, проблема эта вполне решается тонкой и длительной настройкой значений динамики сцены и моделей, вроде интервалов, по достижении которых начинается взаимодействие трёхмерных элементов, но мы с вами пойдём более простым путём.

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

Почему именно так, спросите вы? Почему это не может быть NULL-объект или сплайн?

Потому что созданный нами весовой центр по определению и в силу своего наименования предназначен для активного участия в физической модели внедорожника. Ни сплайны, ни NULL-объекты, будучи наделены физическими характеристиками, не используют последние, так как не имеют физической поверхности.

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

Именно для такого вида крепления в Cinema 4D предусмотрены объекты типа «Connector» (от англ. «connect» - «соединять»). Переходим в верхнее меню, ищем пункт «Simulation», в выпадающем из этого пункта меню выбираем подпункт «Dynamics» и в выпадающем подменю жмём «Connector».

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

Теперь нужно настроить коннектор. Выделяем его наименование в менеджере объектов и видим открывшееся ниже окно свойств.

Первый параметр, значение которого нам следует изменить - это тип соединения (параметр «Type»), от него зависит, по каким закономерностям будет смещаться колесо относительно кузова. Очевидно, наиболее подходящим типом соединения в нашем случае будет «Wheel Suspension». В поле напротив слов «Object A» перетаскиваем из менеджера объектов наименование весового центра, на изображении ниже он обозначен как «Base» - это объект, к которому мы с вами прикрепляем колесо. В поле напротив слов «Object B» перетаскиваем наименование колеса (на изображении обозначено как «Wheel_FR», от сокращения «Wheel Front Right») - это объект, который мы с вами прикрепляем. Параметры «Attachment A» и «Attachment B» трогать не будем - они обозначают, где у объектов находятся центры масс, и выставленные по умолчанию значения в данном случае нас вполне устраивают.

Переходим к тонкой настройке коннектора.

Параметр «Ignore Collisions» («игнорировать взаимодействие») предназначен для случая, когда вы хотите избежать физического взаимодействия колеса с весовым центром - например, если параметры коннектора позволяют колесу отклоняться на угол до 45 градусов, но колесо при этом упирается в объект, к которому прикреплено, и не может отклониться на максимально разрешённый угол, то эта настройка может помочь. Параметр «Steering Angle» («Угол поворота») - это и есть тот самый максимально разрешённый угол отклонения колеса от своего первоначального положения. Параметр «Suspension Rest Position» определяет смещение колеса по вертикали в состоянии покоя (то есть в те моменты, когда колесо ни с чем не взаимодействует). В нашем с вами случае значение составляет -15 см. - если изменить его до -25, то кузов внедорожника будет поднят по отношению к колёсам ещё выше, нежели в данный момент, и дорожный просвет увеличится, но при этом понизится устойчивость внедорожника, так как весовой центр окажется выше - не правда ли, это уже напоминает баланс устойчивости автомобилей в реальном мире? От значения параметра «Suspension Stiffness» зависит мягкость подвески. Чем меньше значение, тем мягче будет подвеска. Параметр «Suspension Dumping» определяет «прыгучесть» подвески. Ну и наконец, при желании можно активировать параметры «Lower Limit Y» и «Upper Limit Y» и указать для них значения дистанций, на расстояния больше которых колесо отклониться не сможет.

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

С передними колёсам закончили. Переходим к задним.

И сразу же сталкиваемся с несколько неочевидным на первый взгляд вопросом: сколько двигателей должно быть у нашего внедорожника? Что за странный вопрос, скажете вы - один, естественно.

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

Таким образом, у нас с вами имеется два альтернативных решения: если нам позарез требутся изобразить раздельную тягу двух ведущих колёс , мы можем добавить в виртуальную конструкцию два отдельных двигателя, каждый из которых будет крутить «своё» колесо. Если же моделирование раздельной тяги нам с вами не нужно, то наиболее эффективным и простым способом привести автомобиль в движение будет создание так называемой «колёсной пары» - два наглухо сцементированных вместе колеса, которые приводятся в движение одним мотором.

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

Итак, решено - создаём колёсную пару: выделяем два задних колеса - можно в рабочем окне, можно в менеджер объектов, где вам удобнее - затем уже именно в менеджере объектов щёлкаем на любом из них правой клавишей мыши и в выпадающем контекстном меню ищем пункт «Connect+Delete» («Соединить и удалить»). Строкой выше в том же контекстном меню есть пункт «Connect» - он при объединении элементов создаёт новый объект, оставляя нетронутыми оригиналы объединяемых моделей, нам же с вами оригиналы раздельных задних колёс не понадобятся.

Мы видим, что задние колёса внедорожника стали одним трёхмерным элементом - то, что нам и требовалось.

Создаём ещё один коннектор - на сей раз для задней колёсной пары, и учитывая её монолитность, всего один, после чего настраиваем его. Располагаем его, естественно, в центре колёсной пары.

Теперь создаём мотор: верхнее меню, снова пункт «Simulation», выпадающее меню, подпункт «Dynamics», в выпадающем меню подпункт «Motor».

Располагаем созданный мотор там же, где коннектор для колёсной пары - посерединке между задними колёсами (или, выражаясь научно, в геометрическом центре задней колёсной пары), затем выделяем его наименование в менеджере объектов, плавно премещаем взгляд в открывшееся ниже окно свойств мотора и приступаем к настройке.

В поле рядом со словами «Object A» перетаскиваем из менеджера объектов наименование задней колёсной пары (на изображении оно обозначено как «Back Wheels»). В поле рядом со словами «Object B» ничего не перетаскиваем. Для параметра «Type» («Тип») выбираем значение «Angular» («угловой») - всё правильно, ведь для движения внедорожника созданный нами мотор должен непрерывно поворачивать ведущую колёсную пару на определённый угол. В качестве значения для параметра «Mode» («Режим») указываем «Regulate Speed» («Постоянная скорость»). Ну и наконец указываем числовые значения для параметров «Angular Target Speed» («скорость вращения цели») и «Torque» («крутящий момент»).

Вероятно, вы уже готовы запустить анимацию и проверить полученный результат. Если так, то - несколько рановато: ведь мы с вами выполнили только одну часть работы - настроили физическое воздействие на объекты, тогда как самих физических объектов у нас с вами пока нет. А колёса, скажете вы, а кузов, а весовой куб? Верно, полигональные модели созданы, но физически для сил воздействия ни колёс, ни кузова, ни весового куба пока не существует - пока колёсам, кузову и весовому кубу не назначен тег динамики. Ибо именно назначенный полигональному элементу трёхмерной сцены тег динамики обозначает, что данный элемент участвует во взаимодействии с другими элементами, обладающими динамическими характеристиками.

Приступаем к настройке физических характеристик внедорожника. А заодно и выстраиваем иерархическую структуру элементов, из которых он состоит. Первым делом создаём группу, в которой будут собраны все элементы автомобиля (если этого ещё не сделано) - это можно сделать, объединив несколько первых попавшихся под руку элементов при помощи комбинации клавиш Alt+G (напоминаю, что в отличие от общепринятого в Cinema 4D способа последовательного раздельного нажатия клавиш, эта комбинация нажимается одновременно!), либо создав NULL-объект.

Далее обзываем созданную группу неким уникальным, неповторимым и незабываемым словом (к примеру, автор назвал её «CAR») и запихиваем в неё все относящиеся к внедорожнику элементы: кузов, колёса, коннекторы, весовой куб и мотор.

Теперь обозначаем элементы группы как участников физического взаимодействия с окружающей физической моделью: выделяем наименование группы, щёлкаем на нём правой клавишей мыши, в выпадающем меню наводим курсор мыши на пункт «Dynamics Tags» («Теги динамики») и в выпадающем из последнего подменю выбираем единственный пункт - «Dynamics Body».

Если до сих пор вы внимательно знакомились с данным уроком, то, возможно, спросите: как группа «CAR», будучи NULL-объектом, может физически взимодействовать в физической модели? Верно, сам NULL-объект - никак. Зато свойства динамики могут унаследовать от него все подчинённые ему элементы, при этом отпадает необходимость назначать тег динамики каждому элементу индивидуально. Главное - правильно настроить тег динамики группы. Настраиваем: выделяем тег и в открывшемся ниже окне свойств выбираем вкладку «Dynamics», в которой активируем параметр «Enabled» (тем самым включая физику взаимодействия) и выбираем значение «On» для параметра «Dynamic» (тем самым указывая участие группы во всех общих для сцены физических правилах, типа гравитации и пр.)...

После чего переходим во вкладку «Collision» («Соприкосновение») в том же окне свойств и указываем значения, заставляющие элементы группы наследовать правила динамики: «Apply Tag to Children» («распространять действие тега на дочерние элементы») для параметра «Inherit Tag» («Наследование»), «All» («всё») для «Individual Elements» («Отдельные элементы»), галочку напротив «Self Collisions» («Собственное взаимодействие») и «Automatic (MoDynamics)» для «Shape» («Контур»). Остальные параметры настраиваем на свой вкус.

Тут будет уместно наконец-то вспомнить про кузов внедорожника. По нашей задумке, он также должен взаимодействовать с окружающей физической моделью трёхмерной сцены - например, разбрасывать носовой частью стену из картонных ящиков, - но при этом не должен взаимодействовать с другими элементами своей же группы - с весовым кубом и колёсами. Чтобы добиться такого результата, мы с вами подчиним его весовому кубу и назначим кузову индивидуальный тег динамики - точно так же, как группе элементов автомобиля, - но в теге динамики кузова отключим параметр «Dynamic» (укажем для него значение «Off») во вкладке «Dynamics» (обратите внимание, параметр «Enabled» остаётся активированным, иначе кузов вообще перестанет участвовать в физической модели сцены, и любое оказавшееся на пути внедорожника препятствие свободно пройдёт насквозь через кузов!). Во вкладке «Collision» назначенного кузову тега динамики для параметров «Inherit Tag» и «Individual Elements» можно указать соответственно «None» и «Off» - у кузова нет подчинённых элементов, которым следовало бы передавать динамические свойства кузова.

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

В заключение

В данном уроке мы с вами изучили создание простейшей физической модели движения автомобиля - без каких-либо дополнительных плагинов и модулей, штатными средствами Cinema 4D. В уроке, как вы заметили, не рассматривается моделирование поворотов, созданная нами модель способна к движению только по прямой - разумеется, если только неровности рельефа под колёсами не изменят траекторию движения (что и происходит в нижеприведённом видеоролике). К слову говоря, автор намеренно настроил параметры физической модели трёхмерной сцены так, чтобы движение внедорожника было как бы гиперболизировано, с целью наглядно продемонстрировать взаимодействие колёс и кузова машины с неровностями. Кроме того, в приложенную к уроку сцену входят и другие, не упомянутые в уроке элементы, предназначенные для съёмки и освещения. Впоследствии, возможно, на сайте будут рассмотрены и более сложные физические модели.

Финальный результат в виде анимации.


БЕЛОРУССКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

РЕСПУБЛИКАНСКИЙ ИНСТИТУТ ИННОВАЦИОННЫХ ТЕХНОЛОГИЙ

КАФЕДРА ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ

Курсовая работа

Дисциплина «Математическое моделирование»

Тема: «Моделирование движения парашютиста»


Введение

1. Свободное падение тела с учетом сопротивления среды

2. Формулировка математической модели и ее описание.

3. Описание программы исследования с помощью пакета Simulink

4. Решение задачи программным путем

Список использованных источников

Введение

Формулировка проблемы :

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

Цель работы :

Научиться составлять математическую модель, решать дифференциальные уравнения программными средствами (используется язык технических вычислений MatLAB 7.0, пакет расширения Simulink) и анализировать полученные данные о математической модели.

1. Свободное падение тела с учетом сопротивления среды

При реальных физических движениях тел в газовой или жидкостной среде трение накладывает огромный отпечаток на характер движения. Каждый понимает, что предмет, сброшенный с большой высоты (например, парашютист, прыгнувший с самолета), вовсе не движется равноускоренно, так как по мере набора скорости возрастает сила сопротивления среды. Даже эту, относительно несложную, задачу нельзя решить средствами “школьной” физики: таких задач, представляющих практический интерес, очень много. Прежде чем приступать к обсуждению соответствующих моделей, вспомним, что известно о силе сопротивления.

Закономерности, обсуждаемые ниже, носят эмпирический характер и отнюдь не имеют столь строгой и четкой формулировки, как второй закон Ньютона. О силе сопротивления среды движущемуся телу известно, что она, вообще говоря, растет с ростом скорости (хотя это утверждение не является абсолютным). При относительно малых скоростях величина силы сопротивления пропорциональна скорости и имеет место соотношение, где определяется свойствами среды и формой тела. Например, для шарика - это формула Стокса, где - динамическая вязкость среды, r - радиус шарика. Так, для воздуха при t = 20°С и давлении 1 атм = 0,0182 H.c.м-2 для воды 1,002 H.c.м-2 , для глицерина 1480 H.c.м-2.

Оценим, при какой скорости для падающего вертикально шара сила сопротивления сравняется с силой тяжести (в движение станет равномерным).

(1)

Пусть r= 0,1 м, = 0,8 кг/м (дерево). При падении в воздухе м/с, в воде 17 м/с, в глицерине 0,012 м/с.

На самом деле первые два результата совершенно не соответствуют действительности. Дело в том, что уже при гораздо меньших скоростях сила сопротивления становится пропорциональной квадрату скорости: . Разумеется, линейная по скорости часть силы сопротивления формально также сохранится, но если , то вкладом можно пренебречь (это конкретный пример ранжирования факторов). О величине k2 известно следующее: она пропорциональна площади сечения тела S, поперечного по отношению к потоку, и плотности среды и зависит от формы тела. Обычно представляют k2 = 0,5сS, где с - коэффициент лобового сопротивления - безразмерен. Некоторые значения с (для не очень больших скоростей) приведены на рис.1.

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

Вернемся к указанной выше оценке, исходя из квадратичной зависимости силы сопротивления от скорости.

для шарика

(3)

Рис 1 . Значения коэффициента лобового сопротивления для некоторых тел, поперечное сечение которых имеет указанную на рисунке форму

Примем r = 0,1 м, =0,8.103 кг/м3 (дерево). Тогда для движения в воздухе (= 1,29 кг/м3) получаем 18 м/с, в воде(= 1.103 кг/м3) 0,65 м/с, в глицерине (= 1,26.103 кг/м3) 0,58 м/с.

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

(4)

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

(5)

Вопрос, который мы будем обсуждать на первом этапе, таков: каков характер изменения скорости со временем, если все параметры, входящие в уравнение (7) заданы? При такой постановке модель носит сугубо дескриптивный характер. Из соображений здравого смысла ясно, что при наличии сопротивления, растущего со скоростью, в какой-то момент сила сопротивления сравняется с силой тяжести, после чего скорость больше возрастать не будет. Начиная с этого момента, , и соответствующую установившуюся скорость можно найти из условия =0, решая не дифференциальное, а квадратное уравнение. Имеем

(6)

(второй - отрицательный - корень, естественно, отбрасываем). Итак, характер движения качественно таков: скорость при падении возрастает от до . Как и по какому закону – это можно узнать, лишь решив дифференциальное уравнение (7).

Однако даже в столь простой задаче мы пришли к дифференциальному уравнению, которое не относится ни к одному из стандартных типов, выделяемых в учебниках по дифференциальным уравнениям, допускающих очевидным образом аналитическое решение. И хотя это не доказывает невозможность его аналитического решения путем хитроумных подстановок, но они не очевидны. Допустим, однако, что нам удастся найти такое решение, выраженное через суперпозицию нескольких алгебраических и трансцендентных функций – а как найти закон изменения во времени перемещения? Формальный ответ прост:

(7)

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

В достижении этой цели компьютер - незаменимый помощник. Независимо от того, какой будет процедура получения решения - аналитической или численной, - задумаемся об удобных способах представления результатов. Разумеется, колонки чисел, которых проще всего добиться от компьютера (что при табулировании формулы, найденной аналитически, что в результате численного решения дифференциального уравнения), необходимы; следует лишь решить, в какой форме и размерах они удобны для восприятия. Слишком много чисел в колонке быть не должно, их трудно будет воспринимать, поэтому шаг, с которым заполняется таблица, вообще говоря, гораздо больше шага, с которым решается дифференциальное уравнение в случае численного интегрирования, т.е. далеко не все значения и , найденные компьютером, следует записывать в результирующую таблицу (табл. 2).

Таблица 2

Зависимость перемещения и скорости падения от времени (от 0 до 15 с)

t(c) S(m) (м/с) t(c) S(m) (м/с)

Кроме таблицы необходимы графики зависимостей и ; по ним хорошо видно, как меняются со временем скорость и перемещение, т.е. приходит качественное понимание процесса.

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

Наконец, можно запрограммировать звуковые сигналы, которые подаются через каждый фиксированный отрезок пути, пройденный телом - скажем, через каждый метр или каждые 100 метров - смотря по конкретным обстоятельствам. Надо выбрать интервал так, чтобы вначале сигналы были редкими, а потом, с ростом скорости, сигнал слышался все чаще, пока промежутки не сравняются. Таким образом, восприятию помогают элементы мультимедиа. Поле для фантазии здесь велико.

Приведем конкретный пример решения задачи о свободно падающем теле. Герой знаменитого фильма “Небесный тихоход” майор Булочкин, упав с высоты 6000 м в реку без парашюта, не только остался жив, но даже смог снова летать. Попробуем понять, возможно, ли такое на самом деле или же подобное случается только в кино. Учитывая сказанное выше о математическом характере задачи, выберем путь численного моделирования. Итак, математическая модель выражается системой дифференциальных уравнений.

(8)

Разумеется, это не только абстрактное выражение обсуждаемой физической ситуации, но и сильно идеализированное, т.е. ранжирование факторов перед построением математической модели произведено. Обсудим, нельзя ли произвести дополнительное ранжирование уже в рамках самой математической модели с учетом конкретно решаемой задачи, а именно - будет ли влиять на полет парашютиста линейная часть силы сопротивления и стоит ли ее учитывать при моделировании.

Так как постановка задачи должна быть конкретной, мы примем соглашение, каким образом падает человек. Он опытный летчик и наверняка совершал раньше прыжки с парашютом, поэтому, стремясь уменьшить скорость, он падает не “солдатиком”, а лицом вниз, “лежа”, раскинув руки в стороны. Рост человека возьмем средний - 1,7 м, а полуобхват грудной клетки выберем в качестве характерного расстояния - это приблизительно 0,4 м. для оценки порядка величины линейной составляющей силы сопротивления воспользуемся формулой Стокса. Для оценки квадратичной составляющей силы сопротивления мы должны определиться со значениями коэффициента лобового сопротивления и площадью тела. Выберем в качестве коэффициента число с=1,2 как среднее между коэффициентами для диска и для полусферы (выбор дня качественной оценки правдоподобен). Оценим площадь: S = 1,7 ∙ 0,4 = 0,7(м2).

В физических задачах на движение фундаментальную роль играет второй закон Ньютона. Он гласит, что ускорение, с которым движется тело, прямо пропорционально действующей на него силе (если их несколько, то равнодействующей, т.е. векторной сумме сил) и обратно пропорционально его массе:

Так для свободно падающего тела под действием только собственной массы закон Ньютона примет вид:

Или в дифференциальном виде:

Взяв интеграл от этого выражения, получим зависимость скорости от времени:

Если в начальный момент V0 = 0, тогда .

.

Выясним, при какой скорости сравняются линейная и квадратичная составляющие силы сопротивления. Обозначим эту скорость Тогда

Ясно, что практически с самого начала скорость падения майора Булочкина гораздо больше, и поэтому линейной составляющей силы сопротивления можно пренебречь, оставив лишь квадратичную составляющую.

После оценки всех параметров можно приступить к численному решению задачи. При этом следует воспользоваться любым из известных методов интегрирования систем обыкновенных дифференциальных уравнений: методом Эйлера, одним из методов группы Рунге - Кутта или одним из многочисленных неявных методов. Разумеется, у них разная устойчивость, эффективность и т.д. - эти сугубо математические проблемы здесь не обсуждаются.

Вычисления производятся до тех пор, пока не опустится на воду. Примерно через 15 с после начала полета скорость становится постоянной и остается такой до приземления. Отметим, что в рассматриваемой ситуации сопротивление воздуха радикально меняет характер движения. При отказе от его учета график скорости, изображенный на рисунке 2, заменился бы касательной к нему в начале координат.

Рис. 2. График зависимости скорости падения от времени

2. Формулировка математической модели и ее описание

парашютист падение сопротивление математическая модель

При построении математической модели необходимо соблюдение следующих условий:

Манекен массой 50 кг соответственно падают в воздухе с плотностью 1,225 кг/м3;

На движение влияют только силы линейного и квадратичного сопротивления;

Площадь сечения тела S=0.4 м2;

Тогда для свободно падающего тела под действием сил сопротивления закон Ньютона примет вид:

,

где a – ускорение тела, м/с2,

m – его масса, кг,

g – ускорение свободного падения на земле, g = 9,8 м/с2,

v – скорость тела, м/c,

k1 – линейный коэффициент пропорциональности, примем k1 = β = 6πμl (μ – динамическая вязкость среды, для воздуха μ = 0,0182 Н.с.м-2; l – эффективная длина, примем для среднестатистического человека при росте 1,7 м и соответствующем обхвате грудной клетки l = 0,4 м),

k2 – квадратичный коэффициент пропорциональности. K2 = α = С2ρS. В данном случае достоверно можно узнать лишь плотность воздуха, а площадь манекена S и коэффициент лобового сопротивления С2 для него определить сложно, можно воспользоваться полученными экспериментальными данными и принять K2 = α = 0,2.

Тогда получим закон Ньютона в дифференциальном виде:

Тогда можно составить систему дифференциальных уравнений:


Математическая модель при падении тела в гравитационном поле с учетом сопротивления воздуха выражается системой из двух дифференциальных уравнений первого порядка.

3. Описание программы исследования с помощью пакета Simulink

Для имитационного моделирования движения парашютиста в системе MATLAB используем элементы пакета расширения Simulink. Для задания величин начальной высоты - H_n, конечной высоты - H_ k, числа - pi, μ – динамическая вязкость среды - my, обхват - R, массе манекена m, коэффициент лобового сопротивления - c, плотность воздуха - ro, площадь сечения тела - S, ускорение свободного падения - g, начальная скорость - V_n используем элемент Constantнаходящийся в Simulink/Sources(рисунок 3).

Рисунок 3. Элемент Constant


Для операции умножения используем блок Product, находящийся в Simulink/MathOperations/Product (рисунок 4).

Рисунок. 4

Для ввода k1 – линейного коэффициента пропорциональности и k2 – квадратичного коэффициента пропорциональности используем элемент Gain, находящийся в Simulink/MathOperations/Gain(Рисунок. 5.)

Рисунок. 5

Для интегрирования – элемент Integrator. Находящийсяв Simulink/Continuous/Integrator. Рисунок. 6.

Рисунок. 6

Для вывода информации используем элементы Display и Scope. Находящиеся в Simulink/Sinks. (Рисунок. 7)


Рисунок. 7

Математическая модель для исследования с использованием вышеперечисленных элементов, описывающая последовательный колебательный контур приведена на рисунке 8.

Рисунок. 8

Программа исследований

1. Исследование графика зависимости высоты от времени и скорости от времени масса парашютиста равна 50кг.


Рисунок 9

Из графиков видно, что при расчете падения парашютиста массой 50 кг, следующие данные: максимальная скорость равна 41,6 м/с и время равно 18с, и должна достигаться через 800 м падения, т.е. в нашем случае на высоте около 4200 м.


Рисунок. 10

2. Исследование графика зависимости высоты от времени и скорости от времени масса парашютиста равна 100кг.


Рисунок 11


Рисунок 12

С массой парашютиста 100 кг.: максимальная скорость равна 58 м/с и время равно 15с, и должна достигаться через 500 м падения, т.е. в нашем случае на высоте около 4500 м. (рисунок. 11., рисунок. 12).

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

Легкий манекен при свободном падении в гравитационном поле с учетом сопротивления среды достигает меньшей предельной скорости, но за меньший промежуток времени и, естественно, при одинаковой начальной высоте – в более низкой точке траектории, чем тяжелый манекен.

Чем тяжелее манекен, тем быстрее он достигнет земли.

4. Решение задачи программным путем

%Функция моделирования движения парашютиста

function dhdt=parashut(t,h)

global k1 k2 g m

% система ДУ первого порядка

dhdt(1,1)= -h(2);

% Моделирование движения парашютиста

% Васильцов С. В.

global h0 g m k1 k2 a

% k1-линейный коэффициент пропорциональности, определяющийся свойствами среды и формой тела. Формула Стокса.

k1=6*0.0182*0.4;

%k2-квадратичный коэффициент пропорциональности, пропорционален площади сечения тела, поперечного по

%отношения к потоку, плотности среды и зависит от формы тела.

k2=0.5*1.2*0.4*1.225

g=9.81; % ускорение свободного падения

m=50; % масса манекена

h0=5000; % высота

Ode45(@parashut,,)

r=find(h(:,1)>=0);

a=g-(k1*-h(:,2)+k2*h(:,2).*h(:,2))/m % вычисляемускорение

% Построение графика зависимости высоты от времени

subplot(3,1,1), plot(t,h(:,1),"LineWidth",1,"Color","r"),grid on;

xlabel("t, c"); ylabel("h(t), m");

title("Графикзависимостивысотыотвремени", "FontName", "Arial","Color","r","FontWeight","bold");

legend("m=50 kg")

% Построение графика зависимости скорости от времени

subplot(3,1,2), plot(t,h(:,2),"LineWidth",1,"Color","b"),grid on;

ylabel("V(t), m/c");

Title("Графикзависимостискоростиотвремени", "FontName", "Arial","Color","b","FontWeight","bold");

legend("m=50 kg")

% Построение графика зависимости ускорения от времени

subplot(3,1,3), plot(t,a,"-","LineWidth",1,"Color","g"),grid on;

text (145, 0,"t, c");

ylabel("a(t), m/c^2");

Title("Графикзависимостиускоренияотвремени", "FontName", "Arial","Color","g","FontWeight","bold");

legend("m=50 kg")


Экранная форма вывода графиков.



1. Вся физика. Е.Н. Изергина. – М.: ООО «Издательство «Олимп», 2001. – 496 с.

2. Касаткин И. Л. Репетитор по физике. Механика. Молекулярная физика. Термодинамика/ Под ред. Т. В. Шкиль. – Ростов Н/Д: изд-во «Феникс», 2000. – 896 с.

3. Компакт-диск «Самоучитель MathLAB». ООО «Мультисофт», Россия, 2005.

4. Методические указания к Курсовой работе: дисциплина Математическое моделирование. Движение тела при учете сопротивления среды. – Минск. РИИТ БНТУ. Кафедра ИТ, 2007. – 4 с.

5. Решение систем дифференциальных уравнений в Matlab. Дубанов А.А. [Электронный ресурс]. – Режим доступа: http://rrc.dgu.ru/res/exponenta/ educat/systemat/dubanov/index.asp.htm;

6. Энциклопедия д.д. Физика. Т. 16. Ч.1. с. 394 – 396. Сопротивление движению и силы трения. А. Гордеев. /Глав. ред. В.А. Володин. – М. Аванта+, 2000. – 448 с.

7. MatlabFunctionReference [Электронный ресурс]. – Режим доступа: http://matlab.nsu.ru/Library/Books/Math/MATLAB/help/techdoc/ref/.









Включить эффекты

1 из 9

Отключить эффекты

Смотреть похожие

Код для вставки

ВКонтакте

Одноклассники

Телеграм

Рецензии

Добавить свою рецензию


Аннотация к презентации

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

  1. План урока
  2. Вопросы на повторение
  3. Задание на повторение
  4. Моделирование движения
  5. Личная карточка Черепашки

    Формат

    pptx (powerpoint)

    Количество слайдов

    Кулешова Е.В

    Аудитория

    Слова

    Конспект

    Присутствует

    Предназначение

    • Для проведения урока учителем

Слайд 1

  • ГБОУ ЦО №1456 ЮЗОУО г.Москвы
  • Кулешова Е.В.
  • Моделирование движения
  • в среде ЛогоМиры

Слайд 2

Цели урока:

знать понятие моделирования;

Слайд 3

План урока

  • Проверка домашнего задания
  • Проведение тестирования
  • Изучение новой темы
  • Подведение итогов
  • Слайд 4

    Вопросы на повторение

    • Что такое исполнитель?
    • Что такое СКИ?
    • Что такое входные параметры?
  • Слайд 5

    Задание на повторение

    Слайд 6

    Моделирование движения

    • Модель – упрощённый аналог изучаемого объекта.
    • Моделирование - процесс создания и изучения модели.
    • Движение- перемещение объекта из одной точки пространства в другую со временем.
  • Слайд 7

    Как задать скорость Черепашке

    • Пауза в среде ЛогоМиры задается командой: жди <сколько ждать>
    • Для медленного движения Черепашка должна выполнить много раз команды:Вперёд n жди n.
  • Слайд 8

    Личная карточка Черепашки

    Задать команду Черепашке можно не только в командной строке, но и с помощью её личной карточки.

  • Слайд 9

    • ДВИЖЕНИЕ
    • ПОВОРОТ
    • ВОЗВРАТ
    • РИСОВАНИЕ
    • ВПЕРЕД Х (ВП Х)
    • НАЗАД Х (НД Х)
    • ПЕРО_ОПУСТИ (ПО)
    • ПЕРО_ПОДНИМИ (ПП)
    • ДОМОЙ (ДОМОЙ)
    • СОТРИ_ГРАФИКУ (СГ)
    • НАПРАВО У (ПР У)
    • НАЛЕВО У (ЛВ У)
  • Посмотреть все слайды

    Конспект

    Конспект урока

    учитель информатики и ИКТ

    ГБОУ ЦО №1456

    ЮЗАОУО г.Москвы

    Возраст учащихся : 5 класс

    Место в системе уроков по теме: изучается после знакомства со средой исполнителя и основными командами

    Тип урока: урок усвоения новых знаний.

    Цели урока.

    Познакомить с возможностями программы ЛогоМиры для моделирования движения:

    знать понятие моделирования;

    понимать назначение команд исполнителя;

    уметь моделировать простые движения на компьютере.

    Развивать творческого мышления, внимательность.

    Формировать навыки самостоятельной работы.

    Технические средства, дидактический материал: компьютер, проектор, программа ЛогоМиры, карточки с методическими рекомендациями и заданиями.

    Этапы урока:

    Организационный момент (2)

    Проверка домашнего задания (2)

    Актуализация знаний(6)

    Изучение новой темы (15)

    Самостоятельная работа на компьютере (15)

    Подведение итогов и рефлексия(3)

    Домашнее задание (2)

    Используемые педагогические технологии.

    Информационно-коммуникационные технологии на этапе мотивации знаний и изучения нового материала (презентация).

    Проблемное обучение на этапе изучения нового материала

    Разноуровневое обучение на этапе закрепления знаний.

    Здоровьесберегающие технологии – физкультминутка в середине работы за компьютером.

    Проектные методы обучения при выполнении домашнего задания.

    Этапы урока

    Ход урока

    Организационный

    1.Организация рабочего места учащихся, учителя; приветствие.

    2. Сообщение темы, целей урока.

    3. Планирование работы на уроке.

    Проверка домашнего задания

    На прошлом уроке у вас было задание создать кроссворд на тему «Алгоритмы». Чтобы проверить выполнение задания, сейчас каждый из вас задаст классу 1 вопрос из своего кроссворда, а остальные отвечают.

    Актуализация знаний�презентация

    карточки

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

    А теперь давайте вспомним, что мы уже знаем о среде программирования ЛогоМиры.

    Вопросы и задания классу.

    Что такое исполнитель?

    Кто является исполнителем в среде ЛогоМиры?

    Что такое СКИ?

    Какие команды исполнителя Черепашка вы уже знаете?

    Что такое входные параметры?

    Чтобы вам было легче ориентироваться в СКИ и в градусах поворотов я раздам вам карточки. (Раздаются карточки)

    Черепашка находится в отмеченной точке и смотрит в направлении стрелки. Какую команду поворота должна выполнить черепашка, чтобы двигаться по пунктирной линии.

    Изучение новой темы�на экране запущена среда Логомиры

    Как вы понимаете слово модель? А моделирование? �Модель – упрощённый аналог изучаемого объекта. Моделирование - процесс создания и изучения модели (есть записи в тетрадях).

    Мы с вами сегодня будем моделировать движение черепашки.

    Что такое движение? Перемещение объекта из одной точки пространства в другую со временем. (записываем в тетрадях)

    С помощью какой команды мы перемещаем Черепашку? – �Вперёд n Назад n

    Какие объекты, предметы мы сможем смоделировать в среде Логомиры? Вспомните меню форм (открывается программа) Логомиры – Машинка, вертолёт, рыбка, собачка, пчёлка, поезд и т.д.

    Давайте попробуем изобразить движение самолёта. �Изменяем форму Черепашки, выполняем команды налево 90 вперёд 200

    А теперь изобразим движение человека. Те же команды.

    Чем отличаются эти движения? – Скоростью

    А как нам задать скорость Черепашке? (первый проблемный вопрос). Попробуйте процесс движения представить как последовательность отдельных перемещений. Что нужно вставить после каждого маленького перемещения, чтобы скорость движения уменьшилась? – Паузу

    Т.е. медленное движение можно представить в виде повторения двух команд: шаг – остановка, шаг – остановка и т.д.

    Теперь вопрос. А как называется алгоритм, в котором одни и те же команды выполняются несколько раз? (Циклическим)

    Пауза в среде ЛогоМиры задается следующей командой : жди <сколько ждать> (Записываем)

    Чем больше число после команды жди , тем медленнее скорость.

    Итак, для изображения движения по прямой линии Черепашка должна выполнить много раз команды Вперёд n жди n (Запишите это в тетрадь)

    Задать команду Черепашке можно не только в командной строке, но и с помощью её личной карточки . Чтобы задать инструкцию в личной карточке надо:

    Щелкнуть на изображении вылупляющийся из яйца черепашки в Инструментальном меню

    Щелкнуть на панцире черепашки на экране

    Занести в строку Инструкция команду или набор команд через пробел

    Задайте режим исполнения – Много раз

    Щелкните на кнопке ОК.

    В практическом задании вы попробуете изобразить движение Трактора и Машины одновременно.

    Щёлкнуть мышкой по Черепашке на панели инструментов, а затем щёлкнуть мышкой по рабочему полю

    Как переодеть Черепашку?

    Открыть поле форм. Щёлкнуть мышкой по нужной форме на поле форм, а затем щёлкнуть мышкой по Черепашке, которую хотите переодеть

    Машина должна двигаться быстрее чем трактор. Что нужно менять в их командах? – Параметр у команды ЖДИ.

    А также вы попробуете изобразить птичку, летающую по кругу

    Как нам задать движение по кругу? (второй проблемный вопрос)

    Что происходит при движении по кругу? – Объект не только перемещается вперёд, но ещё и поворачивается.

    Я вам сейчас раздам карточки с заданием, где будет и инструкция по его выполнению. Садимся за компьютеры.

    Перед переходом за компьютеры проводится физкультминутка – �упражнения «Дерево»

    Самостоятельная работа на компьютере

    Подведение итогов урока и рефлексия

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

    Выставление оценок каждому ученику класса.

    Личностное осмысление каждым учеником результатов урока:

    Что было наиболее трудным?

    Что удалось лучше всего?

    Что могло бы улучшить работу?

    Информация о домашнем задании

    Написать программу для написания своего имени в среде ЛогоМиры и оформить результат исполнения программы (на листочках в клеточку).

    Использованная литература

    Н. В. Макарова Информатика и ИКТ Начальный уровень: Питер, 2010

    Гузеев В.В. Познавательная самостоятельность учащихся и развитие образовательной технологии. М.: НИИ школьных технологий, 2004. 128 с.

    http://aamaiorova.narod.ru/DswMedia/uroki_informatika_5klass.doc

    Приложение 1

    Моделирование движения в среде Логомиры

    Задание

    Изобразите на экране одновременно движение, например, машины и трактора.

    Инструкция к выполнению задания

    Как установить несколько Черепашек?

    Щёлкнуть мышкой по Черепашке на панели инструментов, а затем щёлкнуть мышкой по рабочему полю

    Как переодеть Черепашку?

    Открыть поле форм. Щёлкнуть мышкой по нужной форме на поле форм, а затем щёлкнуть мышкой по Черепашке, которую хотите переодеть

    Как записать команды в личную карточку Черепашки?

    Щёлкнуть мышкой по Черепашке на панели инструментов, а затем щёлкнуть мышкой по нужной Черепашке.

    Как изобразить прямолинейное движение?

    Повторить много раз:

    Вперёд 5 Жди 2

    2*) Изобразите круговое движение птички.

    Как изобразить круговое движение?

    Повторить много раз:

    3*) Нарисуйте при помощи встроенного графического редактора простой пейзаж (дорогу, небо, траву)

    Приложение 2.

    Дополнительное задание.

    Изобразите пчёлку, летающую над клумбой (клумбу нарисовать в графилеском редакторе).

    *Как изобразить хаотическое движение?

    Повторить много раз:

    В этих командах используется функция сл n. Эта функция возвращает случайное число, меньшее n. Например, значением функции сл 8 может быть любое число из набора {0, 1, 2, 3, 4, 5, 6, 7}

    Приложение 3.

    Приложение 4.

    Оценочный лист.

    Фамилия Имя

    Тест

    Ответы

    Практика

    Итог

    НАЛЕВО У (ЛВ У)

    НАПРАВО У (ПР У)

    СОТРИ_ГРАФИКУ (СГ)

    ДОМОЙ (ДОМОЙ)

    ПЕРО_ПОДНИМИ (ПП)

    ПЕРО_ОПУСТИ (ПО)

    НАЗАД Х (НД Х)

    ВПЕРЕД Х (ВП Х)

    РИСОВАНИЕ

    ДВИЖЕНИЕ

    Конспект урока

    Тема: Моделирование движения в среде ЛогоМиры

    учитель информатики и ИКТ

    ГБОУ ЦО №1456

    ЮЗАОУО г.Москвы

    Тема урока: Моделирование движения в среде ЛогоМиры

    Возраст учащихся : 5 класс

    Место в системе уроков

    Движение автомобиля рассматривается как плоскопараллельное движение твердого тела по горизонтальной поверхности (рис. 1). В общем случае движение автомобиля описывается следующей системой дифференциальных уравнений:

    где - вектор ускорения центра масс автомобиля; m - масса автомобиля; fi - вектор силы сопротивления прямолинейному движению i-го колеса; i - вектор взаимодействия с грунтом i-го колеса; w - вектор силы сопротивления воздуха; J z - момент инерции автомобиля относительно оси z; M nki - момент сопротивления повороту i-го колеса.

    Ускорение определяется как

    где dV/dt - относительная производная скорости центра масс автомобиля. Проекции скоростей в координатах x`, y`, z`:

    Учитывая, что:

    можно записать следующую систему уравнений:

    Данную систему уравнений решим с помощью пакета DEE (Differential Equation Editor) входящего в состав Simulink. Для этого записываем уравнения в нормальной форме Коши и настраиваем входные данные:

    Рисунок 6. Решатель систем дифференциальных уравнений

    Входными данными будут являться выходы с предыдущих блоков. Общий вид модели представлен на следующем рисунке:


    Рисунок 7. Модель транспортного средства с колесной формулой 4х4

    Результаты моделирования представим графически:

    Рисунок 8. Траектория движения автомобиля

    Результаты моделирования представляют собой траекторию движения автомобиля в форме окружности, что говорит об адекватности данной модели. Данная работа может послужить фундаментом для дальнейших перспективных исследований в области разработки систем автоматического управления движением автомобиля, в том числе систем активной безопасности.