Ёшкина гора — новый мир.

Ёшкина гора — новый мир

Новый мир Ёшкин Дом Ёшко-педия


« Буква Ё
Новый мир
Вперёд »

 
СЦЕНА
 
СЦЕНА
  Слой из блоков   СЛОЙ ИЗ БЛОКОВ
  Группировка блоков   ГРУППИРОВКА БЛОКОВ
  Боксинг сцены   БОКСТИНГ СЦЕНЫ
  Размеры блоков   РАЗМЕРЫ БЛОКОВ
  Множества   МНОЖЕСТВА
 
РАБОЧАЯ ПАПКА
 
РАБОЧАЯ ПАПКА
  Справочники   СПРАВОЧНИКИ
  Фасеты данных   ФАСЕТЫ ДАННЫХ
  Файлы данных   ФАЙЛЫ ДАННЫХ
 
СТАРЫЕ ЭКСПЕРИМЕНТЫ
 
СТАРЫЕ ЭКСПЕРИМЕНТЫ

Весь интернет завален дегенеративного вида скрин-шотами и роликами "кубико-копателей".

Несложный анализ показывает, что главный недостаток выбранного подхода генерации сцены состоит в наличии трёх предопределённых направлений по осям Декартовой системы координат 0Х, 0Y и 0Z, уйти от которых при использовании такой сетки и кубического элемента объёма по определению невозможно.

Можно ли это исправить?
В принципе — да. Достаточно подобрать другую систему координат и другой базовый элемент объёма.

 

СЦЕНА

@ Система координат

Система координат по горизонтали

По горизонтали можно отказаться от прямоугольной системы координат в пользу горизронтальной косо-угольной с углом 60° между осями. Таким образом число базовых направлений по горизонтали возрастает с 2х до 3х. Это позволит значительно повысить плавность изгибов границ по горизонтали, формируя достаточно правдоподобные формы рельефа без ярко выраженных прямых углов:

 

Вертикальная ось

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

 

@ Слой из блоков

Одна из основных задач объёмного заполнения — это формирование сплошного слоя.

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

 

Типы блоков

"Зуб дракона"

Мне понравилась идея использовать в качестве заполняющего элемента объёма самую симметричную из объёмных фигур — тетраэдр или "зуб дракона".

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

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

Фактически, верхняя поверхность будет представлена только точками верхних вершин тетраэдров.

 

 dragon tooth

 dragon tooth

 thetra flat bottom side

 thetra flat bottom side

 thetra flat top side

 thetra flat top side

 thetra flat top side dots

 thetra flat top side dots

 

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

Чем бы их нам заполнить?

 

"Резец титана"

Приглядимся внимательнее к расположению точек вершин на верхней поверхности слоя.

Каждый тетраэдр оставляет на верхней поверхности только одну точку — свою верхнюю вершину.

Так же на поверхность можно спроецировать три нижние вершины тетраэдра, описывающие равносторонний треугольник.

Если добавить ещё три верхние вершины трёх соседних тетраэдров — мы получим центр и углы равностороннего шестиугольника, в который вписан равносторонний треугольник.

 

Мы получим новый объёмный элемент — "резец титана"

 

 two dragon teeth

 two dragon teeth

 Sixtagone projection

 Sixtagone projection

 two thr's and titan chisel

 two thr's and titan chisel

 one thr and 3 titan chsl's

 one thr and 3 titan chsl's

 chsl's top side flat

 chsl's top side flat

 

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

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

 

Способы текстурирования

Возможны два варианта текстурирования блоков:

 outer tex

 outer tex

 inner tex

 inner tex

 

Механника падения блоков

Одна из целей моделирования — правдоподобное падение (обрушение) не закреплённых боков с учётом особенности материала.

Шесть возможных механник падения блока:

 

fall drop

fall drop

flow drop

flow drop

semi-flow drop

semi-flow drop

swipe drop

swipe drop

tilt down drop

tilt down drop

tilt drop

tilt drop

 

Элементарный объём и дробление блоков

Другая задача — корректное моделирование и оценка объёмов объектов. Рассчитаем объёмы "зуба дракона" и "резца титана" и выделим элементарный объём.

Для рассчёта объёмов "зуба дракона" и "резца титана" рассмотрим треугольную призму, восстановленную из основания тетраэдра.

В рассчётах мы будем использовать:

 

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
 

 volume prism

 volume prism

 volume tht

 volume tht

 volume chs half

 volume chs half

 volume chs full

 volume chs full

 

Таким образом:

 

Дробление блоков на подблоки (sub-blocks)

Выберем способ пропорционального дробления предложенных блоков "зуб дракона" и "резец титана", таким образом чтобы подблоки имели равный объём V(base).

 

1) "Зуб дракона" занимает три элементарных объёма, поэтому будет дробиться на три равные части. Будем дробить "зуб дракона" по вертикали. От отрезка высоты восстановленного из вершины поделим каждую из боковых граней ровно пополам.

Будет получено три одинаковых, компактных подблока с новыми вертикальными гранями, которые можно использовать:

 

2) "Резец титана" содержит четыре элементарных объёма. Будем дробить его по двум диагоналям верхнего ромба, по вертикали крест-накрест.

Будет получено четыре одинаковых, уплощённых подблока с новыми вертикальными гранями, которые можно использовать:

 

Кроме того, стыкуя вместе несколько подблоков, можно получать:

 

 sub-blokcs tht

 sub-blokcs tht

 breaked tooth

 breaked tooth

 sub-blokcs chs

 sub-blokcs chs

 breaked chisel

 breaked chisel

 

Компоновка подблоков

 front flat

 front flat

 side flat

 side flat

 right angle

 right angle

 right angle 2

 right angle 2

 side angle

 side angle

 side angle 2

 side angle 2

 sharp angles

 sharp angles

 

Как можно заметить, модель полностью отходит горизонтальных углов 90°.
Вместо этого появляется возможности для построения углов кратных 60°:

Интересная перспектива для творчества.
Осталось реализовать :))

 

@ Группировка блоков

"Узел" (knot) и нумерация блоков

Экспериментально установлено, что произвольный непрерывный объём в предложенной модели можно сформировать с использованием 5 разных типов блоков — два варианта "зуба дракона" с разной ориентацией по оси 0Y и три варианта "резца титана", ориентированных по сторонам основания одного из "зубов дракона". Вся механика движения блоков в модели должна учитывать блоки какого из 5 перечисленных типов участвуют во взаимодействии.

Так же, было обнаружено что блоки всех 5 видов регулярно группируются в компактный комплекс, названный "узлом" (knot).

Таким образом, единицей группировки блоков в сцене будет "узел" из 5 разных блоков.
Расположение и нумерация блоков в составе "узла" выглядит так:

0 - all knot

0 - all knot

1 and 2 - knot teeth

1 and 2 - knot teeth

3, 4 and 5 - knot chisels

3, 4 and 5 - knot chisels

И из подобных "узлов" можно составить безразрывный слой блоков.

 

Нумерация подблоков в блоках узла

Как уже было написано выше, место одного и того же блока могут занимать сразу несколько подблоков разного номера. "Зуб дракона" может быть разбит на 3 подблока, а "резец титана" на 4 подблока.

Составные блоки во всех взаимодействиях будут рассматриваться как твёрдые, неподвижные.

Нумерация подблоков в составе составного блока зависит от их положения и типа составного блока, в который они входят.
Для нумерации подблоков используется значение f, fragment, фрагмент:

1 and 2 - sub-blocks for teeth

1 and 2 - sub-blocks for teeth

3, 4 and 5 - sub-blocks for chisels

3, 4 and 5 - sub-blocks for chisels

 

Нумерация граней блоков

Помимо материала и прозрачности блока, каждый блок может нести покрытия (пыль, патина, сажа, ржавчина, краска...).

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

Стороны блока кодируются значением s, side, сторона:

 tooth sides

 tooth sides

 chisel sides

 chisel sides

 

Cоставные блок-объекты

Размещение на сцене блоков-объектов:

 

Поворот размещённого на сцене объекта относительно нормального положения:

central block

central block

frontal direction

frontal direction

 

@ Деление сцены (boxing)

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

 

Резы (cut)

Поскольку в данном случае в горизонтальной плоскости была использована не прямоугольная, а косоугольня 60-градусная система координат и треугольный базовый элемент объёма — сцена будет разбита на вертикальные призмы, резы (cuts), с основанием в форме равностороннего треугольника фиксированного размера A=B=C.

Высота реза для модели "высоких" резов будет равна высоте сцены.
Для простых резов высота реза будет численно равна ширине основания H=A=B=C.

 

 high cuts scene

 high cuts scene

 simple cuts scene

 simple cuts scene

 one romb is two cuts

 one romb is two cuts

 

Ромбы (romb)

Однако для оптимизации данных фактически деление сцены будет происходить на "ромбы" (rombs) — призмы с основанием в форме ромба.
Каждый ромб содержит два реза, "первый" (левый) и "второй" (правый).
С этой целью каждому узлу в ромбе так же присвоено измерение P (пэ большое), "половина" (part).

Таким образом положение каждого реза на сцене будет определяться четырьмя координатами:

 

И для резов в составе ромба и для узлов в составе расположенного по диагонали узла измерение P может принимать значения:

 

Поблочное деление узлов

При поблочном делении узла распределение блоков по резам определяется значением p (пэ малое), которое может быть равным 1 или 2.

К левому, первому резу будут отнесены блоки со значением р=1:

К правому, второму резу будут отнесены блоки со значением р=2:

 

 one node cutting

 one node cutting

 fitst part of node

 fitst part of node

 second part of node

 second part of node

 first cut of romb

 first cut of romb

 second cut of romb

 second cut of romb

 

Стратегии деления сцены

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

Для "высоких" резов возможны три стратегии выбора резов для отрисовки:

 common angle boxing

 common angle boxing

 next door boxing

 next door boxing

 radius boxing

 radius boxing

 radius boxing 2

 radius boxing 2

 

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

 

@ Размеры блоков

Ширина основания "зуба дракона"

Основание "зуба дракона" — равносторонний треугольник с длинной стороны L:

Разбив его на два прямоугольных треугольника мы получим значение поперечной ширины в отношении к длине стороны L:

 

Высота "зуба дракона"

При поперечном сечении "зуба дракона" через высоту, восстановленную из верхней вершины и одно их боковых рёбер мы получим равнобедренный треугольник с основанием L=100 и двумя равными сторонами hr=86,66.

По трём сторонам расчитаем все три угла:

По длинной стороне L=100 и прилежащему углу γ=54,76° рассчитаем высоту треугольника:

 tooth base

 tooth base

 tooth height

 tooth height

 

Константы X16/X2

Для снижения риска ошибок округления координат блоков подобраны пропорциональные округлённые варианты констант в X16/X2:

Эти константы можно использовать в качестве множителей при расчёте узлов блоков в координатной сетке модели.

constants horiz

constants horiz

constants vert

constants vert

 

 

МНОЖЕСТВА

hardness, тип прочности:

 

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/materials.dat

mat_ID; mat_name; hardness; strength; tex_ID; tex_kind (1,2); tex_type (1,2,3); transpar (1,2,3,4)

 

Покрытия

./data/covers.dat

cvr_ID; cvr_name; transparency (1,2,3); tex_ID

 

Текстуры

./data/textures.dat

tex_ID; tex_name; tex_kind; tex_file/tex_color; (x0; y0; x1; y1) / (r; g; b; a)

 

Блоки объекты

./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 поверхности — три боковые грани и нижняя грань;
— на "резце титана" 3 поверхности — две боковые поверхности и верхняя грань.

Таким образом в строке блока может быть до 4х элементов CVR с разными значениями грани s больше 0:

BLK | CVR...
 

 

 

 

 

 

СТАРЫЕ ЭКСПЕРИМЕНТЫ

Сцена «Ё»

Сцена «Ё»

 

 

@ Эрозия почвы

 Столб из гравия

 Столб из гравия

 Башня из гравия и песка

 Башня из гравия и песка

 Колонна из песка

 Колонна из песка

 

 

@ Генерация ландшафта

 Сцена трава

 Сцена трава

 Генерация рельефа

 Генерация рельефа

 Рандомизация откоса

 Рандомизация откоса

 Рандомизация откоса 2

 Рандомизация откоса 2

 

 

« Новая буква Ё
Новый мир
Вперёд »