Графический движок "Колибри".
Попытка создания графического движка и интеграций в него некоторых наработок
Краткое описание движка.
изначально, когда был придуман первый хак, указывающий на возможность быстрого отбрасывания половины теневых от направления камеры полигонов, уже было ясно, что будут искажения на карте-1, что будут одни параллели, а медиан на карте не будет, так как за положения она не отвечает, только за ориентиры. Оси всего 2 на этой 3D карте, так как они отвечают за положения и поворот камеры вокруг собственной её оси Y - не интересен, так как задача сделать валовый грубый отброс половины возможных теневых полигонов не по расчёту, а по карте.
Возможно что позднее будет рассмотрен поворот камеры вокруг собственной оси, но не на этом этапе - уж точно не в алгоритме валового отбора теневых полигонов от ориентира камеры, и не на этапе создаваемой именно этой карты.
Для примера берётся обычный икосаэдр.
Так как это хак "изнутри", то все нормали полигонов можно развернуть внутрь для удобства (на изображении это конусы направленные внутрь)
Далее получается нечто вроде глобуса звездного неба.
Камера предположительно смотрит строго вверх, так как нормали инвертированы, то светлые конусы означают возможные видимые нормали граней меша, а ниже красной поверхности - тёмные, которые в тени от возможного обзора камеры.
Стоит пояснить, что на данной карте, координаты объектов значения не имеют, и что на ней нормали всех объектов начинаются в одной точке.
И далее рассматривается следующая возможная сетка, на которой обзор камеры должен охватывать все точками обозначенные на ней нормали граней или вершин ориентированных от камеры на угол не больший 90 градусов.
Поворот вокруг оси Z: влево- вправо
Поворот вокруг оси X: вверх-вниз
И получается что ось X должна быть ведомой при повороте камеры вокруг оси Z.
Понятно, что если карту развернуть в плоскость, то при повороте вокруг оси X будут наблюдаться переходы и искажения области захвата камеры. Да даже это видно и на последнем изображении, если мысленно начать поворачивать плоскость по оси X (красные горизонтальные параллели).Эта тема работы завтрашнего вечера, движок делается в свободное личное время.
И далее как-бы вся поверхность сферы, с точками нормалей переносится на поверхность цилиндра - некоторого подобия карты.
И вот алгоритм выборки участков с цилиндрической карты - достаточно сложен, но, в ввиду условного масштаба решаемой задачи - с этим можно смириться и в ряде задач использовать карту и алгоритмы. Здесь камера условно смотрит вверх влево, и срез сечения цилиндра - это сложная фигура, причём - если наклонить вниз камеру, то загибы среза должны изогнуться в обратных направлениях.
И вот теперь уже - да, можно переходить к рассмотрению такого предмета как изометрия, и к написанию формул.
Было изображение правильное, просто с небольшой недоработкой.
Формулы будут строиться следующим образом: карта - поверхность цилиндра, имеет высоту равную высоте сферы условно, ограничители - диски, они имеют положение по оси Z точно такое, как и верхняя и нижняя точки пересечения плоскости "матрицы" камеры с сферой.
Трассировка карты.
Как может программа, с её ограничениями быстро обозревать карту... Тут много вариантов, я сделал два, где в каждом
два массива, где в ячейке каждого, помимо поля с данными, указывается либо количество шагов до неё , либо адрес следующей ячейки.
По сути правильное название этого метода: Трассировка по линии переходов, с произвольной точкой входа.
Не техническое название от меня ( впрочем как и техническое) -трассировка "Сталкер".
Некоторые путают это с чем-то древовидным, но это не так, я не стану заполнять цифрами ячейки, но условно можно представить, что в каждой синей ячейке хранятся ссылки на следующую (по вертикальной или горизонтальной линии) ячейку, в которой хранятся не ссылки, а данные об объекте на "карте".
Карта более подробно.
После отступления о трассировке для работы с картой, стоит вернуться к упоминанию о ней. Поверхность цилиндра - будущая карта нормалей полигонов, которая спроецирована от верхнего и нижнего "полюса" сферы, и возможно это будет ещё и карта вершин, не столь важно сколько будет этих карт.
Красный диск - грубо предполагаемая поверхность проецирования изображения на камеру. Зелёный нижний диск и зелёный верхний - ограничители, которые ограничивают обзор на проецируемой "цилиндрической" карте.
С какой частью объекта работает карта.
Если объект занимает весь обзор камеры.
Если брать один ориентир, то очевидно, что для него являются теневыми полигоны нормали которых повёрнуты от него на угол в диапазоне 90-270 градусов.
Но у камеры есть обзор, и эти нормали не могут разворачиваться на угол 180 градусов (90+180=270), а могут быть развёрнуты на угол равный разнице угла 180 градусов и угла обзора камеры: 180-63=117. Получается не такая уж и большая часть грубого предварительного разделения полигонов на видимые и невидимые.
А вообще полная область работы фильтра равна 360 градусов минус угловой размер объекта.
Если угловой размер объекта меньше угла обзора камеры.
То разумеется что тот-же разворот уже можно осуществлять на угол равный разнице угла 180 градусов и углового размера объекта. При этом, с учётом того что это грубое предварительное разделение полигонов на видимые и не видимые, за нулевой ориентир камеры берётся вектор от центра объекта до камеры, но при условии, что все лицевые и теневые поверхности полигонов предварительно были инвертированы (нормали развёрнуты на 180 градусов).
И всё-же хак объекта изнутри.
Тут алгоритм грубого разделения вершин тот-же что и от начала:
нормали полигонов инвертированы внутрь, а чтобы охватывать нормали видимых полигонов, нужно смотреть на объект изнутри, но в направлении камеры.
Тип данной карту, и данной трассировки я намерен применить и к пространству виртуальному и к камере.
Для вершин трассировка возможно будет усложнена ссылками по диагоналям карты, и ссылки станут представлять собой массив ссылок для одной вершины.
Усложнять эту трассировку можно сколько угодно, наращивая обрабатываемые с её помощью объёмы данных.
Примерно этот-же способ, с небольшой адаптацией применим и к рейтрейсингу. Разница в том, что отражённый на сцене в камеру от объекта луч рассчитывается на предмет падающего луча. А так - то же самое, но в краты быстрее рейкастинга.
Карту можно доработать для более детальной фильтрации рейкастинга и рейтресинга через добавление к ней сопроводительной карты и понятия (для работы с ней) радиуса нормали.
Вершины, прорисовка.
Позиции вершин при прорисовке будут браться с дополнительной карты углов вершин. Просто каждая вершина будет иметь ещё глубину посадки. Лучше чем эта карта и трассировка с ней - я ничего не придумаю нового. Просто трассировка будет в обе стороны читаться, от центра угла обзора.