« Буква Ё | Новый мир |
Вперёд » |
Весь интернет завален дегенеративного вида скрин-шотами и роликами "кубико-копателей".
Несложный анализ показывает, что главный недостаток выбранного подхода генерации сцены состоит в наличии трёх предопределённых направлений по осям Декартовой системы координат 0Х, 0Y и 0Z, уйти от которых при использовании такой сетки и кубического элемента объёма по определению невозможно.
Можно ли это исправить?
В принципе — да. Достаточно подобрать другую систему координат и другой базовый элемент объёма.
СЦЕНА
@ Система координат
Система координат по горизонтали
По горизонтали можно отказаться от прямоугольной системы координат в пользу горизронтальной косо-угольной с углом 60° между осями. Таким образом число базовых направлений по горизонтали возрастает с 2х до 3х. Это позволит значительно повысить плавность изгибов границ по горизонтали, формируя достаточно правдоподобные формы рельефа без ярко выраженных прямых углов:
Вертикальная ось
Вертикальное направление сохраним — это просто удобно.
Проблему ярко выраженных вертикальных граней можно решить за счёт формы заполняющих элементов.
@ Слой из блоков
Одна из основных задач объёмного заполнения — это формирование сплошного слоя.
Сплошной слой должен представлять собой некоторую область, сверху и снизу ограниченную ровными горизонтальнами поверхностями, а между поверхностями без просветов заполненную элементами объёма.
Типы блоков
"Зуб дракона"
Мне понравилась идея использовать в качестве заполняющего элемента объёма самую симметричную из объёмных фигур — тетраэдр или "зуб дракона".
Все грани тетраэдра — это равносторонние треугольники. Равносторонними треугольниками равного размера можно полностью, без просветов, замостить любую площадку, внешние границы которой стыкуются с краями внешних треугольников. Таким образом мы можем сформировать нижнюю поверхность сплошного слоя объёма.
Вот только, замостив нижнюю поверхность треугольными гранями "зубов дракона", сверху мы получим частокол из острых углов — вершин этих тетраэдров, с широкими и глубокими промежутками между ними.
Фактически, верхняя поверхность будет представлена только точками верхних вершин тетраэдров.
Чем бы их нам заполнить?
"Резец титана"
Приглядимся внимательнее к расположению точек вершин на верхней поверхности слоя.
Каждый тетраэдр оставляет на верхней поверхности только одну точку — свою верхнюю вершину.
Так же на поверхность можно спроецировать три нижние вершины тетраэдра, описывающие равносторонний треугольник.
Если добавить ещё три верхние вершины трёх соседних тетраэдров — мы получим центр и углы равностороннего шестиугольника, в который вписан равносторонний треугольник.
Мы получим новый объёмный элемент — "резец титана"
Заполнив все промежутки между тетраэдрами новыми элементами "резец титана", мы получим сплошную, состоящую из ромбов, верхнюю поверхность слоя без просветов.
Таким образом мы получаем возможность сформировать сплошной слой, снизу ограниченный поверхностью, заполненной равносторонними треугольниками, а сверху — ромбами.
Способы текстурирования
Возможны два варианта текстурирования блоков:
Элементарный объём и дробление блоков
Другая задача — корректное моделирование и оценка объёмов объектов. Рассчитаем объёмы "зуба дракона" и "резца титана" и выделим элементарный объём.
Для рассчёта объёмов "зуба дракона" и "резца титана" рассмотрим треугольную призму, восстановленную из основания тетраэдра.
В рассчётах мы будем использовать:
1) Объём охватываемого призмой тетраэдра рассчитывается как
V(tht) = (S*H) / 3
или
V(tht) = 3 * (S*H)/9
Оставшуюся часть объёма призмы занимают три половинки "резцов титана".
2) Тогда объём половинки "резца титана" получается равным:
V(chs/2) = 2 * (S*H)/3 * 1/3
или
V(chs/2) = 2 * (S*H)/9
3) А полный объём "резца титана" будет равен:
V(chs) = 4 * (S*H)/9
Таким образом:
Дробление блоков на подблоки (sub-blocks)
Выберем способ пропорционального дробления предложенных блоков "зуб дракона" и "резец титана", таким образом чтобы подблоки имели равный объём V(base).
1) "Зуб дракона" занимает три элементарных объёма, поэтому будет дробиться на три равные части. Будем дробить "зуб дракона" по вертикали. От отрезка высоты восстановленного из вершины поделим каждую из боковых граней ровно пополам.
Будет получено три одинаковых, компактных подблока с новыми вертикальными гранями, которые можно использовать:
2) "Резец титана" содержит четыре элементарных объёма. Будем дробить его по двум диагоналям верхнего ромба, по вертикали крест-накрест.
Будет получено четыре одинаковых, уплощённых подблока с новыми вертикальными гранями, которые можно использовать:
Кроме того, стыкуя вместе несколько подблоков, можно получать:
Компоновка подблоков
Как можно заметить, модель полностью отходит горизонтальных углов 90°.
Вместо этого появляется возможности для построения углов кратных 60°:
Интересная перспектива для творчества.
Осталось реализовать :))
@ Группировка блоков
"Узел" (knot) и нумерация блоков
Экспериментально установлено, что произвольный непрерывный объём в предложенной модели можно сформировать с использованием 5 разных типов блоков — два варианта "зуба дракона" с разной ориентацией по оси 0Y и три варианта "резца титана", ориентированных по сторонам основания одного из "зубов дракона". Вся механика движения блоков в модели должна учитывать блоки какого из 5 перечисленных типов участвуют во взаимодействии.
Так же, было обнаружено что блоки всех 5 видов регулярно группируются в компактный комплекс, названный "узлом" (knot).
Таким образом, единицей группировки блоков в сцене будет "узел" из 5 разных блоков.
Расположение и нумерация блоков в составе "узла" выглядит так:
И из подобных "узлов" можно составить безразрывный слой блоков.
Нумерация подблоков в блоках узла
Как уже было написано выше, место одного и того же блока могут занимать сразу несколько подблоков разного номера. "Зуб дракона" может быть разбит на 3 подблока, а "резец титана" на 4 подблока.
Составные блоки во всех взаимодействиях будут рассматриваться как твёрдые, неподвижные.
Нумерация подблоков в составе составного блока зависит от их положения и типа составного блока, в который они входят.
Для нумерации подблоков используется значение f, fragment, фрагмент:
Нумерация граней блоков
Помимо материала и прозрачности блока, каждый блок может нести покрытия (пыль, патина, сажа, ржавчина, краска...).
Покрытия размещаются на поверхностях блока, замещая собой его собственную текстуру или смешиваясь с ней.
Для размещения покрытий на блоках указывается порядковый номер стороны, на которой оно расположено.
Стороны блока кодируются значением s, side, сторона:
- для "зуба дракона"
- для "резца титана"
Cоставные блок-объекты
Размещение на сцене блоков-объектов:
Поворот размещённого на сцене объекта относительно нормального положения:
@ Деление сцены (boxing)
Для ускорения отображения больших сцен часто применяется "боксинг" — ограничение отображаемой части сцены некоторым диапазоном координат.
Резы (cut)
Поскольку в данном случае в горизонтальной плоскости была использована не прямоугольная, а косоугольня 60-градусная система координат и треугольный базовый элемент объёма — сцена будет разбита на вертикальные призмы, резы (cuts), с основанием в форме равностороннего треугольника фиксированного размера A=B=C.
Высота реза для модели "высоких" резов будет равна высоте сцены.
Для простых резов высота реза будет численно равна ширине основания H=A=B=C.
Ромбы (romb)
Однако для оптимизации данных фактически деление сцены будет происходить на "ромбы" (rombs) — призмы с основанием в форме ромба.
Каждый ромб содержит два реза, "первый" (левый) и "второй" (правый).
С этой целью каждому узлу в ромбе так же присвоено измерение P (пэ большое), "половина" (part).
Таким образом положение каждого реза на сцене будет определяться четырьмя координатами:
И для резов в составе ромба и для узлов в составе расположенного по диагонали узла измерение P может принимать значения:
Поблочное деление узлов
При поблочном делении узла распределение блоков по резам определяется значением p (пэ малое), которое может быть равным 1 или 2.
К левому, первому резу будут отнесены блоки со значением р=1:
К правому, второму резу будут отнесены блоки со значением р=2:
Стратегии деления сцены
Деление сцены на резы позволяет ускорить её, ограничивая отрисовку ближайшими резами. Треугольная форма резов позволяет придать этой области более округлую форму — шестиугольник, а не квадрат.
Для "высоких" резов возможны три стратегии выбора резов для отрисовки:
Для простых резов так-же можно ограничить область отрисовки по высоте, например применяя трёхмерный сферический вариант стратегии ограничения по радиусу.
@ Размеры блоков
Ширина основания "зуба дракона"
Основание "зуба дракона" — равносторонний треугольник с длинной стороны L:
Разбив его на два прямоугольных треугольника мы получим значение поперечной ширины в отношении к длине стороны L:
Высота "зуба дракона"
При поперечном сечении "зуба дракона" через высоту, восстановленную из верхней вершины и одно их боковых рёбер мы получим равнобедренный треугольник с основанием L=100 и двумя равными сторонами hr=86,66.
По трём сторонам расчитаем все три угла:
По длинной стороне L=100 и прилежащему углу γ=54,76° рассчитаем высоту треугольника:
Константы X16/X2
Для снижения риска ошибок округления координат блоков подобраны пропорциональные округлённые варианты констант в X16/X2:
Эти константы можно использовать в качестве множителей при расчёте узлов блоков в координатной сетке модели.
МЕХАНИКА
Добыча/монтаж блоков
Каждый блок простого материала не зависимо от типа блока содержит одну (1) единицу соответствующего вещества:
Дробление твёрдых блоков произвордится с помощью специальных устройств:
Независимо от того, какой вариант блока был добыт изначально, каждый блок может быть разделён:
При этом количество получаемых подблоков зависит от качества установки, с помощью которой происходит деление:
После дробления полученные части блоков существуют как компоненты для сборки составных предметов или самостоятельные дробные блоки и больше не могут быть перераблотаны в исходный материал.
Механика падения блоков
Одна из целей моделирования — правдоподобное падение (обрушение) не закреплённых боков с учётом особенности материала.
Шесть возможных механник падения блока:
Установка и монтаж блоков
Простая установка блоков может производиться на любую поверхность ниже, сбоку или выше нужного места.
При этом блок останется независимым и при соблюдении необходимых условий может упасть, перекантоваться или наоборот всплыть (см. Механика падения блоков).
Монтаж блоков предполагает одновременное использование фиксирующего состава — клея.
Клей крепко объединяет блок с соседним, предотвращая его обрушение.
Клей делится по категориям прочности. Для надёжной фиксации блоков каждого класса нужен определённый или более прочный клей:
ЭКОНОМИКА
Денежная единица
За 10 тайк можно купить один финик.
Монеты крупнее могут накапливаться, объединяться или дробиться с помощью устройства "сейф для денег".
Более крупные денежные единицы последовательно связаны отношением 1 ✕ 100:
За 10 ПентаТанов можно купить звездолёт.
МНОЖЕСТВА
structure, структура блока:
strength, надёжность:
transpar, прозрачность:
tex_kind, вариант текстуры:
tex_lay, способ наложения текстуры:
blk_type, способ отрисовки блока:
dir_ID, поворот блока по горизонтали:
mov_ID, способ движения блока:
РАБОЧАЯ ПАПКА
Файлы на диске
Файлы на диске бывают трёх типов:
— файлы настроек;
— файлы справочников;
— файлы кеша сцены;
— исходные файлы сцены.
@ Файлы настроек
Такие файлы содержат перечень именованных значений в формате:
name1 = val1 \n
name2 = val2 \n
...
Файл scenes.dat
Это файл содержит список имён сцен и путей размещения их данных.
scene1_name = scene1_path \n
scene2_name = scene2_path \n
...
Правила составления путей размещения зависят от системы.
Пути сохраниения данных относительно папки ./scenes/
Имя сцены может содержать:
— латинские буквы,
— русские буквы,
— цифры,
— символы '_' и '-'.
Файл scene.dat
Это файл параметров сцены:
cuts_step = чило больше 10 \n
Где:
@ Справочники
Файлы справочников расположены в папке ./data/.
Текстуры
./data/textures.dat
tex_ID; file_name(tex_name); file_ext; tex_kind; tex_color[r; g; b; a]; transpar (1,2,3);
Материалы
./data/materials.dat
mat_ID; mat_name; structure; strength; tex_ID; tex_lay (1,2,3); frame[x0; y0; x1; y1];
Покрытия
./data/covers.dat
cvr_ID; cvr_name; strength; tex_ID; frame(x0; y0; x1; y1);
Блоки объекты
./data/objects.dat
obj_ID; obj_name; (a; b; h; mat_ID)...
где a, b, h:
— для центрального блока-заглушки — равно 0, 0, 0;
— для остальных блоков-заглушек — это относительные координаты от центрального блока.
Блоки 3D-модели
./data/models3D.dat
mdl_ID; mdl_name; mdl_file
@ Фасеты данных
Фасеты данных имеют фиксированную структуру:
Блок
Используется в исходном файле сцены, файлах кеша текущей сцены, в файле блоков-объектов:
BLK; blk_num; a; b; h; n; blk_type; mat_ID/obj_ID/mdl_ID; act
Где:
Разворот блока
Используется для записи разворота блоков-объектов и блоков-3D-моделей:
DIR; dir_ID
Движение блока
MOV; mov_ID; a0; b0; h0; tim0; tim1
где a0, b0, h0
— координаты места начала движения в направлении текущего положения блока.
где tim0, tim1
— первый и последний отсчёты таймера периода движения блока.
@ Файлы данных
Растровые изображения
Файлы растров расположены в папке ./data/rasters/.
3D-модели
Файлы 3d-моделей расположены в папке data/models3D/.
Файлы кеша сцены
./_cache_/current/AAa_BBb_HHh.che
Эти файлы содержат отдельные ромбы сцены в разбивке с шагом cuts_step из файла scene.dat кеша.
BLK | CVR... | MOV
Для составных блоков в строке может быть до 4х элементов BLK с разными значениями подблока f больше 0.
BLK... | CVR... | MOV
Исходные файлы сцены
./scenes/scene_NNn/AAa_BBb_HHh.scn
Эти файлы отличаются шагом дробления сцены на ромбы cuts_step из файла scene.dat самой сцены и тем что в них не бывает движения блоков.
Каждый файл содержит полный перечень входящих в ромб блоков любого типа, включая составные, специальные и объектные блоки. Каждый файл сцены разбит на строки. Каждая строка содержит данные одного блока.
BLK
Для составных блоков в строке может быть до 4х элементов BLK с разными значениями подблока f больше 0.
BLK...
Покрытия на поверхности блоков:
— на "зубе дракона" 4 поверхности — три боковые грани и нижняя грань;
— на "резце титана" 7 поверхностей — шесть боковых поверхностей и верхняя грань.
Таким образом в строке блока может быть до 7-ми элементов CVR с разными значениями грани s больше 0:
BLK | CVR...
СТАРЫЕ ЭКСПЕРИМЕНТЫ
@ Эрозия почвы
@ Генерация ландшафта
« Новая буква Ё | Новый мир |
Вперёд » |