Таинственное путешествие

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

Читать дальше

Быстрый способ трансформации AABB

При вращении объектов, возникает необходимость перерасчета AABB (Axis Aligned Bounding Box — Параллельный Осям Ограничивающий Прямоугольник). Сразу приходит простая идея — взять 8 вершин и повернуть их. Но в этом случае мы получим весьма дорогой способ. Нам потребуется, посчитать координаты самих вершин и координаты после трансформации, а уже после найти минимальное и максимальное значение.

Наиболее оптимальное решение:

function transformAABB(bbox, matrix)
{
	var min_x = matrix.axisX * bbox.min.x;
	var max_x = matrix.axisX * bbox.max.x;
 
	var min_y = matrix.axisY * bbox.min.y;
	var max_y = matrix.axisY * bbox.max.y;
 
	var min_z = matrix.axisZ * bbox.min.z;
	var max_z = matrix.axisZ * bbox.max.z;

	var pos = matrix.getPosition();

	return [
		vec3.min(min_x, max_x) + vec3.min(min_y, max_y) + vec3.min(min_z, max_z) + pos,
		vec3.max(min_x, max_x) + vec3.max(min_y, max_y) + vec3.max(min_z, max_z) + pos
	];
}

Конечно, есть и другие методы быстрого вычисления AABB после трансформации объекта, но этот способ оказался одним из наиболее быстрых и простых.

Интерфейс для генератора деревьев

Первым делом были проведены подготовительные работы. Перед началом изменения интерфейса, был изучен опыт других разработчиков. Проведен анализ программных продуктов, но только offline версии, наиболее важными были продукты SpeedTree и Plant factory. Анализ проводился по удобству интерфейса, набору основных функций формирования кроны, дополнительных средств создания структуры деревьев. Для удобства были выбраны наиболее важные параметры. Ими оказались: Уменьшение радиуса ствола от длины, Изменение масштаба текстуры ствола, Форма кроны, Качество (для создания LOD), Лиственные просветы, Изгиб, Размер листвы. Так же на каждом уровне: Число сегментов ствола, Число сторон, Количество ветвей, Длина ветвей, Радиус, Изгиб и другие параметры определяющие структуру ветвей.

Капризные теги: ul li

Каждый раз, наступая на грабли, при верстке страниц, сталкиваюсь с одной и той же проблемой, а именно пробелы или переносы строк между тегами <ul><li>
Типичный пример:

<ul class="root" id="base1">
	<li class="pin1"><a href="/blog">Blog</a></li>
	<li class="pin2"><a href="/downloads">Downloads</a></li>
</ul>

На дворе уже скоро 2017 год, а решения на уровне HTML5 / CSS так и не появилось. Предлагаю решение, оно очень простое, но эффективное (на php):

$data = preg_replace("/[\s\n]*?(\<(\/ul>|li[\s>]))/i", "$1", $data)

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

Поиск пути на Javascript

В мире С++ есть достаточно много библиотек для поиска пути, самая популярная на мой взгляд это Recast & Detour. Но даже по разумным меркам в ней много лишнего, весит она совсем много, а если портировать её на Javascript еще больше (1Мб). Понимая принципы работы этой библиотеки. Решил создать свою почти с нуля и не мучиться с портированием. За основу был взят алгоритм поиска A-Star (сокращенно А*).

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

Результат работы алгоритма:

javascript-pathfinging-navigationmesh

Всего в 800 строк удалось решить задачу, при этом скорость работы не уступает своим аналогам на C++. А размер без сжатия 19Кб, со сжатием gz 6Кб. При этом мы не используем сторонние библиотеки и нет никаких зависимостей.

Двухмерный редактор

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

В чем же преимущество редактора, почему в очередной раз не использую готовые редакторы. Основное отличие редактора от аналогов — он работает сразу с десятками чертежей, каждый из которых содержит различные слои. Чертежи зависят друг от друга. Слои могут содержать сотни и более объектов. Слои так же можно связывать как с текущим чертежом так и с другими чертежами. Это позволяет проработать полноценную 3D модель состоящую только из сечений, которые расположены на разных уровнях.

html5-free-vector-editor

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

html5-procedural-city

Песочница HTML5 + Javascript + WebGL

Для быстрого прототипирования и тестирования идей, нужна изолированная среда, которая, не повлияет на создание продукта. Очень часто многие разработчики тестируют идеи прямо в продукте который разрабатывают. Но это не всегда корректно и не всегда возможно полноценно протестировать полученный результат. По этому для себя создал изолированную среду (песочницу), где можно опробовать идею или протестировать различные функции. В основном среда используется для прототипирования трехмерных сцен и объектов. В песочнице можно в режиме реального времени редактировать код и следить за визуальными изменениями.webgl-sandbox

Модернизация физического движка

В современных играх, в основном, используется «импульсная» модель физического движка. По сути это расчет импульсов и сил действующих на объект с выталкиванием объектов, либо с поиском ближайшей точки до момента контакта и перерасчетом сил. На сегодняшний день создано много физических движков, все работаю с разными погрешностями. Даже в самых основных движках, задача по оптимизации так и не решена. А именно быстрый расчет движения объекта в момент скольжения и столкновения с другими за минимальное число операций. В играх физический движок за одну секунду обычно около 60-200 раз пересчитывает сцену. В итоге результат будет верный, но на его расчет мы потратим значительно больше процессорного времени. Обычно, оптимизируют число проверок столкновения, упрощают модели создавая convex представление и другие оптимизации. Так что же можно применить, чтобы упростить расчеты?

Читать дальше

1 2 3