Унесённые Лобачевским (DevDays Осень 2018)

Материал из CSC Wiki
Перейти к:навигация, поиск

Состав команды

  • Левашев Иван
  • Рябушев Антон
  • Гориславский Ростислав

Описание проекта по результатам выполнения

Из Евклидова пространства убран шар и заменён на шар пространства Лобачевского. Это даёт оптический эффект: если смотреть вглубь аномалии, изображение уменьшено, по краям похоже на зеркало, а где-то между этими областями оптическая сфера, как у чёрной дыры.

Создана программа, генерирующая кадры, полученное видео в формате VR загружено на YouTube. При наличии подходящего оборудования можно посмотреть в объёме. Можно в браузере без объёма покрутить во все стороны.

Результаты

Ролик: https://www.youtube.com/watch?v=SwGPUar08ZU

Презентация: Файл:Унесённые Лобачевским (DevDays Осень 2018).hybrid.odp+pdf.pdf

Хранилище: https://gitlab.com/iOCTAGRAM/render-lobachevskian

Текущие дефекты

  • Версия с крутыми виражами не интегрирована в скрипт сборки, и не отрендерена.
  • Сборка под Windows возможна, но под cmd не написан аналог produce.sh, выполняющий всё шаманство, чтоб запустить и получить результат.

Не получилось

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

Исходное описание

Предлагается отрендерить (стерео)панорамный видеоролик. ffmpeg умеет разбирать видео на кадры и собирать обратно. При этом можно задействовать разную математику. Таким способом (на Python) математиком Henry Segerman были сделаны панорамные видео: Сферический эффект Дросте 1, Сферический эффект Дросте 2, Переходы Мёбиуса, Портал в зеркальный мир. Лучше смотреть в VR. Математик неравнодушен и к геометрии Лобачевского: Неевклидова виртуальная реальность. Это нужно запускать в VR, а на видео — только запись.

Странно, но некоторые идеи математик так и не реализовал. Лобачевский и Мёбиус живут в разных видео, а меж тем преобразования панорамы соответствуют тому, что происходит с горизонтом пространства Лобачевского при трансляциях. Так что можно взять панораму, натянуть на горизонт пространства Лобачевского. В панораме оставить круглое окно, через которое можно влететь в пространство Лобачевского, замощённое чем-нибудь, пролететь и вылететь через такое же окно в другую панораму.

Можно взять (евклидову) 3D сцену вроде двора между домами и заменить кусок пространства пространством Лобачевского. Поскольку геометрии сильно разные, корректно стыковать их получается только через достаточно универсальные геометрические формы, а это сфера и плоскость (орисфера). Вот шар воздуха можно выпилить из сцены и заменить шаром пространства Лобачевского. Далее, в видео можно кривизну менять постепенно, так, чтоб объём откачивался равномерно. А камеру отправить вращаться вокруг границы пространств, чтоб оптические эффекты показать. Оптические эффекты, есть мнение, при значительном уменьшении объёма, станут всё менее интересными, это будет сферическое зеркало с дыркой, если смотреть прямо в центр, иначе в остатки объёма лучом зрения толком не попасть. Чтобы разнообразить сцену, можно одновременно увеличивать оптическую плотность пространства Лобачевского, тогда больше лучей будет идти в центр. По-хорошему также стоит сделать так, чтобы камера погружалась в пространство Лобачевского и вылетала обратно несколько раз. Чтобы такое запрограммировать, предположително, нужен движок Ray tracing. Надо бы что-то такое взять, чтоб движок можно было спросить, какого цвета пиксель, если луч идёт из такой-то точки в таком-то направлении, и чтоб модель для движка уже была. А дальше только вызовы делать правильные.

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

Предложил: Иван Левашев

Язык разработки

Такой же, как у движка Ray Tracing, а движок Ray Tracing такой же, какой сможет отобразить выбранную модельку. Что подо что подгонять придётся, пока (не зная состав участников) не понятно.

Обновление: всё идёт к тому, что ближе на плюсах, хотя это не строго так. Интересным показался PowerVR, поглотивший OpenRL. Конвертировать можно Blender и AssImp, и в PowerVR SDK есть конвертеры.

Пример модели, ещё пример

Аналитическая геометрия

Пространство Лобачевского можно вложить в псевдоевклидово пространство более высокой размерности. В частности, скорости всех объектов в специальной теории относительности занимают пространство Лобачевского размерности 3 с радиусом кривизны ci (скорость света на мнимую единицу, ведь кривизна пространства, которая пропорциональна квадрату радиуса кривизны, отрицательна).

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

Рекомендуется ознакомиться с Gyrovector space.

Посмотреть видео: Визуализация разных проекций гиперболической плоскости. Очень часто изображают всё в Пуанкаре, потому что там влезает больше, и потому что там углы сохраняются. Но с вычислительной точки зрения оказывается ближе модель Бельтрами-Клейна, там линии сохраняются, а надо же в рейтрейсинге лучи прямые отслеживать. На видео по ссылке надо увидеть, что углы вдали от центра проекции искажаются. Если из удалённой точки провести прямые во всех направлениях, то часть из них сожмётся. Чтобы понять, какой на самом деле угол, можно например, сделать трансляцию, так, чтоб точка совместилась с центром. В центре углы не искажаются. Если не понятно, как сделать трансляцию, совмещающую с центром, то можно сначала повернуть вокруг центра так, чтобы точка попала на одну из осей координат. А потом вдоль оси сделать гиперболический поворот, не меняя остальных координат. В общем, запрограммировать всё можно не одним, так другим способом.

Для затравки: если луч падает на сферу в гиперболическом пространстве под углом α к радиус-вектору в этой точке, то в модели Бельтрами-Клейна, отцентрированной по центру сферы, для угла β, под которым к радиус-вектору идёт луч в этой модели, будет справедливо tg(β)=tg(α)ch(r/R), где r — радиус сферы, R — модуль радиуса кривизны пространства. Оптическая плотность же вводится через синусы, а не тангенсы. Причём, оптическая плотность налагается НЕ В модели Бельтрами-Клейна, то есть, до преобразования в модель. В модели Бельтрами-Клейна можно только найти точку пересечения, например, чтоб понять, где выйдет луч. Для любого луча можно найти плоскость, содержащую этот луч и центр сферы.

Оптическую плотность напрашивается взять ch(r/R). С учётом написанного, получается, что кусок пространства Лобачевского, если в него не залетать, не стрелять медленно летящим лазером, не наполнять чем-либо, это оптически рыхлая шаровая линза, которая работает по закону тангенсов, а не синусов. В отличие от обычных оптически рыхлых сред, полностью отражающих под определёнными углами, по закону тангенсов так не получится, но если сильно отклонять, то кривизна сферической поверхности естественным образом выбросит косой луч не слишком далеко от точки входа.

VR стереопанорамное видео

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

Но тут есть хакерство. По отдельности стереовидео устроено математически корректно. И 360 панорамное видео устроено математически корректно. А VR видео (стереопанорама) — хак.

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

Как и с обычным стерео, кренить голову в VR получается нельзя, движок должен крен игнорировать. Но также возникает проблема и с тангажом вблизи плюс минус 90 градусов. При пересечении 90 градусов вниз или вверх движок должен переставить местами изображение для левого и правого глаза, а чтоб это было возможно, объём сверху и снизу должен быть убит. Если стереопанорама склеивается, то там какое-то одно хакерство. Если делается рейтрейсинг, то, наверное, надо делать так:

Спроецировать в виртуальном пространстве кольцо диаметром таким же, как расстояние между глазами. Для точек изображения по экватору проводить лучи так, чтобы они исходили из этого кольца. А для точек выше и ниже сокращать диаметр кольца, например, по закону косинуса, чтоб в самый верх смотрел только один луч из сжавшегося в точку кольца. Либо, может быть, сжатые кольца не общий центр должны иметь, а подниматься и опускаться, чтоб все их позиции образовывали сферу. Вертикальные линии при этом искажаются. А можно ничего не делать с радиусом, но тогда вверху и внизу получается цилиндрическая слепая зона. А можно взять корень энной степени из косинуса, тогда вверх и вниз в широких пределах ничего не искажается так уж сильно, но потом как пойдёт, надо же к нулю прийти. Без доступа к VR не понятно, что как будет ощущаться. Наверное, любой способ для такого небольшого проекта сойдет, но для общего развития надо хотя бы знать, что вот есть такие проблемы из-за хакерской природы VR стереопанорам.

У Google и по второй ссылке реализуется слепая зона, но [есть примеры реализации сведения к нулю http://wiki.povray.org/content/HowTo:ODS], с формулой.

Особенности в пространстве Лобачевского

Такая глубокая проработка вряд ли будет, но вдруг. Есть там такая специфика, что линии любят расходиться. Если взять кольцо возможных положений глаз, на нём из прямо противоположных точек по касательной проводить линии, они разойдутся. Это значит, что при просмотре горизонт окажется не на бесконечности. Что плохо с разными геометриями, так это то, что зрительная система не адаптирована к ним, а хотелось бы как можно лучше передать погружение. Скажем, гипотетические математики, живущие в пространстве Римана, могли бы обнаружить, что определённым образом перекрученная лента (см. Зацепление Хопфа) имеет особенную геометрию, на которой возможно подобие, и в которой возможны новые замощения: шесть треугольников в одной вершине, четыре квадрата в одной вершине, три шестиугольника в одной вершине. И показывали бы математики всем эту перекрученную ленту, и так бы и запомнилось эта геометрия в народе как что-то перекрученное. Но для нас, автохтонов пространства Евклида, было бы сюрпризом узнать о перекрутках. Сколько жили, вроде бы не замечали. Но зато пространство Лобачевского страдает тем, что его видят чаще всего через рыбий глаз проекций Пуанкаре или Бельтрами-Клейна. Это оставляет ложные впечатления. Как в пространстве Евклида горизонт бесконечно далёк, так и в пространстве Лобачевского. Проекции удобны для рассуждений, но от визуализации ожидается передача ощущений изнутри.

Чтобы лучше передать ощущения нахождения в пространстве Лобачевского существам, имевшим несчастье никогда не чувствовать ничего, кроме своего унылого пространства Евклида, надо бы, чтоб горизонт всё же был на бесконечности. Значит, лучи зрения должны исходить по каким-то другим принципам. Придумать пересчёт углов в пространстве Лобачевского — то ещё развлечение. В ходе мысленных экспериментов был придуман такой прицип: проводить черновой луч из центра кольца в том направлении, куда хотелось бы направить взгляд из «глаз». Этот луч заканчивается на каком-то идеале (на горизонте). В этот же идеал и надо направить скорректированные лучи из «глаз».

На развитие интуиции

Склейка пространств

В первых двух хорошо отображена геометрия Лобачевского, если есть только пространство Лобачевского. Это уже пройденный этап. В пространстве Лобачевского есть такое свойство, что если радиус сферы увеличивать, то объём шара и площадь сферы начинают расти экспононциально, однако у такой здоровенной сферы геодезическая кривизна никогда по модулю не становится меньше некоторого предела. Она остаётся ощутимо выпуклой (не может быть менее выпуклой, чем евклидова сфера такого же радиуса, как радиус кривизны пространства) по закону обратного квадрата гиперболического тангенса. Вот это обстоятельство почувствовать, глядя на демки, не получается. Отсюда идея показать, как выбрасываются лучи в евклидово пространство, склеив два пространства.

Склеить пространства можно по-разному. Зафиксировав внешний радиус, можно варьировать две степени свободы (радиус кривизны и внутренний радиус), плюс третьим параметром повышенная оптическая плотность. Как ни склеивай, идеально не сойдётся. Например, можно приравнять площадь и периметр изнутри и снаружи, но тогда будет отличаться геодезическая кривизна. А можно приравнять геодезическую кривизну, но тогда одинаковым дугам снаружи будут сопоставляться дуги большей длины внутри. Что более зрелищно, надо выяснять эмпирически.

Про кватернионы

Кватернионы заменяют матрицы вращения. У кватерниона можно вытащить его оси методами axis_x, axis_y, axis_z, они соответствуют содержимому матрицы вращения. В реализации это просто apply кватерниона к вектору. apply умножает с двух сторон. С двух сторон надо, чтоб убить антикоммутативные эффекты. При умножении слева или справа есть полезный эффект от вращения вдоль одной оси, но есть и вредный эффект, вращение вдоль другой оси, равноудалённой в пронстранстве поворотов. apply так устроен, что полезный эффект накапливается, а вредный взаимно уничтожается. Ценой этому то обстоятельство, что применяемые для описания вращения кватернионы — это корень от того, что могло бы быть. Строятся они синусами и косинусами половинного угла, например. И одному повороту соответствуют два диаметрально противоположных кватерниона.

Сопряжение кватерниона (complement) делает обратный поворот. axis_x, axis_y, axis_z от дополнения кватерниона дают содержимое обратной матрицы.

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

Поворот без кватернионов

Если есть два вектора в плоскости, то их векторное произведение даёт вектор нормали. Нормаль можно поделить на её модуль (make_unit), чтоб получить единичный вектор нормали n. Если какой-то вектор v взять и сделать с ним vcosα + (vxn)sinα, это повернёт вектор v вокруг n на α.

Если где-то удалось найти два неортогональных вектора v и w, то (w - v(vw)) будет ортогонален v, а дальше можно привести вектора к единичной длине и получить неполный базис. Векторное произведение даёт недостающий вектор базиса. Скалярно умножая какой-то вектор поочерёдно на вектор ортонормированного базиса, получаем координаты того же вектора в этом базисе. Наоборот: отдельные координаты умножаем как скаляры на соответствующие вектора базиса, складываем эти три вектора, получаем в сумме вектор в исходном базисе.