— Pixels Commander

[ In English, На русском ]

Может ли компьютер молиться на благо всех живых существ с помощью ReactJS и WebGL

Вы наверно заметили что последние 2 года я не писал в блоге. Извините, я был занят этим исследованием. Давайте сразу договоримся — это не типичная tech статья для демонстрации технических решений (хотя какие-то интересные детали реализации вы тут найдёте). Это — исследование с целью показать, что новые технологии не рвут связь времен и вещи кажущиеся несовместимыми, находящиеся в невообразимо далеких культурных координатах все равно могут касаться и прикосновение это красиво, несет добро. Для меня лично это исследование особо значимо. История началась десять лет назад, когда друг — буддист предложил сделать мобильное приложение для молитвы. Так поднялось огромное количество вопросов на которые стоило найти ответ прежде чем можно было бы ответить на главный: «Может ли компьютер молиться во благо всех живых существ?”

Вступление

Молитва… Что может быть более далеким от технологий? В большинстве религий: христианстве, исламе, индуизме молитва — это выполнение обрядов для общения с богами и получения от них желаемого. Буддизм же ставит целью молитвы избавление от страданий, просветление и что очень интересно — сам молящийся создает блага для всех живых существ в мире. Сострадание, помощь, забота, добрые пожелания — это то что порождают буддистские молитвы и обряды. И если прочие религии можно сравнить с клиент/серверной архитектурой, где бог является сервером и раздает блага — то буддизм предполагает децентрализованную p2p среду, где ценности генерирует каждый молящийся человек и не только человек…

Машины для молитвы вчера и сегодня

Молитва с помощью вычислительной машины? “Странная, киберпанковая идея”, — подумаете вы. Однако в тибетском буддизме уже много веков существуют несколько видов машин для молитвы. Самыми известными из них являются молитвенные барабаны, которые широко распространены в современных Китае, Непале, Индии, Бутане. Их время и место появления доподлинно неизвестно. Легенда гласит что молитвенные колеса принес в мир людей мастер Нагарджуна из своего путешествия в подводный мир драконоподобных существ — наг.

Изображение Наги на стене хижины в деревне Чусан, Верхний Мустанг, Непал

Некоторые исследователи считают барабаны наследием древней до-буддистской религии Бон существовавшей в Тибете с начала нашей эпохи. Другие ссылаются на первые письменные упоминания молитвенных колес встречающихся в писаниях монастырей на границе Индии и Непала и датируемых 11 в. н.э., когда эти машины уже были устоявшейся традицией. Профессор Грегори Схопен перевел один из таких текстов написанных монахом под именем Vipulashrimitra жившего в 11в в буддистском университете Наланда (по преданию там же учился Нагарджуна)

From continuous effort the Perfection of Wisdom Sutra constantly revolves in the great temple of the Avalokiteshvara, by means of the book case constructed by Vipulashrimitra, and he installed four images in the alms-houses on the holidays.

Типичный молитвенный барабан — это металлический или деревянный полый цилиндр, установленный на оси. На наружной стороне барабана выгравирована 6-ти слоговая мантра милосердного Будды:”Ом ма ни пад ме хум”, а внутри расположены письмена с этой же мантрой которых может быть от сотни в маленьком ручном барабанчике до миллиона текстов мантры в больших, стационарных.

Prayer Wheel schema

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

Тибетский трактат именуемый «Мани Кабум» 17 в. — Молитвенное колесо похоже на волшебный камень: что бы вы ни пожелали, колесо поможет вам достигнуть этого.

Лама Зопа Ринпоче (ученик Далай Ламы, глава фонда сохранения традиций Махаяны) — установка молитвенного колеса может полностью изменить место. Оно становится умиротворяющим, спокойным, благим для разума. Все живые существа в месте установки колеса избавляются от страдания перерождения в нижних мирах.

Лама Жигдал Дагчен (верховный лама тибетского монастыря Сиэттла) — Вращение молитвенного колеса очищает наше тело, душу, речь и сознание.

Будда Шакьямуни (в сутре Великая Река) — Вращение молитвенного колеса один раз создает больше благ, чем несколько лет медитации.

Барабаны бывают нескольких видов. Как вращаемые человеком, так и приводимые в движение энергией ветра, воды и даже огня.


Пожилой человек вращает ручной молитвенный барабан на главной площади Ло Мантанга, столицы Верхнего Мустанга


Стационарный молитвенный барабан в стене монастыря Кагбени, Верхний Мустанг, Непал


Водяное колесо в храмовом комплексе, Мухтинат, Непал

Молитвенные колеса — практика которую используют и в которую верят миллионы людей, неодушевленный предмет, машина которая превращает механическую энергию вращения в трансцендентную энергию молитвы, несущую благо вращающему и всем живым существам. Повторимо ли это с цифровой машиной, компьютером? Может ли компьютер преобразовывать электрическую энергию в духовное послание меняющее мир?
Молитвенное колесо было моей единственной зацепкой в исследовании и было важно понять как же работает практика. Я начал с тематической литературы. Удивительно, но такой интересный феномен описан западными авторами очень ограниченно. Первая книга которая попала ко мне написана в 1896 году англичанином Вильямом Симпсоном по мотивам его путешествий в Тибет и Непал.

Это объёмный труд про круговые движения в религии и обрядах который нелегко читать из-за викторианского английского, но интересно наблюдать изумление автора от только что открывшихся западу феноменов буддизма. Именно Симпсон вводит термин «машина для молитвы» видимо под влиянием недавно завершившейся у него на родине промышленной революции. Книга подробно описывает все типы колёс как вращаемые людьми ручные и стационарные, так и вращаемые силой ветра, воды или огня. К сожалению работа Симпсона мало затрагивает духовный аспект использования колёс, что не позволяет делать выводы о возможности самостоятельной молитвы компьютера. На помощь пришла другая работа написанная нашим современником Lorne Ladner, живущим в Вашингтоне.

Wheel of great compassion book cover

Целью своей работы он ставит популяризацию практики и описание духовной составляющей. Интересно, как на примере этих двух книг прослеживается путь пройденный буддизмом в западной культуре за последние 100 лет — от экзотической диковинки до полноценно принятой обществом религии в популяризацию которой оно вкладывает свои силы. Книга Lorne стала настоящей находкой, она описывает как работает практика, в ней же тексты древних лам описывающих молитву с помощью колеса. К моменту прочтения я уже имел небольшой опыт использования колеса и интуитивно найденный мной способ вполне совпал с описываемым в тибетских текстах. Из них же стал ясен важный аспект — если водяные или ветряные молитвенные колёса работают сами по себе, и считаются артефактами очищающими пространство — то колеса вращаемые человеком — это духовная практика в которой молящийся вращает барабан, прося о милосердии ко всем живым существам, сострадая и желая им счастья, свободы и избавления от страданий. Барабан в этой практике — это визуализация и точка фокуса.

Визуализация? Я могу это сделать на JavaScript!

Визуализация? Я могу сделать ее на JavaScript! Тем более его святейшество Далай-лама объявил, что мантра на экране компьютера работает также как и традиционная, а с технической точки зрения я был полностью уверен в успехе после нескольких лет разработки React + WebGL приложений.

Путешествуя по Азии я видел много молитвенных колёс, специально отмечал используемые материалы и эстетику и точно знал что мне понадобиться для создания open source колеса на WebGL которое было бы достойной визуализацией практики.

Praying Wheel no textures

Мне были нужны physically based rendering и хороший 3D художник который, как водится в разработке 3d приложений, на 70% ответственен за качественное графическое исполнение. На моё счастье PBR был под рукой — в Babylon.js есть отличная имплементация из коробки, а через несколько недель нашёлся опытный художник из Москвы, регулярно зимующий в Азии и не понаслышке знакомый с молитвенными колёсами. Это было важным требованием — художник должен знать детали оформления молитвенных колёс, ведь аутентичность важна как бы не более, чем эффектный вид.

Стейт менеджмент

Для управления состоянием приложения я решил не использовать тяжеловесные Redux / MobX, а воспользоваться широко освещаемым в последнее время ContextAPI о чем мне пришлось сначала пожалеть из-за необходимости писать ощутимое количество бесполезного низкоуровневого кода, а затем и порадоваться разработав свою обёртку для контекста которая позволяет менять данные в спейте приложения так же просто, как значения полей в JS объекте при этом не добавляя бесполезного кода. Получилось лаконичное и очень простое решение для стейт менеджмента небольших проектов, приглашаю оценить.

Взаимодействие

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

Rotating next to edge of a wheel projection on the screen results in larger rotation angle for the same number of pixels passed by finger on the screenУгол A почти в два раза меньше угла B при одинаковой проекции на плоскость экрана.

Для решения задачи используем достаточно простую тригонометрию.

Если при касании центра барабана touchPosition = 0, а при касании края touchPosition = 1, то угол от центра к точке касания это acos(touchPosition) соответственно зная угол касания на предыдущем кадре можно вычислить скорость oldTouchAngle — newTouchAngle. Повторяем это в каждом кадре.

Touch angle calculation code

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

Где 0.2 определяет качество сцепления и при замене 0.2 на 1 скорость будет передаваться от пальца барабану мгновенно. C правильным расчетом скорости вращения, добавления LERP и трения получилась реалистичная и детально проработанная физическая модель.

Со стороны же графики сказалось отсутствие у художника опыта работы с Babylon, приходилось вместе разбираться в аспектах экспорта материалов что заняло ещё несколько недель, но результат соответствовал ожиданиям.

Знакомьтесь — первое в мире молитвенное колесо на Web технологиях.

К тому же open source. Все принятые пулл реквесты автоматически деплоятся на сайт. Хотите добавить боковое меню настроек, выбор фоновой картинки или традиционную тибетскую музыку? Добро пожаловать!

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

Экспедиция

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

Lo Manthang, Nepal map

Из-за необходимости получать разрешение у правительства Непала и короля Верхнего Мустанга только 300-400 туристов посещают регион ежегодно, что меньше чем бывает ежегодно на пике Эвереста! И именно там в Ло сохранился первозданный тибетский уклад жизни и до сих пор работают буддистские монастыри основанные в 8 — 10 веках. Давайте послушаем что говорят монахи монастыря в Ломантанге о молитвенных колесах, и что думают о молитвенном колесе разработанном на JavaScript.

Заключение

Миллионы людей в мире используют машины для молитвы — молитвенные колеса, как приводимые в движение физической силой человека, так и работающие без его участия. Может ли компьютер быть машиной для молитвы? Так как его святейшество Далай Лама объявил силу мантры на экране компьютера эквивалентной силе мантры нанесенной на традиционные материалы вы можете молиться с помощью компьютера, с помощью приложения написанного на  JavaScript. Автоматически вращающийся барабан на экране будет “молиться” без участия человека, очистит пространство и карму находящихся рядом живых существ, что можно считать молитвой компьютера.

P.S.

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