Разработка интерактивной 3D симуляции для выполнения лабораторных работ по аналитической химии, ч2

Для демонстрации возможностей лаборатории был выбран эксперимент титрование. Титрование — это процесс определения вещества Х постепенным прибавлением небольших количеств вещества Т, при котором каким-нибудь способом обеспечивают обнаружение точки(момента), когда все вещество Х прореагировало, то есть метод количественного или массового анализа, который основан на изменении объема раствора реактива(или титранта Т) точно известной концентрации, расходуемого для реакции с определяемым веществом. Почему был выбран именно этот вид эксперимента? Потому что реакции, используемые в титриметрическом анализе, должны отвечать следующим требованиям:

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

  2. Реакция должна протекать количественно, т е практически до конца. Равновесие в системе должно быть полностью смещено в сторону продуктов реакции. Данная особенность титрования никак не влияет на сложность реализации, единственное — необходимо реалистично создать переход цвета от базового к финальному, однако этот момент присутствует в титровании вне зависимости от объема участвующих жидкостей.

  3. Реакция должна протекать быстро, чтобы в любой момент титрования равновесие устанавливалось практически мгновенно. Иногда для ускорения достижения равновесия растворы нагревают или вводят в них катализаторы. С программной точки зрения длительность реакции будет зависеть от мощности компьютера, а значит она и будет происходить незаметно для глаза(кроме старых и древних компьютеров, но это уже не вина разработчика).

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

Для большей реалистичности к материалу были дописаны кастомные скрипты, которые позволили жидкости колебаться в зависимости от наклона объекта на сцене и выливаться из одного предмета в другой. Процесс колебаний основывается на данных о состоянии родительского объекта, которые берутся из компонента Transform(родительским объектом будем считать тот, к которому привязан скрипт).

Скрипт обращается к полям transform.position и transform.rotation, чтобы знать изменил ли родительский объект свою позицию или угол наклона. Далее полученное значение(оно находится в диапазоне от 0 до 1) масштабируется к диапазону от минимально возможного уровня до максимального и присваивается материалу-жидкости.

Процесс выливания сделан более интересно — скрипт, используя имеющееся количество жидкости(от 0 до 1), высчитывает максимальный угол наклона, при котором эта жидкость будет еще в сосуде(назовем это значение «максимальным углом наклона»). Далее программа сравнивает описанные выше данные о наклоне родительского объекта и «максимальном угле наклона» и, если родительский объект наклонен сильнее, чем возможно, то жидкость убирается.

Далее была создана следующая итерация скрипта, которая позволяет объектам, в которых есть или может быть жидкость, взаимодействовать друг с другом. Для этого на самый верх колбы(точнее, на отверстие, из которого выливается или куда вливается жидкость) был добавлен компонент “Box Collider” с включенным триггером.

Когда два коллайдера соприкасаются друг с другом, то срабатывает событие OnTriggerStay(), в котором сначала проверяется с каким объектом взаимодействует колба и, если это не колба, а, например, стол или пол, то работа метода завершается. Если второй объект оказывается также колбой или местом, куда можно перелить жидкость, то к количеству жидкости в нижнем объекте прибавляется перелитое количество жидкости из верхнего.

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

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

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

Читайте следующие статьи, ставьте лайки, комментарии и ждите новых публикаций!