Существуют ли среди читателей люди, которые хотя бы краем уха слышали, что есть некий 3D движок для разработки WebGL приложений с редактором, похожим на Unity, только в браузере? Тема крайне непопулярная, но я стал одним из таких людей почти 2 года назад. И теперь мне захотелось поделиться накопленным опытом, скорее даже моими разочарованиями. В статье пойдёт речь о проблемах, с которыми Вам придётся столкнуться, если начнёте пользоваться этим редактором. Сразу оговорюсь, что не буду сравнивать с другими существующими 3D движками вроде Three.js или Babylon.js, коснусь только самого редактора и скриптового API.


Всё онлайн


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


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


В общем, для командной работы редактор совершенно не пригоден.


Решения этой проблемы я до сих пор не вижу.


История изменений


До недавнего момента я очень страдал от того, что нельзя подключить проект к какому-нибудь гиту. Когда-то это можно было сделать (только для скриптов), но теперь эта функция считается legacy, т.к. ребята переписали в какой-то момент Scripting API.


Однако! В очередной раз, нажимая Ctrl-S в редакторе, я увидел такую картину:



Ого, да это замашка на собственный git?


Окей, одна проблема вроде как решилась. Работает пока так себе, но хотя бы можно откатиться, что немаловажно. И даже создавать бранчи. Придётся привыкать, в общем.


Шейдеры


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


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


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


В-третьих, шейдеры не видно в редакторе.


Вообще, в редакторе только 2 материала: стандартный PBR и Фонг. Из приятного — можно выбрать пайплайн бликов между metalness и specular.


Вот как я вижу решение проблемы:



вот сюда можно добавить третью опцию Custom, куда можно загрузить файлы с кодом шейдеров, которые можно достаточно просто распарсить и вытащить все переменные uniform и автоматически передавать их в шейдер при изменении. Это же так просто! Единственное, над чем придётся подумать, что vec3/vec4 — это не только вектор, но ещё и цвет.


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


Скрипты


Я понимаю, почему редактор имеет скудный набор функций. Но это можно было бы решить исполняемыми в редакторе скриптами. Достаточно добавить одну галочку, которая будет включать использование скрипта внутри редактора. Он ведь тоже написан на playcanvas-engine, почему нет?


Пример из жизни.


Мне как-то понадобилось сгенерировать террейн из карты высот, подобной этой



Окей, не каждому нужна такая функция в редакторе, я разобрался с тем, как манипулировать вертексами обычного плейна на уровне CPU (т.е. с помощью JS, а не вершинного шейдера) и написал скрипт, который принимает карту и выдаёт годный террейн. Но в редакторе-то его не видно! Как на него домики и деревья ставить? Это первый пример, который пришёл в голову.


Редактор кода


На момент написания статьи редактировать код можно только онлайн, а в качестве редактора выбран CodeMirror версии 5.19.0. Не знаю, какая версия была 2 года назад, но есть ощущение, что он ни разу не обновлялся. Ведь это версия сентября 2016 года.


Не стоит ожидать от неё чего-то сверхъестественного. Придётся отказаться от привычных Sublime-Atom-VSCode. Есть пара хоткеев и поддержка мультикурсора, но на этом всё. Даже в файлах шейдера нельзя закомментировать строку с помощью Ctrl-/. Вообще, для GLSL нет совершенно никаких удобств. Печалька.


Модели


Редактор поддерживает только 3 типа моделей, судя по документации:


Models e.g. FBX, COLLADA, obj

Но! Почему-то нельзя загрузить glTF в редактор, хотя уже давно есть готовый загрузчик, при чём, от самих разработчиков редактора. И да, его можно использовать вместе с движком, если вы мазохист любите Three.js.


ООП


Плохие новости.


Что ж, по порядку:


ES6


Чтобы редактор не ругался, необходимо добавить в начало файла следующее:


// jshint esversion: 6

Но редактор всё равно ругается


С какой стати?


На форуме разработчики явно дают понять, что поддержки классов даже не планируется. Хотя, это 16-17 год, тогда это действительно было актуально. Надеюсь, что-то поменяется в сознании разработчиков.


Файлы


… парсятся по одному. Это значит, что определив базовый класс в одном файле и унаследовавшись от него в другом, вы получите ошибку:



При этом, сама сцена работает нормально. Не удивительно, ведь браузер учитывает все файлы в отличие от парсера скриптов...


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



Я пытался переопределить базовый ScriptType, чтобы создавать скрипты, наследуясь от него. Сдаюсь, это совершенно бесполезно. Если копнуть глубже и посмотреть как устроен парсер скриптов в редакторе, можно обнаружить фейковый метод для определения атрибутов:


Спойлер


ну и в таком духе


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


Итог


В общем, проблем у редактора хватает и они довольно серьёзные. Для коммерческой разработки крайне не рекомендую. Но всё равно буду его любить, потому что альтернатив нет.
Я даже пробовал написать свой оффлайн редактор на основе Electron и открытого playcanvas/engine, но энтузиазма хватило только на месяц работы. Может, когда-нибудь продолжу, ведь каждый раз, возвращаясь к этому движку хочется взять и сделать всё по-своему.


P.S.: Как вообще, тема-то интересная? Нужны какие-нибудь туториалы по движку, по шейдерам, по скриптам..? Может, про VR/AR на этом движке что-то рассказать?

Комментарии (6)


  1. alexesDev
    02.09.2019 12:28

    Есть
    https://godotengine.org/
    https://www.defold.com/
    И тп. нормальные под популярные платформы (web в том числе). Зачем было использовать что-то только под webgl?


    1. Disorrder Автор
      03.09.2019 19:19

      Да, знаю о существовании этих движков. Дело в том, что политика нашей компании и требование заказчика — разработка исключительно под веб.
      Я так же сталкивался с приложениями, портированными из Unity и они не устраивали заказчика своей производительностью и рендер отличался от десктопного приложения. Не знаю, с чем это связано, я в юнити не эксперт.
      В первую очередь мы нацелены на мобильный браузерный AR/VR, так что defold точно не подходит, а godot не решает наши задачи. Уж лучше юнити тогда сразу)


  1. raamid
    02.09.2019 14:32

    Как-то делал компиляцию из Unity в WebGL. Работало, но глубоко не копал. Чем этот вариант не устраивает?


    1. Disorrder Автор
      03.09.2019 19:21

      Продублирую ответ из комментария выше:


      Дело в том, что политика нашей компании и требование заказчика — разработка исключительно под веб.
      Я так же сталкивался с приложениями, портированными из Unity и они не устраивали заказчика своей производительностью и рендер отличался от десктопного приложения. Не знаю, с чем это связано, я в юнити не эксперт.
      В первую очередь мы нацелены на мобильный браузерный AR/VR, так что лучший вариант — использовать нативный инструмент на выбор из 4 пока: Three.js, A-Frame (обёртка над three), Babylon.js или Playcanvas. Последний самый приятный, как по мне.


      1. raamid
        04.09.2019 00:51

        Спасибо, тема интересная. Сам недавно ковырял Three.js удивило что нельзя задать параллелипиед координатами углов, только центр и углы поворота. Пришлось писать кастомную функцию для этого дела, заодно реализовал произвольную ориентацию параллелипипеда с указанием центров противоположных граней — нужно для длинных «палок».
        Насчет playcanvas — не боитесь связываться с облачным сервисом? Как говорится, дай бог ему здоровья, но если что-то с ним случится, не получится так что годы работы будут потеряны, или есть варианты экспортировать проект под другие платформы?


        1. Disorrder Автор
          05.09.2019 09:25

          У них есть платная версия за $15, которая позволяет self-hosting на своих серверах и за $50, которая позволяет скачивать билды, которые можно хранить оффлайн и потом с них восстановится, в случае чего.
          Но это, конечно, не совсем то, потому я и хочу оффлайн редактор настолько, что готов сам его сделать :)

          А про палки, есть scale, тут выдумывать ничего не надо особо. Только если у параллелепипеда нужно сделать рёбра не перпендикулярными друг другу. И то в таком случае лучше отдельно замоделить.