В этой статье попробуем разобрать принцип работы физических объектов в связке с джойнтами и построить простые весы с их помощью.
Для начала возьмем простую форму весов и разделим ее на два отдельных объекта: основу, которая будет выполнять роль фона, и чаши весов, куда будут помещаться объекты.
Помещаем основу на сцену.
Начнем с создания центра масс. Это объект, к которому будут крепится все остальные составляющие весов. Добавим компонент Rigidbody2D, чтобы сделать его физическим объектом и выставим параметр Body type, в настройках, в режим Static, так как центр масс будет неподвижным.
Далее создаем новый объект в виде длинной платформы. Именно к этой платформе в будущем будут крепиться чаши весом, сама же платформа, в свою очередь, будет крепиться к центру масс.
Важно расположить этот объект точно в центре объекта “центра масс”.
Добавляем созданной платформе компоненте FixedJoint2D, чтобы можно было зафиксировать ее на сцене. Сам компонент FixedJoint2D находится во вкладке Component -> Physics 2D -> Fixed Joint 2D
Вместе с компонентом FixedJoint2D, платформе автоматически добавляется компонент Rigidbody2D и теперь мы имеем полноценный физический объект.
Для начала в настройках компонента Rigidbody2D запрещаем объекту двигаться по осям X и Y, чтобы платформа не опускалась под тяжестью весов, но оставляем ей возможность вращаться.
Теперь переходим к настройкам компонента Fixed Joint 2D. Здесь все достаточно просто – крепим платформу к центру масс, просто перенеся объект в поле Connected Rigid Body.
Далее переходим к следующей части создания весов – креплению чаш.
Переносим основу для создания чаши на сцену и выставляем высоту на которой они будут крепиться под платформой.
Теперь, чтобы прикрепить чашу к краю платформы весов, добавляем ей компонент DistanceJoint2D. Этот компонент, в отличие от компонента FixedJoint2D, позволяет присоединять объекты на определенном расстоянии от точки крепления. Найти компонент DistanceJoint2D можно там же, где и FixedJoint2D во вкладке Component -> Physics 2D -> Distance Joint 2D.
Переходим к настройкам компонентов чаши. Первым делом в настройках компонента Rigidbody2D, запретим чаши вращаться, чтобы не перекинуться.
Далее переходим к настройкам компонента Distance Joint 2D. Чтобы закрепить чашу к платформе, достаточно перенести объект – платформу в поле Connected Rigid Body, как это уже делали раньше с креплением платформы к центру масс.
Как видно на изображении сверху, чаша автоматически присоединилась к центру платформы, а нужно, чтобы соединение было к ее краю. Поэтому с помощью мыши перетаскиваем точку крепления из центра к краю платформы.
Готово, чаша присоединена к платформе. Далее необходимо добавить чаше один из коллайдеров, чтобы на ней можно было располагать физические объекты.
На изображении выше используется полигональный коллайдер PolygonCollider2D, чтобы придать коллайдеру изогнутую форму, но можно использовать и любой другой коллайдер.
Теперь необходимо повторить все эти же действия для второй чаши: также крепим ее к другому краю платформы весов и добавляем коллайдер.
Можно протестировать работу весов и запустить проект.
Если вы проделали все правильно, то чаши должны повиснуть в воздухе равномерно не перевешивая друг друга, так как это главное условие в работе весов.
Сейчас чаши не реагируют на физические объекты, помещенные на них. Это потому, что платформа жестко закреплена к центру масс через компонент FixedJoint2D и не реагирует на то, что в находится в чашах.
Чтобы весы заработали необходимо “ослабить” фиксацию платформы к центру масс.
Возвращаемся к настройкам платформы и ее компоненту FixedJoint2D, где нам понадобится поработать с двумя настройками Damping Ratio и Frequency.
Первый параметр, Damping Ration, регулирует от 0 до 1 значение силы крепления объекта к центру, где 0 означает полную фиксацию объекта, а 1 наоборот – полную свободу объекта. Этот параметр можно сравнить с обычным болтом или саморезом, чем сильней и плотней прикручивать объект саморезом или болтом к поверхности тем слабее он будет поддаваться любому движению. Так как нам нужно чтобы платформа свободно могла вращаться выставим этому параметру значение 1.
Далее параметр Frequency, показывает как сильно объект “стремится” принять исходное положение после совершения какого либо движения. Этот параметр может быть сколько угодно большим, и чем больше его значение тем сильней объект будет стараться принять исходное положение. Для примера поставим значение равное 5.
Теперь можно снова запустить проект и убедиться, что чаши теперь свободно реагируют на помещенные в них объекты.
Меня больше интересует, как создать лабораторные механические весы(такие же), чтобы они были с анимацией, и с точностью показывали вес предметов, которые возложены на ту или иную чашу