Carlos Calzada Об авторе: Я являюсь студеном со специализацией в компьютерных науках (в настоящий момент) и с того времени, когда у меня появился Спектрум, я всегда любил графику. Кроме того, я фанат Линукса и всего, что не связано с Micro$oft. Два моих хобби, не связанных с компьютерами, -- bonsais и аквариумы. Написать автору Содержание: Вступление Основные принципы позиционирования камеры Смазывание изображения Глубина сцены |
Основные принципы позиционирования камеры
Аннотация:
В этой статье о RenderMan, второй по счету, мы обсудим конфигурацию и позиционирование камеры и также исследуем
специальные эффекты, которые возможно получить. Хотя позиционирование и не такое интуитивное, как в Pov-Ray, есть
преимущество при описании траекторий камеры. О части последней темы будет рассказано в третьей статье. ВступлениеВо второй статье мы детально рассмотрим модель камеры в RenderMan. Камера является одним из наиболее важных элементов системы рендеринга, она позволяет создавать очень интересные эффекты, например смазывание изображения (который мы рассмотрим при создании картинки движущегося предмета) и глубина сцены (фокусировка). Хотя при помощи камеры можно смоделировать и многие другие эффекты, например блики (вспышки, видные на фотографиях источников света), это чересчур усложнит модель. Вместо этого эти эффекты достигаются изменением свойств объектов с помощью улучшенной системы тонировщиков (shaders) (тонировщик является средством рендеринга текстур объектов). Использование семейства тонировщиков позволяет нам создать наши собственные "тонировщики" и достичь очень впечатляющих эффектов. В этой статье будет обсуждаться процесс программирования и компиляции таких тонировщиков, хотя это очень обширная тема (очень и очень обширная, и прямо сейчас у меня нет особых идей, поэтому мне надо получше ее подготовить). Как было рассказано в предыдущей статье, для рендеринга изображения мы дожны написать: rendrib fichero.ribдля вывода в файл или rendrib -d fichero.ribдля вывода на экран Основные принципы позиционирования камерыСистема координат камеры подчиняется "правилу левой руки" и совпадает с поверхностью монитора. Начальная точка расположена в центре экрана, при этом ось x направлена вправо, ось y вверх и ось z внутрь монитора. По умолчанию "текущая система координат" идентична системе координат камеры, именно так, как показано на первом рисунке (x помечена красным, y зеленым и z синим). На первой картинке изображен сцена, видимая птичьим глазом, а на второй обычное изображение этой сцены (источник света находится в разных местах, чтобы сделать картинки более отчетливыми). Хотя сцена не особенно сложна (по правде говоря, выглядит ужасно), она послужит нам для того, чтобы разобраться с примерами RIB-файлов без их излишнего загромождения сложными геометрическими моделями. Теперь давайте посмотрим, как необходимо позиционировать камеру. Наиболее логичным будет, особенно для тех, кто использует Pov_ray, сдвинуть камеру. Чтобы увидеть сцену с более удаленной точки, нам потребуется переместить камеру в положение <0,0,-20>, это выполняется командой Translate 0 0 -20 до WorldBegin:
Но по этой команде камера переместилась вперед! На самом деле сместилась не камера, а система координат. Вся система координат была смещена назад, в результате камера сместилась вперед. Поэтому, чтобы сместить камеру назад, нам нужно сделать обратное, то есть смещение вперед и думать об этом не как о смещении камеры, а о смещении системы координат (при помощи Translate 0 0 20): Теперь камера находится именно там, где мы и хотели. С этого момента геометрия сцены будет описываться относительно текущей системы координат. В следующем примере модель остается на месте, но мы перемещаем камеру вокруг нее:
Взгляните на файл RIB, содержащий геометрические преобразования положения камеры: Display "camara_default2.tif" "file" "rgb" Projection "perspective" "fov" 45 Format 320 240 1 LightSource "ambientlight" 1 "intensity" 0.3 "lightcolor" [1 1 1] LightSource "distantlight" 2 "intensity" 1.0 "from" [10 10 -10] "to" [0 0 0] Translate 0 0 20 Rotate 45 1 0 0 Rotate 135 0 1 0 WorldBegin Color 1 1 1 # Background blanco Sphere 10000 -10000 10000 360 # Objeto de la escena TransformBegin Color 1 0 0 Sphere 3 -3 3 360 TransformEnd TransformBegin Rotate -90 1 0 0 Translate 0 0 2 Cone 3 3 360 Disk 0 3 360 TransformEnd TransformBegin Rotate -90 0 1 0 Cylinder 1 -4 4 360 Disk 4 1 360 Disk -4 1 360 TransformEnd WorldEnd Там есть смещение (Translate 0 0 20) и два поворота, один по оси x (Rotate 45 1 0 0) и второй по оси y (Rotate 135 0 1 0). Возможно, порядок операций пользователям Pov-Ray может показаться непонятным, так как у них операции применяются в порядке следования, но в случае RenderMan это не так. RenderMan создает очередь операций, до тех пор, пока он не найдет значащий элемент (в нашем примере WorldBegin), и только тогда эти операции применяются к сцене. Из-за того, что операции выстраиваются в очередь, они применяются в обратном порядке, другими словами, последняя указанная операция выполняется первой. Поэтому геометрические операции из нашего примера должнны интерпретироваться следующим образом:
Никогда не забывайте, что все перемещения текущей системы координат (вращения и перемещения) всегда относительны камеры, поэтому вращение по оси x необходимо понимать как "вращенние по оси x камеры" Теперь давайте перейдем к самой интересной части статьи, как использовать модель камеры RenderMan для создания спецэффектов. Смазывание изображения (эмуляция движущихся объектов)Первым эффектом камеры является смазывание изображения, эффект, который имитирует следы, оставляемые на пленке движущимися объектами. Смазывание изображения задается вставкой выражения Shutter 0 1 в разделе нашего примера, задающего параметры камеры. Команда Shutter 0 1 эмулирует время выдержки, в этом случае шторки камеры открываются в момент времени 0 и остаются открытыми на 1 единицу времени. Параметры 0 1 для шторок очень универсальны и мы будем использовать эти параметры, поскольку они указывают только частное поведение камеры RenderMan. Далее мы должны задать в RenderMan, какие элементы сцены движутся, для этого нам необходимо вставить пару MotionBegin MotionEnd. Следующие далее цифры в примере (и его файле RIB) означают, что шар переместился из позиции 0 10 5 в момент 0 в позицию 5 10 0 в момент 1. Выражение MotionBegin [0 1] в файле RB говорит RenderMan, какие моменты времени соответствуют преобразованиям (мгновение 0 соответствует первому и мгновение 1 соответствуют второму) и эти величины должны совпадать со значениями в разделе Shutter. Рисунок отчетливо показывает, что эффект очень реалистичен и анимация оказывает еще большее влияние. Конечно же, преобразования, разрешенные в MotionBegin MotionEnd, не ограничены только перемещениями, RenderMan может обрабатывать нелинейные траектории с эффектом смазывания. В следующем примере мы покажем вращение оси координат на 25 градусов по оси y. Обычно двигаются объекты на сцене. Однако, кроме этого RenderMan позволяет двигать саму камеру, поэтому эффект смазывания картинки можно применять и к самой камере. В этом примере мы сдвинем камеру на 5 единиц вправо (т.е. сдвинем систему координат на 5 единиц вправо), и все объекты на сцене будут смазаны. И конечно же, пара тегов MotionBegin MotionEnd должна находиться в файле RIB в секции камеры: Глубина сцены (фокусировка)И наконец, в RenderMan есть еще один интересный эффект -- "Глубина сцены", или механизм фокусировки камеры. За этот эффект отвечает выражение DepthOfField. Этот элемент требует параметров: f-stop, fov (поле зрения) и focus-lenght (удаленность фокуса). Первый параметр, f-stop, задает предельное расстояние средства фокусировки, в нашем примере объект в 2 единицах или ближе к камере будет казаться одинаково расфокусированным (или сфокусированным). Параметр fov обычно оставляется в значении 1.0, если раньше переспектива была определена как Projection "perspective" "fov" 45 (как в нашем примере), изменение величины на другую просто умножит на эту величину перспективу поля зрения. Наконец, focus-lenght является тем параметром, который нам наиболее интересен, он определяет расстояние, на котором должны находиться объекты, чтобы они выглядели на изображении расфокусированными. В следующем примере камера находится в исходной точке и три шара (в 10, 20 и 30 единицах от нее) и мы покажем несколько вариантов с разными параметрами focus-lenght. В первом изображении используется DepthOfField 2.0 1.0 10, означающее, что любой объект, находящийся в 10 единицах от камеры, будет сфокусирован (красный шар):
Во втором случае DepthOfField 2.0 1.0 20. Теперь фокус будет на зеленом шаре, находящемся в 20 единицах от камеры: Наконец, чтобы сфокусироваться на последнем шаре (расположенном на расстоянии в 30 единиц), нем необходимо задать DepthOfField 2.0 1.0 30: Получаемые эффекты придают создаваемым картинкам большую реалистичность. Конечно же, время, необходимое на расчет этих картинок, увеличивается, и смазывание картинки и глубина сцены требуют несколько проходов системы рендеринга. Translated by Miguel Angel Sepulveda Перевод на русский: Владимир Попов |
Páginas web mantenidas por Miguel Ángel Sepúlveda © Carlos Calzada 1998 LinuxFocus 1998 |