МЕТОДИЧЕСКИЕ МАТЕРИАЛЫ к проведению практических занятий №10 и №11 по дисциплине «Компьютерное моделирование» для студентов направления подготовки 09.04.04 «Программная инженерия» Практическое занятие «Моделирование в AnyLogic. Создание реалистичной анимации на основе использования законов механики» Задание Необходимо развить модель перемещений мяча, созданную в ходе практического занятия №1: реализовать горизонтальные перемещения мяча, столкновение мяча со стенами, перемещение двух мячей, определение их столкновения и реалистичный отскок после столкновения. Ход работы 1. Вернитесь к работе с моделью перемещений мяча, созданной в ходе практического занятия №1. Доработайте класс Ball: мяч должен «уметь» двигаться не только строго вертикально, но и в горизонтальном направлении. При горизонтальных перемещениях мяча от должен отскакивать от левой и правой стен. Направление и скорость горизонтального перемещения можно сделать случайными при помощи функции uniform. 2. Поместите в корневой объект модели еще один экземпляр мяча. Назовите экземпляры, например, ball1 и ball2. Запустите модель. Убедитесь, что оба мяча перемещаются. 3. Добавьте к модели возможность определения столкновения двух мячей. Для этого можно создать специальный стейтчарт в корневом объекте модели. Помните, что столкновение мячей происходит тогда, когда расстояние между их центрами становится меньше суммы их радиусов. 4. Следующая задача: обеспечить реалистичную реакцию мячей на столкновение. Это возможно сделать на основе использования законов механики. Задайте радиусы мячей существенно отличными друг от друга. Далее удобно считать, что масса мячей пропорциональная (или даже равна) их радиусам. 5. Общая схема выполнения преобразований для выполнения реалистичной анимации столкновения мячей состоит в следующем1. 1) В момент столкновения необходимо спроецировать векторные скорости vx и vy каждого из мячей на так называемую линию действия (проводится между центрами мячей). Это необходимо потому, что в момент столкновения оказывают действие лишь векторные скорости (импульсы), которые направлены вдоль линии действия. 2) Применяются уравнения сохранения импульса и сохранения энергии к спроецированным векторным скоростям для нахождения новой векторной скорости после столкновения. 3) Используя новые скорости вдоль линии действия и векторные скорости, перпендикулярные линии действия, можно спроецировать скорости назад и вернуться к исходной системе координат, т.е. найти новые скорости мячей vx и vy. 6. В корневом объекте модели создайте переменные, описанные ниже. mass1, mass2 – массы мячей; xVel1, yVel1, xVel2, yVel2 – компоненты скорости первого и второго мячей; run, rise – вспомогательные переменные; Theta – величина угла между линией действия и осью OX; cosTheta, sinTheta – косунус и синус угла; P – суммарный импульс системы из двух мячей (перед столкновением); V – разница в скоростях, направленных вдоль линии действия; v1f, v2f – скорости вдоль линии действия после столкновения; xVel1prime, yVel1prime, xVel2prime, yVel2prime – скорости мячей вдоль линии действия и перпендикулярно ей. 7. В момент, когда происходит столкновения мячей должен выполниться фрагмент кода, приведенный ниже. 1 Здесь и далее при описании физики процесса использованы материалы книги: Макар Дж. Секреты разработки игр в Macromedia Flash MX / Пер. с англ. – М.: КУДИЦ-ОБРАЗ, 2004. – 608 с. // Присваиваем переменным значения скоростей шаров по X и Y в момент столкновения xVel1 = ball1.vx; yVel1 = ball1.vy; xVel2 = ball2.vx; yVel2 = ball2.vy; //Вычисляем синус и косинус интересующего угла – между линией действия и осью абсцисс run=ball1.x-ball2.x; rise=ball1.y-ball2.y; Theta=atan(rise/run); cosTheta=cos(Theta); sinTheta=sin(Theta); // Вычисление скоростей шаров вдоль линии действия и перпендикулярно ей. Здесь векторные скорости каждого шара по X и Y проецируются на линию действия. Компонент векторной скорости, который перпендикулярен линии действия, не затрагивается в столкновении xVel1prime=xVel1*cosTheta+yVel1*sinTheta; xVel2prime=xVel2*cosTheta+yVel2*sinTheta; yVel1prime=yVel1*cosTheta-xVel1*sinTheta; yVel2prime=yVel2*cosTheta-xVel2*sinTheta; // Здесь на основе применения законов сохранения импульса и энергии вычисляются скорости шаров вдоль линии действия после столкновения. P=mass1*xVel1prime+mass2*xVel2prime; V=xVel1prime-xVel2prime; v2f=(P+mass1*V)/(mass1+mass2); v1f=v2f-xVel1prime+xVel2prime; xVel1prime=v1f; xVel2prime=v2f; // Возврат к векторным скоростям в исходной системе координат и присвоение соответствующих значений параметрам шаров xVel1=xVel1prime*cosTheta-yVel1prime*sinTheta; xVel2=xVel2prime*cosTheta-yVel2prime*sinTheta; yVel1=yVel1prime*cosTheta+xVel1prime*sinTheta; yVel2=yVel2prime*cosTheta+xVel2prime*sinTheta; ball1.vx=xVel1; ball1.vy=yVel1; ball2.vx=xVel2; ball2.vy=yVel2;