Make Floating Rocks with the Power of Math

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

The thing we’re going to build

Я только что построил этот инструмент, однако все что находится в сцене (модели и текстуры) сделаны моим другом Jon Riley, и я буду использовать это в качестве примера, чтобы показать, что вы можете сделать сами. (видео смотрим на оригинальной стр. туториала)
Это довольно просто на самом деле. Давайте посмотрим на большой камень. Как вы можете видеть ниже, он делает некоторые, очень медленные и волнообразные повороты, так же немного «подпрыгивает».
(на оригинальной странице 2 видео показания анимации камней с разной скоростью, смотрим их там)
Давайте рассмотрим его отдельно. Как вы можете видеть на ускоренной версии видео, вращение этой породы в основном неопределенное движение, в сочетании с некоторыми вертикальными «подпрагиваниями». Первый тип движения более интересен, так что давайте рассмотрим его в первую очередь.

Swivel those rocks!
Первое что есть у этого камня, поворот вокруг своей точки, хотя в данном случае можно думать об этом как поворот вокруг своей оси. Вот визуальная иллюстрация математики которую мы будем использовать. (видео на оригинальной стр)
Чтобы начать работу с этим, давайте сначала создадим вектор вращения в Construction script вашего Blueprint. Если вы обратили внимание на видео в начале этой страницы, вы заметили, что в настройках не указывается vector input, а просто плавающая точка для указания угла поворота. Для того чтобы получить вектор поворота, мы должны сделать следующие математические действия:

Image

[свернуть]
Я добавил некоторые заметки, так что я надеюсь что вы сможете лучше понять что делает данный граф. Переменные X/Y являются редактируемыми переменными, которые ваш дизайнер уровня может использовать, чтобы настраивать BP. Поворотная ось у нас является X/Y. Мы будет чередовать локальные пространства X/Y осей на каждом кадре по чуть чуть, чтобы получить хорошее волнистое движение.

It’s no Sine to enjoy maths!

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

Image

[свернуть]
Другая точка зрения. Это то что дизайнеры уровни получают с помощью вашего инструмента, это является периодом вращения. То что показывает изображение, чтобы выполнить полный цикл действия, необходимо время. Я решил использовать период, потому что это будет удобно для людей использующий ваш инструмент. Всегда продумывайте удобство пользования вашим инструментом! Чем меньше вам необходимо объяснять как работает ваш инструмент, тем лучше, но и может потратить больше времени на разработку.
Вот вычисления, которые создают поворотное движение:
Image

[свернуть]
Теперь все в порядке. Не пугайтесь, на самом деле все просто, давайте разберем это по кусочкам.

On Tick and the illusion of smooth movement

Прежде всего, что такое Tick ? Tick это событие которое вызывается движком на каждом кадре, который визуализируется. Это распространенное заблуждение, что какие либо вещи в игре происходят плавно и постоянно. Истина же заключается в том, что все происходит поэтапно. Очень маленькие шаги, да, но все таки это шаги. Например, если ваша игра работает в 60 FPS, это означает что применяется 60 шагов ко всему, каждую секунду. Игровые двигатели обычно работаю следующим образом:
Во первых, вся логика выполняется. Например, движущиеся объекты, пули летящие вперед или игрок. Все это обрабатывается движком и визуализируется на экране. И так происходит каждый кадр до тех пор пока приложение не будет закрыто.
Таким образом, игры действительно только создают иллюзию движущихся вещей. Так же как фильмы! Хотя возможно я единственный человек который считает что 24 fps для фильмов это на самом деле мало. Я надеюсь что славное будущее VR фильмов, изменит эту привычку.
Так или иначе, вернемся к математике. Давайте просто рассмотрим одну из частей графа в отдельности.

Image

[свернуть]
«Delta seconds» -ы кстати, это время в реальном мире, прошедшее между Tick и этим моментом. Это здорово если вы хотите чтобы ваши объекты двигались вне зависимости от частоты кадров. Здесь, первая часть математики что мы делаем, мы умножаем delta seconds с 360 таким образом говоря, что одна секунда равна 360 градусам вращения. Затем мы делим это на поворотный период, который как вы уже догадались это период (см, синусоидальную терминологию выше) в течении одного полного цикла. Результат: мы получаем кол — во градусов, на которое должен повернуться меш в этот Tick, если он имеет указанный период вращения.
Следующая часть является довольно распространенной: мы берем наш предыдущий результат и меняем значение переменной Current Swivel на наш результат. Мы хотим чтобы это значение постоянно возрастало, поэтому мы должны принять вращение кадра, и добавить к нашему текущему вращению. Таким образом идет просчет не зависящий от частоты кадров. Аккуратно, да ?
Теперь вы можете задаться вопросом, что это за нода со знаком процента ? Это «modulo» нода.
Если вы вспомните элементарную школьную математику, когда вы делили вручную, иногда делимое не было кратно делителю, вы получали результат и остаток. Если кратко: инпут A мы делим на инпут B и результатом получаем остаток от деления. Пример: 13/10=3
В этом случае мы используем его, для того чтобы вращение продолжалось, если вращение достигает 360 градусов. Это не заметно в игру, но это довольно хорошее решение, потому что цифры в какой то момент станут слишком высокими, и вы можете столкнуться с ошибками. Давайте не связываться с этим прямо сейчас.

Doing something with all this math stuff we so bravely calculated

Image

[свернуть]
Разве это не выглядит знакомым ? Если нет, проверьте выше! Мы уже использовали RotateVectorAroundAxis функцию в Construction script. Здесь, вместо того, чтобы использовать верхнюю координатную ось, как в векторе, мы используем повернутый вектор, который мы создавали из угла конуса в начале Construction script, и вращаем вокруг локальной оси координат. Это делает вектор поворота точно таким как в примере выше с двумя стрелками.
Следующим, что вам возможно будет интересно узнать: «Make Rot from XY». UE4 имеет целый ряд «Make Rot from» функций, и для понимания что они делают, вы должны сначала немного понять о том, что такое Rotator и о системе координат. Если вы уже знаете все эти вещи, просто пропустите и переходите к следующей секции.

A few worlds about vectors, rotators and transforms

Давайте поговорим о Rotator -ах в первую очередь. В Blueprint, Rotator (окрашен в светло-голубой цвет, это «провод» идущий из ноды Make Rot на скриншоте выше) состоит из трех компонентов: Roll, Pitch, Yaw. Roll это вращение вокруг оси X, Pitch это вращение вокруг оси Y, соответственно Yaw это вращение вокруг оси Z.
По умолчанию, UE4 считает ось X как вперед/назад, ось Y как вправо/влево, а ось Z как вверх/вниз. Rotator-ы просто количество градусов на которое нужно повернуть что либо. При этом учитывается изначальный поворот меша.
Вы можете спросить «Почему бы просто не использовать векторы ?». Объяснение этому довольно — простое — позвольте мне это показать!

Image

[свернуть]
Подумайте о этой маленькой синей стрелке как о векторе, который указывает направление персонажа. Но достаточно ли в этом информации для определения поворота вашего персонажа ? К сожалению нет. Присмотритесь:
Image

[свернуть]
Сейчас, стрелка указывает в точно таком же направлении, однако мы видим, что персонаж все же перевернут, и стрелка показывает нам недостаточно информации о повороте персонажа. Векторы очень помогают в указании местоположения или направления, но нам для нашей задачи нужно немного большее, поэтому и лучше использовать Rotator-ы.
Именно поэтому каждый актор и объект, который существует в игровом мире, имеет то что называется «Transform». Трансформации довольно хорошо и аккуратно работают. В коде, они обычно представлены как 4х4 матрицы, которые… Стоп, не убегайте! Математика просто хочет быть вашим другом! И не волнуйтесь, в Blueprint это намного проще: Transforms представляют собой местоположение, поворот, и масштаб объекта или актора. Очень удобно, поскольку вы можете использовать это для любых предоставленных преобразований. Вы можете произвести как одно преобразование, так и сразу несколько, это очень удобно.
Так же вы возможно встречали упоминания о «Relative» и «World» пространства. Если это не очевидно, то «Relative» это система координат с учетом изначальной позицией объекта, то есть если вы передвигаете объект, его сдвиг начнется от его текущей точки. При «World» координатах, вы сразу указываете положение объекта в мире, без учета его текущей позиции. Так же любое местоположение объекта, учитывается в «мировых» координатах.

Make Rot from what ?

Хорошо, теперь, когда вы поняли все что выше и обновили свои знания, что же делает Make Rot ? Проще говоря, они позволяют задать один или два вектора оси, а так же создать Rotator основанный на этих осях. Можно сделать Rotator из оси X, и использовать это для собственных нужд, как мы сделали это выше. Однако один вектор не дает хороших или лучших результатов. В то время как UE будет пытаться угадать, что вы имеете в виду (в случае Make Rot из X, он будет думать что Up вектор, является (0,0,1) и это желаемый для вас вектор, даже если это не так). Однако вы можете сделать более точное управление, путем обработки двух векторов вместо одного. А именно, сделать Rot от XZ например, и тогда будет создан Rotator с учетом Up вектора, и будет гарантия что актор вращается вокруг этой оси, и с учетом сдвига по оси X.
Побочное примечание: это все означает, что два входных вектора не должны быть перпендикулярны — первый берется в качестве направляющей, а второй аппроксимируется настолько близком, насколько это возможно. За исключением случаев когда он вообще не приближается, но точная математика — это все куча тригонометрии, о которой нам не нужно беспокоится сейчас.
Итак, чтобы освежить память не прокручивая вверх, мы говорили вот об этом:

Image

[свернуть]
Как мы уже поняли выше, Output-ы этих двух Rotate Vector-ов, с течением времени, а именно с течением длительности нескольких тиков — описывают 2 вектора, которые выполняют поворотное движение нашего камня. И для дизайнеров есть определенный простор в плане настройки нашего инструмента. Поскольку можно менять это движение по оси X и Y соответственно. Ну и в конце мы взяли эти две оси, и сделали из них Rotator.
А так как скорость и угол двух движений отличаются друг от друга, это дает нам хороший естественный визуальный эффект. И кажется что анимация не зациклена.
Теперь все что осталось сделать, это соединить Output функции Make Rot from XY, с нашей относительной функцией поворота для меша камня, и нажать Play или Simulate, чтобы увидеть результат нашей работы.

Original page


Читайте также: