Category: технологии

Category was added automatically. Read all entries about "технологии".

Барахолка идей

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

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

Вот например сценарии.

Этот пришел мне в голову очень давно, еще в школьные годы, когда я играл в одну из тех компьютерных игр, где приходилось часто сохраняться и загружаться, пытаясь выполнить задачу. Были ли это Проклятые Земли, где я раз по десять загружался, пытаясь убить гораздо более сильного противника одним ударом "со спины в голову"? Или ранняя колда, в которой запоминал, куда с упреждением бросить гранату чтобы убить пачку только что народившихся фашистов?.. Все это наталкивало меня на мысль - ведь герой, получается, своего рода провидец! Или путешественник меж параллельных миров, умирающий тысячи раз на разных вероятностных рельсах, но умеющий найти наконец ту невероятную линию, на которой он чудесным образом всегда достигает успеха, увернувшись от мириады опасностей. Он делает, порой, необъяснимые и чудаковатые вещи со стороны гипотетического наблюдателя, но парадоксальным образом побеждает. К счастью, совсем недавно эту идею воплотили в сценарии фильма Грань Будущего. Но я вижу в ней и больший потенциал, в первую очередь, разумеется, в компьютерных играх. Что если сама возможность сохранения и загрузки станет частью мира игры и его сеттинга, а не мета-игровым инструментом?.. Так родился концепт Пророка.

А вот другая идея, тоже о путешествиях во времени и линиях истории. Я, вообще-то, не очень люблю этот жанр, но почему-то привиделось следующее: фальшивые времена.

Опять же в развитие первой идеи, более конкретный сценарий для сетевой компьютерной игры, вдохновленный просмотром трилогии Властелина Колец и Хоббита: Пробуждение героев.

Это только начало, дальше постараюсь привести в читаемый вид еще около дюжины различных концептов. Stay tunned, как говорится.

GPU Marching Cubes в Unity

Я давно искал способ повысить интерактивность виртуального мира при помощи изменяемого ландшафта. Воронки в ландшафте от взрывов в Worms3D и тоннели в марсианской почве Red Faction впечатляли еще много лет назад, но я всегда хотел видеть подобное и в других играх и в более крупном масштабе. Но увы, антураж игр по сей день остается все таким же застывшим и декоративным, хоть и прибавил пикселей в разрешении.

Существует очевидная возможность изменять геометрию ландшафта путем модификации карты высот по которой он построен. Но такой метод имеет очевидные топологические ограничения так как заперт лишь в одном изменении и поэтому годится лишь для небольших ям и насыпей. Вот когда я обнаружил в одном блоге демонстрацию геометрического шейдера, строящего сложную поверхность из поля по алгоритму marching cubes, я  почувствовал, что реализовать подобное теперь и в моих силах. Как я потом выяснил, существует фантастически крутой проект Voxel Farm который реализует именно эту технологию, создавая бесконечный процедурный измеряемый мир с фотореалистичной графикой. Но несмотря на это, попыток применения такой технологии в играх до сих пор еще нет. Первая серьезная попытка, насколько мне известно, это очень любопытный проект SOE: Everquest Next. В нем некоторые участки воксельного мира будут доступны игрокам для изменения. Однако я предчувствую, что ничего кроме декоративных изменений в игру он не привнесет, хотя и это уже большой шаг навстречу физически достоверному миру.

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

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

Спасибо NVIDIA за бесценные уроки и примеры реализации этого алгоритма на GPU. Оставалось его реализовать в Unity, используя Compute Shader'ы. Это потребовалось мне для того, чтобы вывести информацию о вершинах в область памяти, доступную центральному процессору, рассчитывающему коллизии и физику тел. Обычный геометрический шейдер, реализацию которого я встретил в сети, для такого трюка годился плохо. Затем я добавил разбиение пространства на мега воксели, «чанки», чтобы создавать поле в любом объеме, и написал модификаторы поля для воздействия на него. Получилось вот так:

Однако что меня сейчас беспокоит, так это существование гораздо более оптимальных вариантов данного алгоритма. Я уже воспользовался советом из статьи от NVIDIA и избавил алгоритм от генерации повторных вершин для соседствующих треугольников. Однако само построение поверхности на монотонных участках поля (плоскости) создает множество ненужных треугольников. В сети я обнаружил информацию об улучшенных вариантах алгоритма: macet, повышающий качество репрезентации объекта путем трансформации граней воксельной сетки перед проходом mc, и dual marching cubes, создающий адаптивную сетку для деталей поля разных масштабов. Мои попытки понять до конца их принцип пока не увенчались успехом, но мне страстно хочется добиться сходных результатов. Потому что сейчас поверхность хоть и выглядит сносно, имеет огромное количество лишних полигонов и "тощих треугольников", создающих ступеньки и уродливые тени... Особенно интересен двойной marching cubes который подразумевает рекурсивное построение октодерева, адаптивно разделяющегося на участках с высокой неоднородностью поля, и подобное стандартному мс применение трафарета к построенным ячейкам, топологически идентичным кубу...

В качестве бонуса осилившим этот текст до конца, выкладываю проект Unity для построения поверхности из поля по алгоритму марширующих кубов, использующего GPU: https://dl.dropboxusercontent.com/u/4986831/Unity/GPUVOX.rar (требуется поддержка SM5.0 то есть DX10.1 и выше). Буду рад если кто-то сочтёт это полезным и пойдет вместе со мной по проторенной теоретиками, но еще не освоенной практиками дороге.