Обратная перспектива в Blender
В этом посте отвлечемся наконец от геометрических нод, и попробуем что-нибудь проще, например, шейдерные ноды.
Вас никогда не смущало, что в Блендере есть обычная камера (где лучи расходятся из камеры), ортографическая камера (в которой лучи параллельны), а вот камеры с обратной перспективой нет? Как же, собственно рендерить иконы в Blender? Благодаря новой ноде в 4.3, мы можем это исправить:
Подготовка сцены
Использовать Ray Portal напрямую на камере нельзя. Для работы потребуется стандартный плейн, который мы поставим прямо перед изометрической камерой.
Начнем мы с того, что сбросим поворот у камеры и расположим ее так, чтобы она смотрела на дефолтный куб строго сбоку:
Прямо перед камерой поставьте плейн и который будет перекрывать вид и привяжите его к камере:
Этот плейн буде перенаправлять лучи из камеры так, как нам это нужно. Сделаем так, чтобы его было видно только в Cycles:
Камеру переключите на orthographic, проверьте чтобы плейн не отсекался зоной клиппинга, если что, уменьшите её:
Значение orthographic scale возьмите за основу нового драйвера, который накиньте в scale плейна:
Заметьте, что поскольку стандартный плейн имеет размер в 2 единицы, его надо уменьшить в 2 раза. Для этого либо уменьшите сам плейн в режиме редактирования, либо отредактируйте драйвер:
Теперь накиньте в плейн материал и вместо стандартного шейдера подключите Ray Portal.
Приготовления закончены! Если вы все сделали правильно, в режиме рендера cycles вы видите куб через плейн, а при смене orthographic scale плейн масштабируется вместе с границей камеры.
Создание материала
По умолчанию плейн не меняет траекторию луча. Т.е. по сути выступает как прозрачный объект:
Наша задача сделать так, чтобы лучи при выходе из портала сходились вместе в одну точку:
Для этого возьмем UV координаты, вычтем 0.5, чтобы центр координат был посередине и добавим небольшое значение в Z value:
Как видите, наша виртуальная камера смотрит в пол. Все дело в том, что камера без трансформаций смотрит вниз, а у нашей камеры есть поворот на 90 градусов:
Добавим vector rotate c таким поворотом:
Теперь камера смотрит как нужно, а если крутить Z компонент, меняется угол зрения камеры. Но если покрутить куб, вы увидите, что она обычная, т.е. перспективная. Т.е. по сути у нас получилось что-то типа:
Для нужного результата нам нужно инвертировать X,Y оставив Z как есть. Например, так:
Как видите, работает! Однако, хочется добавить 2 вещи: Во-первых надо чтобы камеру можно было поворачивать (сейчас у нас жестко зафиксирован Vector rotate) а во-вторых хочется точно располагать точку, где сходятся лучи.
Для поворота камеры я не нашел решения лучше, чем через драйверы. Берем Combine XYZ и драйверами выводим поворот камеры. Благо copy as new Driver работает как надо.
Теперь точка фокуса.
Я добавил пустышку, привязал к камере, поместил ее перед камерой и залочил ее сдвиг по всем осям кроме Y.
Драйвером вычислим расстояние от камеры до пустышки. Добавьте нод Value, создайте новый драйвер и переключите его в режим distance.
Поскольку нам нужно инвертированное значение, надо умножить var на -1, или можно умножить через ноды.
Фокусное расстояние так-же зависит от масштаба плейна. Возьмите Orthographic Scale как новый драйвер и добавьте его в нодовый сетап. фокусное расстояние надо поделить на размер плейна, поскольку чем больше плейн, тем сильнее надо изгибать лучи.
Если вы все сделали правильно, предметы находящиеся перед фокусом будут в обратной перспективе. При приближении к фокусу будут увеличиваться в размере, до тех пор пока в фокусе не станут бесконечно большого размера. Далее при отдалении от точки фокуса будут уже в обычной перспективе, но верх ногами.
Не знаю зачем вам это может пригодиться, так, например, выглядит мой кот в обратной перспективе:
shader nodes