Привет, если ты читаешь эту статью, значит ты хочешь узнать ответ на вопрос «как работает вращение объекта в 2D ?»
Ты скорее всего знаешь что во всех современных движках, таких как Unity вращение осуществляется с помощью функции, но нам интересно, как можно написать алгоритм
вращения своими руками.
Если проще то наш алгоритм работает так.
Мы представляем окружность, где:
- Центр это точка, вокруг которой мы вращаем объект.
- Радиус — расстояние от центра до вращаемого объекта.
Итак, начнем.
Давайте взглянем на рисунок ниже:
Дано: длинна радиуса, координаты точки вращения, угол АОВ, АВ перпендикулярен оси ОХ.
Задача: Задать вращение точки А на 360 градусов с помощью формулы.
Рассмотрим: треугольник ОАВ:
угол ОВА — прямой => треугольник ОАВ — прямоугольный треугольник;
тогда:
гипотенуза = радиусу окружности с центром в точке О
угол поворота = от 1 до 360 градусов
тогда чтобы найти катеты ОВ и АВ нужно:
АВ = радиус * cos(угла поворота),
ОВ = $inline$радиус * sin(угла поворота)$inline$
Теперь когда мы знаем размеры катетов
мы составим формулу:
для координаты по x:$inline$позиция по x = радиус * cos(угла поворота) + начальная позиция по x$inline$,
и для координаты по y: $inline$позиция по y = радиус * sin(угла поворота) + начальная позиция по y$inline$
Давайте попробуем применить формулы:
Не сложно догадаться что делает этот код, а именно вращает наш кружок по оси, но почему лишь один раз?
Давайте вспомним уроки геометрии в седьмом классе: градусная мера угла не может превышает 360 градусов.
А если попробуем обнулять угол вращения, когда тот будет больше 360 градусов, давайте посмотрим что из этого выйдет:
Этот код позволяет вращать кружок по оси бесконечно.
Однако у этой формулы есть один недостаток: можно вращать объекты только на 1 оборот. Это значит что нам нужна другая формула.
Давайте улучшим нашу формулу:
Дано:
треугольник ОАВ — прямоугольный
катет 1 = x1 — начальная координата X
катет 2 = y1 — начальная координата y
Задача:
улучшить формулу так, что-бы можно было вращать точку А на неизвестный угол.
Решение:
Из предыдущей задачи мы знаем что:
$inline$$inline$xPos = (lineLong * cos(a)) + StartPosX$inline$$inline$. => $inline$cos(a) = xPos — startPosX: (lineLong )$inline$
И теперь мы можем вывести формулу по нахождению угла a
$inline$yPos = (lineLong * sin(a)) + StartPosY$inline$ => $$display$$a = arccos((xPos — startPosX): lineLong)$$display$$.
А сейчас обновим нашу формулу и получим: $$display$$xPos = (lineLong * cos(a +b)) + startPosX$$display$$
Теперь у нас есть формула которая позволяет бесконечно вращать точку по окружности: $$display$$xPos = (lineLong * cos(a +arccos((xPos — startPosX): lineLong))) + startPosX$$display$$
Давайте напишем код, который будет вращать наш объект по нажатию на клавишу.
Примерно таком образом решается эта задача.
Надеюсь, ты смог извлечь полезную информацию из моего поста, желаю удачно применить полученные знания на практике
- Практика: физическое моделирование
- Введение
- Моделирование движения материальной точки
- Равномерное движение
- Отражение от стенок
- Равномерная сила тяжести (Равноускоренное движение)
- Центральная сила тяжести (спутник возле солнца)
- Самостоятельное задание 1:
- Самостоятельное задание 2:
- Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали
- Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали
- Исходные данные
- Что будем делать?
- Общий принцип непрерывного движения в Pygame на примере движения вдоль оси X
- Код непрерывного движения объекта в Pygame по горизонтали:
- Непрерывное движение объекта в Pygame вдоль оси Y
- Код непрерывного движения объекта в Pygame по вертикали
- Полученный результат:
- Непрерывное движение объекта по диагонали в Pygame
- Код непрерывного движения объекта в Pygame по диагонали
- 🎬 Видео
Видео:АЛГОРИТМ ДВИЖЕНИЯ ПО ОКРУЖНОСТИСкачать
Практика: физическое моделирование
Видео:Математика это не ИсламСкачать
Введение
В прошлый раз мы с вами научились отрисовывать объекты на экран и освоили такой важный инструмент, как функции.
На этом занятии ваше погружение в gamedev продолжится и вы узнаете, как правильно описать физику и логику программным языком и как связать все эти компоненты воедино.
Не забудьте, что для работы с графикой у вас есть вспомогательная библиотека ( graphics.py ), с помощью которой вы будете отображать объекты на экране. Нужно скачать её и положить в ту (именно в ту) директорию, где вы собираетесь далее писать свои программы.
Моделирование движения материальной точки
Равномерное движение
Подключим библиотеку для работы с графикой.
Начнём мы с такой простенькой задачки. Нужно смоделировать равномерное движение шарика на плоскости. Как же мы это будем делать?
Начнём с описания физической модели. Для моделирования такого процесса, нам достаточно знать 2 физические характеристики шарика: это его положение в пространстве и направление скорости.
Вероятно, вас смущает, что скорость мы описываем с помощью понятия «точка». На самом деле, это абсолютно оправдано, поскольку скорость есть вектор из плоскости. Это гораздо лучше, чем отдельно хранить скорость по x и скорость по y, поскольку подход позволит нам тянуть за собой не две переменные, а всего лишь одну (просто вектор из R^2). Соответственно, нам придётся меньше держать в голове.
Симуляция материальной точки представляет собой непрерывный процесс пересчёта координат по заданным нами законам. Поскольку сейчас мы моделируем обычное равномерное движение, законы пересчёта будут очень просты.
Давайте будем считать, что t равно 1. Тогда все моменты времени отличаются ровно на 1. В таком случае, чтобы получить значения координат в следующий момент времени, нужно к текущим координатам прибавить скорость. Напишем сразу функцию, которая будет возвращать сумму двух векторов.
Эта функция поможет нам не заморачиваться каждый раз по поводу оперции сложения двух векторов и позволит сфокусироваться на более высокоуровневых вещах.
Процесс отрисовки шарика также лучше вынести на отдельный уровень абстракции и оформить в функцию.
Теперь мы вплотную подошли к процессу моделирования и визуализации. Сначала мы рассчитываем координаты шарика, а после отрисовываем его в полученных координатах. И так по кругу, пока мы не захотим прервать этот процесс закрытием окна.
Как видим, мы столкнулись с двумя проблемами. Первое — вся сцена рисуется мгновенно, никаких промежуточных результатов мы не видим, было бы неплохо добавить задержку между кадрами, чтобы мы могли наблюдать эволюцию системы. Второе — мы видим, что на экране остаются изображения шариков в предыдущие моменты времени, от этого артефакта мы бы тоже хотели избавиться.
Давайте напишем функцию, которая очищает экран.
А в основном цикле пропишем команду, которая усыпляет выполнение скрипта на какое то небольшое время
Весь написанный нами пример можно посмотреть здесь.
Отражение от стенок
Давайте усовершенствуем нашу модель. В течение двух секунд шарик покидает область экрана, и мы теряем возможность за ним наблюдать. Для решения этой проблемы добавим упругое отражение шарика от стенок экрана. Это делается очень простым образом. В теле основного цикла добавим функцию, которая будет проверять столкновение, и, в случае такого события, инвертировать скорость шарика по нужной оси.
Равномерная сила тяжести (Равноускоренное движение)
Давайте ещё немного разнообразим модель, добавив в наш 2D мирок силу гравитации. Для этого достаточно написать всего лишь ещё одно физическое правило. Только на этот раз мы будем пересчитывать скорость, а не координаты.
Центральная сила тяжести (спутник возле солнца)
Давайте теперь рассмотрим другую модель: движение материальной точки в поле центральных сил. Несмотря на то, что на первый взгляд задача кажется сложной, нам нужно лишь слегка модифицировать код, чтобы мы могли наблюдать данную модель. Отличие данной задачи от предыдущей заключается в том, что в прошлой задаче ускорение было постоянным, а теперь ускорение будет меняться в каждый момент времени в соответствии с законом гравитационного притяжения.
Добавим следующую функцию:
Как мы можем заметить, наш модульный подход позволил нам внести в наш код минимальные изменения, чтобы решить абсолютно другую задачу. Однако, у приведенного решения есть два узких места. Первое — вы можете заметить, что орбита не подчиняется в полной мере законам Кеплера. Это связано с погрешностью машинных вычислений. Для того, чтобы минимизировать данный недостаток, нужно считать более умным способом, но это относится к области вычислительной математики. Второе — со временем у нас сильно проседает производительность. Это связано с тем, что в цикле while мы постоянно создаем новые графические обьекты в функциях draw_ball() и clear_window() а старые никуда не деваются. Со временем таких обьектов становится много и резко падает производительность.
Для того, чтобы избавиться от этой проблемы, можно объявить обьект только один раз, а потом вызывать один из методов библиотеки graphics.py
Самостоятельное задание 1:
Перепишите код солнечной системы, используя метод move, так, чтобы обьекты не создавались каждый раз в цикле.
Теперь, вы решили действительно полноценную задачу. Надеемся, данная задача доставила вам удовольствие.
Самостоятельное задание 2:
Опираясь на примеры и используя новые инструменты, реализуйте модель математического маятника.
Видео:Графика в Python. Анимация. Передвижение объектов.Скачать
Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали
Видео:Как Работать с Физикой на Python. Доска Гальтона [ Pygame + Pymunk ]Скачать
Непрерывное движение объекта в Pygame вдоль осей X, Y и по диагонали
Как показывает практика, движение — это жизнь! Поэтому сегодня мы вдохнем жизнь в сотворенный посредством Pygame объект и научим его двигаться без учета сигналов с клавиатуры! Для начала мы рассмотрим движение объекта в Pygame по прямой вдоль оси X, затем развернем объект и зададим ему движение вдоль оси Y, и в заключение — оформим диагональное перемещение объекта. Однако сначала предлагаю взглянуть на исходный код.
Исходные данные
Давайте взглянем на исходный код: у нас имеется экран csreen шириной 500px и высотой 300px, а также изображение мыши «mouse.png», расположенное на экране по заданным координатам: mouseX = 0, mouseY = 200:
При запуске кода мы увидим в левом нижнем углу экрана притаившуюся мышку с повернутой вправо мордочкой:
Что будем делать?
Необходимо научить мышку двигаться непрерывно:
- по горизонтали вдоль оси Х
- по вертикали вдоль оси Y
- по диагонали из левого нижнего угла в правый верхний угол
Общий принцип непрерывного движения в Pygame на примере движения вдоль оси X
В настоящий момент для вывода изображения мышки на экран мы используем цикл while (while True: ..) . То есть пока открыто игровое поле, мы осуществляем вывод изображения на экран в цикле по заданным координатам через каждые 30 мс (что определено строкой pygame.time.delay(30)).
В одной секунде содержится 1000 миллисекунд
Так как под движением в Pygame подразумевается перемещение объекта на заданную позицию через определенный промежуток времени, то для смещения мыши на 5px каждые 30 мс, нужно в цикле while увеличивать значение координаты X на 5px. Для этого добавим в исходный код всего 2 строчки: строку с определением переменной скорости speed, в которой будем хранить заданное смещение 5px расположим перед циклом while; а строку, задающее смещение изображение: mouseX += speed расположим в теле цикла while. В итоге получим зеленую поляну с мышкой, бегущей по горизонтальной прямой:
Код непрерывного движения объекта в Pygame по горизонтали:
Непрерывное движение объекта в Pygame вдоль оси Y
Для наглядности, сдвинем начальную позицию мышки ближе к центру, переопределив переменные стартовой позиции, как mouseX=200 и mouseY=200.
В соответствии с описанным выше принципом, зададим объекту движение по горизонтали, только изменять будем координату mouseY. В связи с тем, что точка с нулевыми координатами в Pygame располагается в верхнем левом углу поля, то при движении объекта вверх, значение координаты Y будет уменьшаться на заданное в переменной speed значение: Y -= speed. Однако, прежде чем мы добавим эту строчку в цикл while, предлагаю развернуть нашу мышку мордочкой вправо(т.е. на 90 градусов) с помощью функции pygame.transform.rotate(mouse, 90):
Код непрерывного движения объекта в Pygame по вертикали
Полученный результат:
Непрерывное движение объекта по диагонали в Pygame
При движении объекта по диагонали происходит одновременное смещение как по оси X, так и по оси Y, поэтому добавим в цикл while строки с изменением значений этих координат. Так как мы планируем движение мыши из левого нижнего угла в правый верхний угол прямоугольного экрана, то:
1. Сначала повернем мышь так, чтобы ее мордочка смотрела по направлению движения. Для этого используем функцию pygame.transform.rotate(mouse, 30).
2. Затем подкорректируем стартовую позицию объекта, чтобы повернутое изображение «выезжало» точно из левого нижнего угла: moveX=-13, moveY=218.
3. После этого, в цикле while зададим смещение по оси Х на величину speed: mouseX += speed. Кроме того, определим смещение по оси Y: так как размер игровой сцены 500×300, то при движении к правому верхнему углу поля, смещение мыши по оси Y должно быть меньше горизонтального смещения примерно в 300/500 или в 3/5 раз. Таким образом, определим смещение по Y, как: mouseY -= 3/5*speed.
Посмотрим, как будет выглядеть код после внесенных в него изменений:
Код непрерывного движения объекта в Pygame по диагонали
А теперь посмотрим на получившийся результат:
🎬 Видео
Простая анимация на питоне #программирование #pythonСкачать
Игра на питоне 🎮 #python #программирование #разработкаСкачать
Физика - движение по окружностиСкачать
Равномерное движение точки по окружности | Физика 10 класс #7 | ИнфоурокСкачать
33 Задача: Принадлежит ли точка кругу с центром в начале координат?Скачать
Алгоритмы Поиска Пути на Python. Алгоритм А*, Дейкстры, Поиск в ширину [ Pygame ]Скачать
Анимация непрерывного движения на python #shortСкачать
Функции trunc, floor, ceil. Округление вверх и вниз в pythonСкачать
Физика 10 класс (Урок№4 - Равномерное движение точки по окружности.)Скачать
Игра для изучения Python с нуля, для начинающих программистов #shorts #программирование #pythonСкачать
Сделал игру, на python в консолиСкачать
Красивая таблица на python за минуту! #pycharm #python #программированиеСкачать
Мастер-класс "Моделирование движения космических тел"Скачать
#PYTHON# ДВИЖЕНИЕ КУБИКА НА PYGAMEСкачать
Создание 2D платформера на Python / Изучение библиотеки PyGameСкачать