Статьи

Введение в Verlet.js

verlet-js — это легкий физический движок, созданный Sub Protocol , который вы можете использовать в своих сетевых играх. Если вы увлекаетесь наукой и техникой, вы также можете использовать ее в своих симуляциях. Как следует из названия, verlet-js основан на итеративном методе, называемом интеграцией Verlet, который используется для вычисления поведения объектов в его двумерном мире.

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

Настроить

Для начала загрузите последнюю версию verlet-js с GitHub и включите ее в свою веб-страницу с помощью тега script

 <script src="verlet-1.0.0-min.js"><script>

Поскольку 2D-мир этого физического движка нарисован на canvas

 <canvas width="800" height="300" id="canvas"></canvas>

Инициализация 2D мира

Чтобы инициализировать 2D-мир — вы также можете назвать это симуляцией — вы должны вызвать конструктор verlet-js, который называется VerletJS() Этому конструктору вы передаете размеры canvascanvas

 var world;

function initializeWorld() {
   world = new VerletJS(800, 300, document.getElementById("canvas"));
}

Рендеринг мира

Чтобы нарисовать 2D-мир, вы должны повторно вызывать функцию frame()draw() То, как часто вы вызываете эти функции каждую секунду, определяет частоту кадров вашего мира:

 // The frame rate of the world
var fps = 32;

function renderWorld() {
   world.frame(16);
   world.draw();
   setTimeout(renderWorld, 1000 / fps);			
}

Активировать мир

Теперь, когда у вас есть функции для инициализации и визуализации мира, давайте добавим код, который вызывает их оба при загрузке страницы:

 window.addEventListener("load", function() {
   initializeWorld();
   renderWorld();
});

На этом этапе, если вы попытаетесь запустить эти фрагменты вместе в своем браузере, вы не увидите ничего происходящего в элементе canvas

Добавление предметов в мир

Миры, которые вы создаете с помощью verlet-js, могут содержать только частицы. Тем не менее, вы можете создать ограничения между частицами, чтобы ограничить их перемещение относительно друг друга. Например, используя ограничение расстояния, вы можете заставить две частицы всегда поддерживать фиксированное расстояние между собой. Аналогично, используя ограничение по углу, вы можете заставить три частицы всегда поддерживать фиксированный угол.

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

Формы

В verlet-js есть вспомогательная функция tire() Чтобы создать треугольник, вы можете добавить следующий код в функцию initializeWorld

 world.tire(new Vec2(100,100), 100, 3, 1, 1);

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

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

Вот еще один пример использования tire()

 world.tire(new Vec2(100,100), 100, 4, 1, 1);

И это живая демонстрация результата, который вы получаете:

Помните, что третий параметр, который вы передаете tire()

линии

Чтобы создать отрезки, состоящие из двух частиц, вы можете использовать lineSegments() Он принимает массив объектов Vec2

Вот как вы создаете отрезок, конечные точки которого (100,100) и (150,150):

 world.lineSegments([new Vec2(100,100), new Vec2(150,150)], 1);

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

Полотна

Другая вспомогательная функция, предоставляемая verlet-js, называется fabric cloth() Это позволяет вам создать группу частиц и ограничений, которая ведет себя как кусок ткани. Следующий код показывает вам, как его использовать:

 world.cloth(new Vec2(100,100), 200, 200, 10, 3, 1);

Эта функция принимает довольно много аргументов. В следующем списке описаны все из них:

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

Результат выполнения предыдущего оператора отображается ниже:

Создание пользовательских фигур

Более сложные формы — те, которые не могут быть созданы с помощью вспомогательных функций — могут быть созданы с помощью класса Composite Compositeparticlesconstraints Чтобы добавить частицу или ограничение к Compositepush()

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

 var triangle = new world.Composite();
triangle.particles.push(new Particle(new Vec2(100,100)));
triangle.particles.push(new Particle(new Vec2(100,200)));
triangle.particles.push(new Particle(new Vec2(200,100)));

triangle.constraints.push(
   new DistanceConstraint(triangle.particles[0], triangle.particles[1],2)
);

triangle.constraints.push(
   new DistanceConstraint(triangle.particles[0], triangle.particles[2],2)
);

triangle.constraints.push(new DistanceConstraint(
   triangle.particles[1], triangle.particles[2],2)
);

Когда ваша форма будет готова, добавьте ее в свой мир, используя следующий код:

 world.composites.push(triangle);

Как видите, объект world имеет массив под названием compositesComposite Ниже вы можете увидеть результат, полученный с помощью фрагментов, описанных в этом разделе:

Использование булавок

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

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

 // pins the first particle
triangle.pin(0, new Vec2(100,100));

Закрепляя частицу, вы получаете эффект, показанный в следующей демонстрации:

Изменение гравитации

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

 world.gravity = new Vec2(0.2, 0.2);

Тем самым вы получите такой результат:

Выводы

Благодаря этой вводной статье вы теперь знаете, как использовать verlet-js. Как мы уже говорили, это легкая физическая библиотека для создания упругого и интерактивного 2D-мира, состоящего из частиц и ограничений. Чтобы узнать больше об этом, вы можете просмотреть его код и примеры на GitHub или прочитать руководства, предоставляемые Sub Protocol .

Что вы думаете об этой библиотеке? Вы когда-нибудь использовали это? Что ты создал? Давайте начнем обсуждение.