• Добро пожаловать, Гость. Войдите или зарегистрируйтесь.

Автор Тема: Базовые основы 3d-графики  (Прочитано 10671 раз)

Описание:

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Базовые основы 3d-графики
« : 03 Январь, 2007, 03:16:56 »
0
Привожу весьма полезные статьи по базовым основам 3D-графики. Авторы неизвестны, но если отыщутся, я с удовольствием их здесь приведу.

1) В первом посте - толковый словарик - "Словарь терминов 3D-графики ". Будет полезен как начинающим изучать эту дисциплину, так и переводчикам с английского, испытывающим определенные трудности с переводом специальных терминов (именно с этим мы столкнулись при переводе туториалов по моделированию в проекте OSFM).

2) Во втором посте опубликованы "Основы 3d-графики":
    1. Задание объектов и сцен
    2. Проецирование
    3. Матричные преобразования
    4. Рисование одноцветного треугольника
    5. Работа с произвольной камерой[/li]
3) В посте №3 приведена статья "Разновидности 3D-графики ":
  • Полигональная графика
  • Аналитическая графика
  • Фрактальная графика
  • Сплайновая графика
*****************************************

Словарь терминов 3D-графики.[/size]
------------------------------
    2D Graphics
    3D Graphics
    3D Pipeline
    Alpha
    Alpha Blending (Alpha pixel blending)
    Alpha Buffer
    Ambient
    Anti-aliasing
    Atmospheric Effect
    Back buffer
    Bitmap
    Bilinear (bi-linear) Filtering
    BitBLTs
    Blending
    Buffer
    Bump Texture Mapping
    Chroma Keying
    Color
    Colored lighting
    Computer Graphics
    Depth Cueing
    Directional
    Dithering
    Double Buffering
    Environment Map Bump Mapping
    Flat Shading (Flat)
    Fog
    Fogging
    FPS, frames per second
    Frame buffer
    Front buffer
    Gamma
    Gamma Correction
    Gouraud Shading (Smooth shading)
    Hidden Surface Removal
    Interpolation
    Interactive
    Lighting
    Line Buffer
    MIP Mapping
    Occlusion
    Palletized Texture
    Parallel point
    Perspective Correction
    Pipeline
    Pixel
    Pixel blending
    Phong Shading
    Point
    Procedural Texturing
    Projection
    Rasterization
    Ray Tracing
    RGB
    Real-time
    Rendering
    Rendering Engine
    Resolution
    Scissors Clip (Scissoring)
    Set-up Engine
    Span
    Specular highlights
    Spot
    Stippling
    Tessellation
    Texel
    Texture
    Texture Anti-aliasing
    Texture Mapping
    Transformation
    Transparency
    Triangle strip and fans
    Tri-linear Filtering (Tri-linear MIP Mapping)
    True color
    Vertex
    Z-buffer
    Z-buffering
    Z-sorting[/li]
[/color][/size][/font]
------------------------------

2D Graphics
Двумерная графика. Графика, *действие* в которой происходит в одной плоскости. Например, пользовательский интерфейс.

3D Graphics
Трехмерная графика. Визуальное отображение трехмерной сцены или объекта. Для представления трехмерной графики на двумерном устройстве (дисплее) применяют рендеринг (см. Rendering ).

3D Pipeline
3D конвейер. Процесс построения 3D-изображения можно разделить на три последовательных этапа. На первом этапе объект преобразуется в мозаичную модель, т.е. происходит его разделение на множество многоугольников (полигонов). Следующий этап включает в себя геометрические преобразования и установки освещения. Наконец, заключительный этап, так называемый "рендеринг" ( rendering ), который является наиболее важным для качества 3D-изображения, создает двумерное изображение из полученных на предыдущих этапах многоугольников.

Alpha
Коэффициент прозрачности. В описание цвета (RGB) может входить специальный канал, называемый альфа-каналом, который отвечает за прозрачность данного цвета. Т.о. цвет описывается как ARGB.

Alpha Blending (Alpha pixel blending)  
Реальный мир состоит из прозрачных, полупрозрачных и непрозрачных объектов. Alpha Blending - это способ передачи информации о прозрачности полупрозрачным объектам. Эффект прозрачности и просвечивания достигается путем смешивания значений цветов исходного и результирующего пикселей. Разделение изображения на многоугольники производится с использованием маски, плотность которой зависит от прозрачности объекта. В результате цвет точки является комбинацией цветов переднего и заднего плана. Обычно, Alpha имеет нормализованное значение от 0 до 1 для каждого цветного пиксела. Новый пиксел = (alpha)(цвет пиксела А) + (1 - alpha)(цвет пиксела В)

Alpha Buffer  
Альфа буфер. Дополнительный буфер, в котором содержится информация о прозрачности, таким образом пиксел имеет четырехзначное представление (RGBA) и в 32-разрядном буфере содержится 24 бита информации о цвете, т.е. 8 бит на каждый из цветов (красный, зеленый и синий), и 8 бит на значение alpha.
См. также Transparency

Ambient
Световой источник, который светит одинаково во всех направлениях. Все объекты освещаются с равной интенсивностью.

Anti-aliasing  
Анти-алиасинг. Способ обработки (интерполяции) пикселов для получения более четких краев (границ) изображения (объекта). Наиболее часто эта техника используется для создания плавного перехода от цвета линии или края к цвету фона. В некоторых случаях результатом является смазывание (blurring) краев.
Скриншоты (прикреплены к посту):
Без Анти-алиасинга.
С Анти-алиасингом.
 
Atmospheric Effect
Специальные эффекты, например, туман, позволяющие улучшить рендеринг изображений реального мира.

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

Bitmap
Способ кодирования изображения пиксел за пикселом.

Bilinear (bi-linear) Filtering  
Метод устранения искажений изображения (устранение "блочности" текстур при их увеличении). При медленном вращении или движении объекта (приближение/удаление) могут быть заметны перескакивания пикселов с одного места на другое, т.е. появляется блочность. Для снижения этого эффекта при билинейной фильтрации берется взвешенное среднее значение цвета четырех смежных текстурных пикселов (texels) и в результате определяется цвет текстуры.

BitBLTs  
BitBLT = Bit Block Transfer. БитБлет. Наиболее важная функция для ускорения графики в средах, использующих оконный интерфейс GUI (Graphic User Interface). BitBLT - фактически означает просто перемещение блока данных из одного места в другое, которое производится с учетом требований графической памяти. Например, эта функция используется при каждом перемещении окна, таким образом BitBLT - просто передача блока пикселов. Более сложное использование этой функции связано с ситуациями, требующими некоторого преобразования исходных данных, например, когда каждый "одноцветный" бит исходных данных расширяется до "цветного" с использованием цветовых палитр переднего или заднего плана перед тем, как он будет выведен на экран.

Blending
Блендинг. Комбинирование двух или более объектов с использованием некоторого базиса пикселов.

Buffer
Буфер. Область временного хранения данных, часто используется для компенсации разницы в скорости работы различных компонентов системы. Часто в качестве буфера используется дополнительная память, зарезервированная для временного хранения данных, которые передаются между центральным процессором системы и периферией (такими, как винчестер, принтер или видеоадаптер). Особенно полезен буфер для компенсации разницы в уровнях интенсивности потоков данных, для обеспечения места размещения данных, когда процессы асинхронны (например, данные, переданные в контроллер видеоплаты, должны дождаться, когда графический процессор закончит выполнение текущей операции и считает новую порцию информации), и для сохранения данных в неизменном виде (как буфер для видеокадра). Некоторые буферы являются частью адресуемой памяти центрального процессора системы, другие буферы памяти являются частью периферийных устройств.

Bump Texture Mapping
В отличие от texture mapping, технология bump mapping подразумевает использование как минимум еще одной (обычно в оттенках серого) текстуры, которая служит в качестве карты для рельефа, который должен проявиться при визуализации. Эта технология разработана для придания дополнительной детализации и объемности объектам без изменения их геометрических размеров. В случае, если bump map будет не статичной, а анимированной, то можно достичь эффектов визуального изменения геометрии объекта во времени.

Chroma Keying  
Chroma Keying или текстурная прозрачность - возможность определять основной цвет в карте текстур и делать его прозрачным в процессе текстурирования изображения. В связи с тем, что не все объекты легко моделируются с использованием многоугольников, сhroma keying используется при включении в сцену сложных объектов в виде карт текстур.

Color
Цвет. Это индивидуальные компоненты белого света, по разному воспринимаемые человеческим глазом. Цветные мониторы используют три основных компонента цвета, на которые реагирует человеческий глаз: красный, зеленый и голубой. Цвет, который в итоге отображается на экране, образуется в результате смешения этих трех основных цветов.

Colored lighting
Цветовое освещение. Освещение источниками разного цвета, при этом происходит смешение цвета. Совсем недавно цветовое освещение стало использоваться в новейших 3D играх (Quake2, Unreal, Prey, Half Life).

Computer graphics
Компьютерная графика. Общее направление, описывающее создание или манипуляцию графическими изображениями и изобразительными данными с помощью компьютера. Может использоваться в CAD, анимации, дизайне, архитектуре, деловой графике и т.д. Системы для компьтерной графики обычно являются интерактивными, т.е. отображают изображение на дисплее таким, каким оно создано, или в виде, в который преобразована исходная картинка.

Depth Cueing  
Уменьшение интенсивности освещения текстур при удалении объекта от точки наблюдения.

Directional
Световой источник, который освещает одинаково все объекты сцены, как бы из бесконечности в определенном направлении. Обычно используется для создания удаленных световых источников (таких как Солнце).

Dithering  
Способ получения изображения 24-битного качества с использованием 8- или 16-битных буферов. Два цвета используются для моделирования третьего и обеспечиваются плавные переходы между элементами изображения.

Double Buffering  
Двойная буферизация. Представьте себе старый трюк аниматоров, нарисованный на уголках стопки бумаги персонаж мультика, со слегка изменяемым положением на каждом следующем листе, затем пролистав всю стопку, отгибая уголок, мы увидим плавное движение нашего героя. Практически такой же принцип работы имеет и Double Buffering в 3D анимации, т.е. следующее положение персонажа уже нарисовано до того, как текущая страница не пролистана. Без применения двойной буферизации движущееся изображение не будет иметь требуемой плавности, т.е. будет прерывистым. Для двойной буферизации требуется наличие двух областей, зарезервированных в буфере кадров трехмерной графической платы; обе области должны соответствовать размеру изображения, выводимого на экран.
Метод использования двух буферов для получения изображения: один для отображения картинки, другой для рендеринга. В то время как отображается содержимое одного буфера, в другом происходит рендеринг. Когда очередной кадр обработан, буфера переключаются (меняются местами). Таким образом наблюдатель все время видит отличную картинку. (см. Back Buffer )

Environment Map-Bump Mapping
Технология, являющаяся дальнейшим развитием Bump Mapping. В этом случае, помимо базовой текстуры объекта, применяется еще две текстуры:
1. Текстура, являющаяся отрендеренным вариантом трехмерной сцены вокруг объекта (environment map)
2. Текстура - карта рельефа (bump map).
Самостоятельно и совместно с Procedural Texturing данная технология позволяет получить такие натуральные эффекты, как отражение, отражение в кривом зеркале, дрожжание поверхностей, искажение изображения, вызываемое водой и теплым воздухом, трансформация искажений по шумовым алгоритмам, имитация туч на небе и др.
 
Flat Shading (Flat)  
Метод затенения, называемый также постоянным затенением. Поверхность объекта, построенного с использованием этого метода, получается наиболее низкого качества и изображение выглядит как бы поделенным на блоки. Flat Shading даёт более худший результат, чем, допустим, метод Gourad , но, в то же время, и работает значительно быстрее.

Fog
Вид blending для объекта с фиксированными цветом и пикселами, удаляющимися от точки наблюдения.

Fogging  
Затуманивание. Образуется за счет комбинирования смешанных компьютерных цветовых пикселов с цветом тумана (fog) под управлением функции, определяющей глубину затуманивания.

FPS, frames per second  
Частота смены кадров. Чтобы оценить быстродействие системы трехмерной визуализации, достаточно запустить приложение, динамически создающее трехмерные сцены, и подсчитать число кадров в секунду, которое система способна отобразить. Однако единого, достаточно авторитетного теста такого рода еще не создано. Большинство имеющихся тестов основаны на фрагментах трехмерных игр и проверяют поведение графической карты на весьма ограниченном наборе функций.
Например, известная фирма Ziff Davis выпустила тестовый пакет 3D Winbench'98.

Frame buffer  
Буфер кадра. Специально отведенная область памяти компьютера или отдельной платы для временного хранения данных о пикселах, требуемых для отображения одного кадра (полного изображения) на экране монитора. Емкость буфера кадра определяется количеством битов, задействованных для определения каждого пиксела, который должен отображать изменяемую область или количество цветов и их интенсивность на экране.

Front buffer
Первичный буфер. Область памяти из которой происходит вывод кадра на экран (расчет производится в back buffer).

Gamma  
Характеристики дисплеев, использующих фосфор, нелинейны. Небольшое изменение напряжения, когда общий уровень напряжения низок, приводит к изменению уровня яркости, однако такое же небольшое изменение напряжения не приведет к такому же заметному изменению яркости в случае, если общее напряжение велико. Этот эффект или, точнее, разница между тем, что должно быть и тем, что реально измерено, называется гаммой.

Gamma Correction  
Перед выводом на дисплей линейные данные RGB должны быть обработаны (скорректированы) для компенсации гаммы (нелинейной составляющей) дисплея.

Gouraud Shading (Smooth shading)  
Затенение методом Гуро (или плавное затенение), один из наиболее популярных алгоритмов затенения, который обеспечивает прорисовку плавных теней вокруг изображаемого объекта, что позволяет изображать трехмерные объекты на плоском экране.
Метод назван по имени его разработчика, француза Генри Гуро. Gouraud Shading или цветовая интерполяция - процесс, с помощью которого цветовая информация интерполируется по поверхности многоугольника для определения цветов в каждом пикселе. Информация о цвете связывается с каждым пикселом каждого многоугольника с использованием линейной интерполяции по всему множеству многоугольников.
Или, затенение Гуро работает, считывая информацию о цвете каждого треугольника, на которые разбита поверхность объекта, и плавно интерполирует интенсивность красного, зеленого и голубого цветов по трем координатам.
Этот метод уменьшает "блочность" изображения (смотри Flat Shading) и используется для отображения металлических и пластиковых поверхностей.
В результате действия этого алгоритма должен создаваться эффект, заставляющий глаза зрителя экстраполировать информацию о глубине и кривизне поверхности изображаемого объекта.

Hidden Surface Removal  
Удаление скрытых поверхностей. Метод определения видимых для наблюдателя поверхностей. Позволяет не отображать невидимые из данной точки поверхности объекта.

Interpolation  
Интерполяция - математический способ восстановления отсутствующей информации. Например, необходимо увеличить размер изображения в 2 раза, со 100 пикселов до 200. Недостающие пикселы генерируются с помощью интерполяции пикселов, соседних с тем, который необходимо восстановить. После восстановления всех недостающих пикселов получается 200 пикселов вместо 100 существовавших, и таким образом изображение увеличилось вдвое.

Interactive  
Интерактивность. Этим термином описывается поведение прикладной программы, с помощью которой пользователь может влиять на результат деятельности приложения, имея возможность немедленно добавить, изменить, или удалить получающийся результат.

Lighting
Существуют разные методы, использующие реалистичные графические эффекты для отображения 3D объектов на двумерном дисплее. Один из них - освещение. Используются разные уровни яркости (светло-темно) при отображении объекта для придания ему объема.

Line Buffer  
Линейный буфер - буфер памяти, используемый для хранения одной линии видеоизображения. Если горизонтальное разрешение дисплея установлено равным 640 и для кодирования цвета используется схема RGB, то линейный буфер будет иметь размер 640х3 байт. Линейный буфер обычно используется в алгоритмах фильтров.

MIP Mapping  
Multum in Parvum - с латыни переводится как "много в одном". Метод улучшения качества текстурных изображений при помощи использования текстур с разным разрешением для различных объектов одного и того же изображения, в зависимости от их размера и глубины. Таким образом в памяти хранятся несколько копий текстурированного изображения в различных разрешениях. В результате этого изображение остается качественным при приближении к объекту и при удалении от него. При использовании этого метода Вы увидите изображение в высоком разрешении, находясь близко от объекта, и изображение в низком разрешении, при удалении от объекта. MIP Mapping снижает мерцание и "зашумленность" изображения, возникающие при texture mapping.
Mip mapping использует некоторые умные методы для упаковки данных о текстурах изображения в памяти. Чтобы использовать Mip mapping необходимо, взяв все размеры текстур и умножив это число на два, построить одну карту наибольшего размера. Все карты меньшего размера обычно фильтруются и становятся усредненными и уменьшенными версиями самой большой карты.

Occlusion  
Эффект перекрытия в трехмерном пространстве одного объекта другим.

Palletized Texture  
Формат хранения текстур в сжатом виде (1-, 2-, 4- и 8-битный формат вместо 24-битного). Обеспечивает возможность хранения большего числа текстур в меньшем объеме памяти.

Parallel point  
Световой источник, который освещает равномерно все объекты параллельным пучком света.

Perspective Correction  
Один из способов создания реалистичных объектов. Рассматриваются величины Z (глубина) при разделении объекта на многоугольники. При создании современных игр разработчики обычно используют довольно большого размера треугольники для описания поверхности объекта и используют текстурные карты для более точного и детального изображения. Без этого качество картинки было бы гораздо хуже.
Если 3D объект движется от наблюдателя, то уменьшаются его линейные размеры (высота и ширина). Без использования функции perspective correction объект будет дергаться и двигаться нереалистично. С каждым уровнем скорректированной перспективы происходят изменения на пиксел, в зависимости от глубины. Так как при этом происходит деление на пикселы, то требуются очень интенсивные вычисления.

Pipeline  
Конвейер. В случае с графикой - серия шагов по созданию и отображению трехмерного изображения. Первый шаг – трансформация – создается трехмерный объект и отображается на плоскость. Второй шаг – добавление освещенности объекту. Третий шаг – рендеринг цветов и теней многоугольников для соответствующих текстур.

Pixel  
Пиксель. Комбинированный термин, обозначающий элемент изображения, являющийся наименьшим элементом экрана монитора. Другое название - pel.
Изображение на экране состоят из сотен тысяч пикселей, объединенных для формирования изображения. Пиксель является минимальным сегментом растровой строки, которая дискретно управляется системой, образующей изображение. С другой стороны, это координата, используемая для определения горизонтальной пространственной позиции пикселя в пределах изображения. Пиксели на мониторе - это светящиеся точки яркого фосфора, являющиеся минимальным элементом цифрового изображения. Размер пикселя не может быть меньше точки, которую монитор может образовать. На цветном мониторе точки состоят из групп триад. Триады формируются тремя различными фосфорами: красным, зеленым и синим. Фосфоры располагаются вдоль сторон друг друга. Пиксели могут отличаться размерами и формой в зависимости от монитора и графического режима. Количество точек на экране определяется физическим соотношением ширины к высоте трубки.

Pixel blending  
Метод смешивания цветов текущего пикселя и пикселя, находящегося уже в буфере кадра, для получения выходного пикселя. Если ввести следующие обозначения: R1, G1, B1, A1, где каждый из символов соответственно представляет красную, зеленую, синюю и альфа компоненты текущего пикселя. Тогда R2, G2, B2, A2 – аналогично для пикселя, уже находящегося в буфере.

Source Alpha Pixel Blending - добавление прозрачности, т.е. – (R1*A1+R2*(1-A1), G1*A1+G2*(1-A1), B1*A1+B2*(1-A1))

Add Pixel Blending - суммирование цветов, т.е. (R1+R2, G1+G2, B1+B2)

Modulate Pixel Blending - модуляция цветов, т.е. (R1*R2, G1*G2, B1*B2)

Phong Shading  
Наиболее эффективный из всех известных методов затенения, позволяющий получить реалистичное освещение. Прекрасная реалистичность достигается за счет вычисления объема освещения для каждой точки, вместо множества многоугольников. Каждый пиксел получает свой собственный цвет на основе модели освещения, направленного на этот пиксел. Этот метод требует более интенсивных вычислений, чем метод Гуро.

Point  
Световой источник, который светит одинаково во всех направлениях из одной точки (например, лампочка в комнате).

Procedural Texturing techniques (программное текстурирование)
Procedural Texturing techniques (или программное текстурирование) - это метод наложения реалистичных текстур на "лету", т.е. путем математических аппроксимаций структуры таких материалов как дерево, мрамор, камень и др. (Сравните с простым текстурированием).

До последнего времени Procedural Texturing редко использовалось как в программных, так и акселерированных игровых и других движках реального времени. В первом случае - ввиду того, что подобные вычисления требуют колоссальных мощностей математического сопроцессора для приемлемой скорости рендеринга, а во втором случае - потому, что "шумовые" алгоритмы Перлина, которые используются для генерации таких текстур, не стандартны и имеют много вариаций. Более того, процесс генерации текстур, различных по типу, требует различных схемных подходов, в то время как традиционное наложение текстур требует одинакового схемного решения для загрузки любого изображения. После появления на свет технологии MMX от Intel ситуация сменилась, и уже сущестуют разработки программной реализации "шума" Перлина на основе этой технологии, которые позволяют накладывать текстуры на лету, со скоростью, сравнимой с простым текстурированием.

Характерные особенности:
Доступны любые качество и разрешение текстур, возможна их моментальная смена на "лету" (+)
Трехмерность (+)
Высокие требования к производительности CPU (-)
Минимальные требования к количеству памяти компьютера (+)
Процесс сложноуправляем (-)
Ограниченность применения. Неприменим для имитации людей, картин, торговых марок и этикеток, рисунков и т.д. (-)

Projection
Процесс преобразования трех размерностей в две. Т.е. преобразование видимой части 3D объекта для отображения на двумерном дисплее.

Rasterization
Разделение объекта на пикселы.

Ray Tracing  
"Трассировка лучей" - один из самых сложных и качественных методов построения реалистических изображений. Наиболее распространен вариант "обратной трассировки лучей": от глаза наблюдателя, через пиксел строящегося изображения, проводят луч и, учитывая все его отражения от объектов, вычисляют цвет этого пиксела.

RGB
Система цветообразования, в которой конечный цвет получается за счет смешения, с различной интенсивностью, трех основных цветов: красного (Red), зеленого (Green) и синего (Blue). Самое известное устройство, которое использует систему RGB, это цветной монитор.

Real-time  
Режим реального времени, при этом иммитируемые события происходят так же, как и в реальной жизни. Для достижения этого используется синхронизация со встроенным таймером компьютера.

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

Rendering Engine
Дословно - устройство рендеринга. Часть графической системы, которая рисует 3D- примитивы, такие как треугольники или другие простые многоугольники. Практически во всех реализациях системы rendering engine отвечает за интерполяцию краев (границ) объектов и заполнение пикселами многоугольников.

Resolution  
Разрешение. Количество пикселей представленное битами в видеопамяти, или адресуемое разрешение. Видеопамять может организовываться соотношением пикселов (битов) по оси x (пикселы на строке) к числу пикселов по оси y (столбцы) и к размеру отводимой памяти на представление глубины цвета. Стандартная видеопамять VGA 640 пикселов на 480 пикселов и, обычно, с глубиной представления цвета 8 бит. Чем выше разрешение, тем более детально изображение, тем больше нужно хранить о нем информации. Но не вся хранимая информация может быть отображена на дисплее.

Scissors Clip (Scissoring)
Устанавливается положение контрольного пиксела относительно вырезаемых многоугольников, и многоугольник отбрасывается, если он находится вне отображаемой зоны. Т.е. сокращаются размеры буфера кадра, за счет вырезания "ненужных" многоугольников.

Set-up Engine
Set-up engine позволяет драйверам передавать многоугольники в rendering engine в виде информации об адресах их вершин, в то время, как, обычно, информация предварительно обрабатывается центральным процессором и передается в терминах изменения (дельт) границ, цвета и текстуры. Таким образом, set-up engine переносит обработку соответствующих данных с центрального процессора на графический чипсет, сокращая таким образом требования к скорости шины на 30% для обработки маленьких, случайно расположенных треугольников, и на пропорционально большее значение для больших многоугольников.

Span  
В растровой графике примитивы формируются с помощью преобразования линий развертки, каждая из которых пересекает примитив в двух точках (Р-левая и Р-правая). Последовательность пикселов на линии, расположенная между этими двумя точками, называется span. Каждый пиксел внутри span содержит значения величин z, R, G, B.

Specular highlights  
Световая характеристика, которая определяет то, как свет будет отражаться от объектов.

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

Stippling  
Создание контурных изображений, т.е. "рисование пунктиром".

Tessellation  
Процесс деления изображения на более мелкие формы. Для описания характера поверхности объекта она делится на всевозможные многоугольники. Наиболее часто при отображении графических объектов используется деление на треугольники и четырехугольники, так как они легче всего обсчитываются и ими легко манипулировать.

Texel  
Элемент текстуры – определенный пиксель в текстуре.

Texture  
Двумерное изображение, хранящееся в памяти компьютера или графического акселератора в одном из пиксельных форматов. В случае хранения в сжатом виде на дисках компьютера текстура может представлят собой обычный бит-мап, который мы привыкли видеть в форматах bmp, jpg, gif и т.д. Перед использованием текстура разворачивается в памяти и может занимать объем в десятки раз больше первоначального размера. Существует порядка двух десятков более или менее стандартизированных пиксельных форматов текстур.

Texture Anti-aliasing  
Удаление нежелательных искажений растровых изображений с помощью интерполяции текстурных изображений.

Texture Mapping (Наложение текстур )  
Традиционно термином texture mapping в трехмерном моделировании называют процесс наложения двухмерной текстуры на трехмерный объект (текстура как бы натягивается на объект) для придания ему соответствующего внешнего вида. Таким образом, например, производится "раскрашивание" моделей монстров и игроков в трехмерных играх типа Quake и др.

Характерные особенности простого наложения текстур:
Обработка не требует значительных вычислительных мощностей (+)
Высокие требования к количеству оперативной памяти компьютера (-)
Загрузка текстуры производится исключительно из ОЗУ (-)
Как правило, смена разрешения, требует смены текстуры (-)
Можно использовать и отображать практически любые изображения, будь то фотографии или рисунки. (+)
Простота реализации (+)

Transformation  
Изменение координат. Последовательность математических операций над выходными графическими примитивами и геометрическими атрибутами для преобразования их из рассчетных координат в системные координаты.

Transparency  
Прозрачность. В компьютерной графике цвет часто описывается в терминах RGB величин, или величинами красного, зеленого и синиго цвета. Существует еще коэффициент Alpha (альфа), являющийся дополнительным компонентом цвета, который используется для смешения. Коэффициент Alpha может также использоваться в качестве величины, отвечающей за степень прозрачности, т.е. величины, определяющей, можно ли видеть сквозь цвет или нет. Наиболее важное значение коэффициент Alpha, или прозрачность, имеет в 3D графике, благодаря его использованию для создания нерегулярных объектов, применяя для этого лишь несколько многоугольников.

triangle strip and fans  
При наличии смежных треугольников, описывающих поверхность фигуры, не требуется передавать информацию о всех трех вершинах каждого из них, а просто передается сразу последовательность треугольников, для каждого из которых определяется лишь одна вершина. В результате снижаются требования к ширине полосы пропускания.

Tri-linear Filtering (Tri-linear MIP Mapping)  
Метод уменьшения искажений в картах текстур, использующий билинейную фильтрацию для четырех текстурных пикселов из двух ближайших MIP-карт и их дальнейшую интерполяцию.
Для получения изображения берется взвешенное среднее значение результатов двух уровней билинейной фильтрации. Полученное изображение более четкое и менее мерцающее.
Текстуры, с помощью которых формируется поверхность объекта, изменяют свой вид в зависимости от изменения расстояния от объекта до положения глаз зрителя. При движущемся изображении, например, по мере того, как объект удаляется от зрителя, карты текстур должны уменьшаться в размерах вместе с уменьшением размера отображаемого объекта. Для того, чтобы выполнить это преобразование, графический процессор фильтрует карты текстур, вплоть до соответствующего размера, для покрытия поверхности объекта, при этом изображение остается естественным, т.е. объект не деформируется непредвиденным образом. Для того, чтобы избежать таких непредвиденных изменений, большинство графических программ создают серии пред-фильтрованных карт текстур с уменьшенным разрешением, этот процесс называется mip mapping. Затем графическая программа автоматически определяет, какую карту текстур использовать, основываясь на деталях карты текстур изображения, которое уже выведено на экран. Соответственно, если объект уменьшается в размерах, размер карты текстур тоже уменьшается.

True color
Цвет с глубиной представления 24 или 32 бит.

Vertex
Точка в трехмерном пространстве, где соединяются несколько линий.

Z-buffer
Часть графической памяти, в которой хранятся расстояния от точки наблюдения до каждого пиксела (значения Z). Z-buffer определяет, какая из многих перекрывающихся точек наиболее близка к плоскости наблюдения.
Также, как большее число битов на пиксель для цвета в буфере кадра соответствует большему количеству цветов, доступных в системе изображения, так и количество бит на пиксель в z-буфере соответствует большему числу элементов. Обычно z-буфер имеет не менее 16 бит на пиксел для представления глубины цвета. Аппаратные акселераторы 3D графики могут иметь собственный z-буфер на графической карте, чтобы избежать удвоенной нагрузки на системную шину при передаче данных. Некоторые рализации Z-buffer используют для хранения не целочисленное значение глубины, а значение с плавающей запятой от 0 до 1.

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

Z-sorting  
Процесс удаления невидимых поверхностей с помощью сортировки многоугольников в порядке низ-верх, предшествующий рендерингу. Таким образом при рендеринге верхние поверхности обрабатываются последними. Результаты рендеринга получаются верными только, если объекты не близки и не пересекаются. Преимуществом этого метода является отсутствие необходимости хранения значений глубины. Недостатком является высокая загрузка процессора и ограничение на пересекающиеся объекты.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Базовые основы 3d-графики
« Ответ #1 : 03 Январь, 2007, 03:32:52 »
0
Основы 3D-графики [/size]

1. Задание объектов и сцен

Покажем здесь достаточно распространенную схему задания 3D объектов и сцен.
Подобная схема, кстати, используется, в 3D Studio.
Каждая сцена представляет собой следующее:
- набор объектов
- набор источников света
- набор текстур
- набор камер (хотя обычно используется одна)

Каждый объект задается следующим:
- набор вершин
* вершина определяется своими 3D координатами и соответствующими ей координатами в текстуре
- набор граней
* грань определяется тремя вершинами и текстурой (вообще говоря, не текстурой, а материалом: кроме текстуры могут быть заданы, например, коэффициенты рассеивания и отражения света)
- поведение объекта
* то есть, расположение (то есть смещение, ось поворота, угол поворота, коэффициент масштабирования, и т.д.) в зависимости от номера кадра; обычно задается в нескольких ключевых точках и интерполируется между ними с помощью сплайнов

Каждый источник света задается следующим:
- положение
- ориентация (точка, в которую направлен этот источник, target)
- тип (фоновый/направленный/ненаправленный)
- цвет (обычно RGB)

Каждая текстура представляет собой прямоугольную 2D картинку, часто бывает фиксированных размеров (например, 64x64, 128x128, 256x256).

Каждая камера задается следующим:
- положение (location)
- направление (точнее, точкой, в которую направлена эта камера; target)
- угол зрения (FOV)
- угол поворота относительно своей оси (roll)

2. Проецирование

Мы будем использовать только обычное перспективное проецирование на плоскость зрения "стандартной" камеры, определенной в пункте 1.1 (там же написаны и формулы проецирования). Случай произвольной камеры будет приводиться к случаю стандартной камеры.

3. Матричные преобразования

Вообще говоря, лучше всего немного почитать любую книжку по линейной алгебре. Здесь будет только краткий рассказ о 3D преобразованиях, о том, как их делать с помощью матриц, и о том, что же такое матрицы и как с ними работать.
Введем несколько терминов. n-мерный вектор, он же вектор размерности n, он же вектор размера n: упорядоченный набор n действительных чисел. Вообще говоря, практически то же самое, что и обычный 1D-массив. Матрица размера m на n (будет обозначаться как m*n, mxn): таблица размера m на n, в каждой клетке которой - действительное число. Это уже 2D-массив. Всего лишь. Вот пример матрицы 3x3:

[ 15 y*z 0.6 ]
[ 7 -3 91 ]
[ sin(x) 0.123 exp(t) ]

Займемся определением операций над векторами и матрицами. Вектор будем записывать в столбик и рассматривать его как матрицу размера n*1.
Операция скалярного произведения векторов: определена для двух векторов одинаковых размеров. Результат есть число, равное сумме произведений соответствующих элементов векторов. Пример:

[ 1 ] [ 4 ]
[ 2 ] * [ 5 ] = 1*4 + 2*5 + 3*6 = 32
[ 3 ] [ 6 ]

Операция векторного произведения: определена для (n-1) вектора одинакового размера n. Результат - вектор, причем, что интересно, перпендикулярный всем множителям. Результат меняется от перестановки мест множителей!!! Формально определяется как определитель матрицы, первая строка которой есть все базисные вектора, а все последующие - соответствующие координаты всех множителей. Поскольку нам она будет требоваться только для 3D пространства, мы определим векторное произведение двух 3D векторов явно:

[ Ax ] [ Bx ] | i j k | [ Ay*Bz-Az*By ]
AxB = [ Ay ] x [ By ] = | Ax Ay Az | = [ Az*Bx-Ax*Bz ]
[ Az ] [ Bz ] | Bx By Bz | [ Ax*By-Ay*Bx ]

Операция сложения двух матриц: определена для матриц одинаковых размеров. Каждый элемент суммы (то есть, каждое число в таблице) равняется сумме соответствующих элементов слагаемых-матриц. Пример:

[ 1 x 500 ] [ 8 a 3 ] [ 9 a+x 503 ]
[ 2 y 600 ] + [ 9 b 2 ] = [ 11 b+y 602 ]
[ 3 z 700 ] [ 10 c 1 ] [ 13 c+z 701 ]

Операция умножения матрицы на число: определена для любой матрицы и любого числа; каждый элемент результата равняется произведению соответствующего элемента матрицы-множителя и числа-множителя.

Операция умножения двух матриц: определена для двух матриц таких размеров a*b и c*d, что b = c. Например, если b = c, но a != d, то при перестановке множителей операция будет вообще не определена. Результатом умножения матрицы A размером a*b на матрицу B размером b*d будет матрица C размером a*d, в которой элемент, стоящий в строке i и столбце j, равен произведению строки i матрицы A на столбец j матрицы B. Произведение строки на столбец определяется как сумма произведений соответствующих элементов строки и столбца. Чтобы было хоть чуть-чуть понятно, пример умножения строки на столбец (они должны быть равной длины, кстати; поэтому и такие ограничения на размеры матриц):

[ 4 ]
[ 1 2 3 ] * [ 5 ] = 1*4 + 2*5 + 3*6 = 32
[ 6 ]

А чтобы перемножить две матрицы, надо эту операцию проделать для каждого элемента. Вот пример:

[ 1 2 3 ] [ 0 3 ] [ 1*0+2*1+3*2 1*3+2*4+3*5 ]
[ 4 5 6 ] * [ 1 4 ] = [ 4*0+5*1+6*2 4*3+5*4+6*5 ] = ...
[ 7 8 9 ] [ 2 5 ] [ 7*0+8*1+9*2 7*3+8*4+9*5 ]

Умножение и сложение матриц обладают почти тем же набором свойств, что и обычные числа, хотя некоторые привычные свойства не выполняются (например, A*B != B*A); нам на самом деле понадобится знать, что произведение вида A*B*C*D*... не зависит от того, как расставить скобки. Или, если угодно, что

A*(B*C) = (A*B)*C.

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

Перенос точки (кстати, точки будут также рассматриваться как вектора с началом в начале координат и концом в собственно точке) с координатами (x,y,z) на вектор (dx,dy,dz) делается простым сложением всех координат. То есть результат - это (x+dx,y+dy,z+dz). Как бы сложили вектор-точку и вектор-перенос.

Поворот - занятие уже более интересное. Но тоже простое. Рассмотрим для примера поворот точки (x,y,z) относительно оси z. В этом случае z не меняется вообще, а (x,y) меняются так же, как и при 2D повороте относительно начала координат.

Посмотрим, какие будут координаты у точки A' - результата поворота A(x,y) на угол alpha.

Пусть r = sqrt(x*x+y*y). Пусть угол AOx равен phi, тогда из рисунка видно, что cos(phi) = x/r, sin(phi) = y/r. Угол A'OA равен по условию alpha. Отсюда

x' = r*cos(alpha+phi) = r*(cos(alpha)*cos(phi)-sin(alpha)*sin(phi)) =
= (r*cos(phi))*cos(alpha)-(r*sin(phi))*sin(alpha) =
= x*cos(alpha)-y*sin(alpha)
y' = r*sin(alpha+phi) = r*(cos(alpha)*sin(phi)+sin(alpha)*cos(phi)) =
= (r*cos(phi))*sin(alpha)+(r*sin(phi))*cos(alpha) =
= x*sin(alpha)+y*cos(alpha)

Для трехмерного случая, таким образом

x' = x*cos(alpha)-y*sin(alpha)
y' = x*sin(alpha)+y*cos(alpha)
z' = z

Аналогичные формулы получатся и для других осей поворота (то есть Ox, Oy). Поворот относительно произвольной оси, проходящей через начало координат, можно сделать с помощью этих поворотов - сделать поворот относительно Ox так, чтобы ось поворота стала перпендикулярна Oy, затем поворот относительно Oy так, чтобы ось поворота совпала с Oz, сделать собственно поворот, а затем обратные повороты относительно Oy и Ox. Можно даже вывести формулы для такого поворота и убедиться в том, что они очень громоздкие.

Вспомним о матрицах и векторах и внимательно посмотрим на выведенные формулы для поворота. Можно заметить, что

[ x' ] = [ cos(alpha) -sin(alpha) 0 ] [ x ]
[ y' ] = [ sin(alpha) cos(alpha) 0 ] [ y ]
[ z' ] = [ 0 0 1 ] [ z ]

То есть поворот на угол alpha задается одной и той же матрицей, и с помощью этой матрицы (умножая ее на вектор-точку) можно получить координаты повернутой точки. Пока никакого выигрыша не видно - здесь умножение матрицы на вектор требует больше операций, чем расчет x' и y' по формулам.

Удобство матриц для нас заключается как раз в свойстве A*(B*C) = (A*B)*C. Пусть мы делаем несколько поворотов подряд, например, пять (как раз столько, сколько надо для поворота относительно произвольной оси), и пусть они задаюся матрицами A, B, C, D, E (A - матрица самого первого поворота, E - последнего). Тогда для вектора p мы получаем

p' = E*(D*(C*(B*(A*p)))) = E*D*C*B*A*p = (E*D*C*B*A)*p =
= (E*(D*(C*(B*A))))*p = T*p,

где

T = (E*(D*(C*(B*A))))

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

Таким образом, можно задать любой поворот матрицей, и любая комбинация поворотов также будет задаваться матрицей, которую можно довольно легко посчитать. Но есть еще параллельный перенос, есть еще масштабирование. Что делать с ними?

На самом деле, эти преобразования тоже легко записываются в виде матриц. Только вместо матриц 3x3 и 3-мерных векторов используются так называемые однородные 4-мерные координаты и матрицы 4x4. При этом вместо векторов вида
[ x ]
[ y ]
[ z ]

используются вектора вида
[ x ]
[ y ]
[ z ]
[ 1 ]

а вместо произвольных матриц 3x3 используются матрицы 4x4 такого вида:
[ a b c d ]
[ e f g h ]
[ i j k l ]
[ 0 0 0 1 ]

Видно, что если d = h = l = 0, то в результате применения всех операций получается то же самое, что и для матриц 3x3.

Матрица параллельного переноса теперь определяется как
[ 1 0 0 dx ]
[ 0 1 0 dy ]
[ 0 0 1 dz ]
[ 0 0 0 1 ]

Матрицу масштабирования можно определить и для матриц 3x3, и для матриц 4x4:
[ kx 0 0 ] [ kx 0 0 0 ]
[ 0 ky 0 ] или [ 0 ky 0 0 ]
[ 0 0 kz ] [ 0 0 kz 0 ]
[ 0 0 0 1 ]

где kx, ky, kz - коэффициенты масштабирования по соответствующим осям.

Таким образом, получаем следующее. Любое нужное нам преобразование пространства можно задать матрицей 4x4 определенной структуры, разной для разных преобразований. Результат последовательного выполнений нескольких преобразований совпадает с результатом одного преобразования T, которое также задается матрицей 4x4, вычисляемой как произведение матриц всех этих преобразований. Важен порядок умножения, так как A*B != B*A. Результат применения преобразования T к вектору [ x y z ] считается как результат
умножения матрицы T на вектор [ x y z 1 ]. Вот и все.

Осталось только на примере показать, почему A*B != B*A. Пусть A - матрица переноса, B - поворота. Если мы сначала перенесем объект, а потом повернем относительно центра координат (это будет B*A), получим далеко не то, что будет, если сначала объект повернуть, а потом перенести (это уже A*B).

4. Рисование одноцветного треугольника

Без понимания того, как рисовать залитый одним цветом треугольник, дальше лезть в 3D графику явно не стоит. Поэтому вот объяснение.

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

Отсортируем вершины так, чтобы вершина A была верхней, C - нижней, тогда у нас min_y = A.y, max_y = C.y, и нам надо пройтись по всем линиям от min_y до max_y. Рассмотрим какую-то линию sy, A.y <= sy <= C.y. Если sy < B.y, то она пересекает стороны AB и AC; если sy >= B.y - то стороны BC и AC. Мы знаем координаты всех вершин, поэтому мы можем написать уравнения сторон и найти пересечение нужной стороны с прямой y = sy. Получим два конца отрезка. Так как мы не знаем, какой из них левый, а какой правый, сравним их координаты по x и обменяем значения, если надо. Рисуем этот отрезок, повторяем процедуру
для каждой строки - и вуаля, трегуольник нарисован.

Остановимся более подробно на нахождении пересечения прямой y = sy (текущей строки) и стороны треугольника, например AB. Напишем уравнение прямой AB в форме x = k*y+b:

x = A.x+(y-A.y)*(B.x-A.x)/(B.y-A.y)

Подставляем сюда известное для текущей прямой значение y = sy:

x = A.x+(sy-A.y)*(B.x-A.x)/(B.y-A.y)

Вот, в общем-то, и все. Для других сторон пересечение ищется совершенно точно
так же. А вот и пример кода.

// ...
// здесь сортируем вершины (A,B,C)
// ...
for (sy = A.y; sy <= C.y; sy++) {
x1 = A.x + (sy - A.y) * (C.x - A.x) / (C.y - A.y);
if (sy < B.y)
x2 = A.x + (sy - A.y) * (B.x - A.x) / (B.y - A.y);
else
x2 = B.x + (sy - B.y) * (C.x - B.x) / (C.y - B.y);
if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
drawHorizontalLine(sy, x1, x2);
}
// ...

Надо, правда, защититься от случая, когда B.y = C.y - в этом (и только этом, потому как если C.y = A.y, то треугольник пустой и рисовать его не стоит, или можно рисовать горизонтальную линию; а если B.y = A.y, то sy >= A.y и до деления на B.y - A.y не дойдет) случае произойдет попытка деления на ноль.
Код изменится совсем чуть-чуть:

// ...
// здесь сортируем вершины (A,B,C)
// ...
for (sy = A.y; sy <= C.y; sy++) {
x1 = A.x + (sy - A.y) * (C.x - A.x) / (C.y - A.y);
if (sy < B.y)
x2 = A.x + (sy - A.y) * (B.x - A.x) / (B.y - A.y);
else {
if (C.y == B.y)
x2 = B.x;
else
x2 = B.x + (sy - B.y) * (C.x - B.x) / (C.y - B.y);
}
if (x1 > x2) { tmp = x1; x1 = x2; x2 = tmp; }
drawHorizontalLine(sy, x1, x2);
}
// ...

Вот и все. Ну, горизонтальную линию, надеюсь, нарисовать сумеют все желающие.

5. Работа с произвольной камерой
----------------------------------

Рассмотрим любую камеру как точку - центр проецирования и экран - плоский прямоугольник в 3D пространстве, на плоскость которого идет проецирование. Наша стандартная камера, например, задается точкой (0,0,-dist) и экраном с вершинами (-xSize/2,ySize/2), ..., (xSize/2,-ySize/2). Можно задать эту систему тремя векторами, задающими с точки зрения камеры направления вперед, вправо и вверх; вектор "вперед" соединяет центр проецирования и центр экрана, вектор "вправо" соединяет центр экрана и правую его границу, вектор "вверх", соответственно, центр экрана и верхнюю его границу. Обозначим эти вектора как p, q и r соответственно, а центр проецирования за s. Вот пример для стандартной камеры.

Здесь (для стандартной камеры; обозначим ее вектора как Sp, Sq, Sr, Ss)
Sp = p = (0,0,dist)
Sq = q = (xSize/2,0,0)
Sr = r = (0,ySize/2,0)
Ss = s = (0,0,-dist)

Любые три взаимно перпендикулярных вектора и точка - центр координат задают в 3D пространстве систему координат. Так что объект мы можем рассматривать в системе обычных координат (x,y,z), в системе координат стандартной камеры (Sp,Sq,Sr) или в системе (p,q,r), соответствующей какой-то произвольной камере. В любом случае, если (a,b,c) - координаты точки в системе координат камеры (точнее, в системе координат с центром в точке s и базисом (p,q,r)), то координаты проекции точки на экране равны

screenX = xSize/2 + xSize/2 * a/c
screenY = ySize/2 - ySize/2 * b/c

В случае стандартной камеры переход от обычной системы координат к системе координат камеры очевиден:
a = x / (xSize/2)
b = y / (ySize/2)
c = (z + dist) / dist

Подставив это в формулы для screenX, screenY, получим как раз те самые формулы
для проекции на стандартную камеру.

Поскольку со стандартной камерой нам достаточно удобно и понятно работать, для произвольной камеры мы должны сделаеть такое преобразование пространства, что как бы совместит произвольную камеру и стандартную камеру. То есть, такое преобразование, что вектора p, q, r перейдут в Sp, Sq, Sr, а точка s в точку Ss.

Посчитаем матрицу для *обратного* преобразования; оно должно переводить Sp,Sq, Sr, Ss в p, q, r, s. Преобразование, переводящее Ss в s (и наоборот) - это обычный паралелльный перенос; остается написать преобразование перевода Sp, Sq, Sr в p, q, r. Пусть у нас есть координаты p, q, r в системе координат (x,y,z):

p = (px,py,pz)
q = (qx,qy,qz)
r = (rx,ry,rz)

Для Sp, Sq, Sr координаты (в этой же системе) известны и равны следующему:

Sp = (0,0,dist)
Sq = (xSize/2,0,0)
Sr = (0,ySize/2,0)

Пусть T - искомая матрица перевода,

[ a b c ]
T = [ d e f ], a..i - какие-то неизвестные.
[ g h i ]

Поскольку T переводит Sp, Sq, Sr в p, q, r; то есть

p = T*Sp
q = T*Sq
r = T*Sr

то, подставляя, например, p и Sp, получаем:

[ px ] [ a b c ] [ 0 ] [ c*dist ]
[ py ] = [ d e f ] [ 0 ] = [ f*dist ], откуда
[ pz ] [ g h i ] [ dist ] [ i*dist ]

c = px/dist
f = py/dist
i = pz/dist.

Аналогично находим все остальные элементы матрицы T:

[ qx*2/xSize rx*2/ySize px/dist ]
T = [ qy*2/xSize ry*2/ySize py/dist ]
[ qz*2/xSize rz*2/ySize pz/dist ]

Но нас интересует обратное к этому преобразование. Оно задается обратной матрицей к T, то есть такой матрицей T1, что

[ 1 0 0 ]
T * T1 = T1 * T = [ 0 1 0 ]
[ 0 0 1 ]

Обратная матрица, вообще говоря, существует далеко не всегда, да и вычисление ее в общем случае - достаточно неприятная задача. Однако в данном случае из-за специального вида матрицы T (конкретнее, из-за того, что T - ортогональная матрица) она не только всегда существует, но и считается очень просто:
[ qx*2/xSize rx*2/ySize px/dist ] [ qx1 rx1 px1 ]
T = [ qy*2/xSize ry*2/ySize py/dist ] = [ qy1 ry1 py1 ]
[ qz*2/xSize rz*2/ySize pz/dist ] [ qz1 rz1 pz1 ]

[ qx1/lq qy1/lq qz1/lq ]
T1 = [ rx1/lr ry1/lr rz1/lr ]
[ px1/lp py1/lp pz1/lp ]

где

lp = px1*px1 + py1*py1 + pz1*pz1
lq = qx1*qx1 + qy1*qy1 + qz1*qz1
lr = rx1*rx1 + ry1*ry1 + rz1*rz1

Сделав сначала параллельный перенос, совмещающий s и Ss, а потом полученное преобразование, как раз и получим преобразование, переводящее произвольную камеру в стандартную.

Теперь надо выяснить, как, собственно посчитать координаты p, q, r через имеющиеся у нас характеристики: положение, направление, угол зрения и угол поворота. 3D Studio (и мы вслед за ней) рассчитывает эти вектора по такому алгоритму:

1. Считаем p = target - location
2. Если p.x == 0 и p.z == 0, то q = (0, 0, 1); иначе q = (p.z, 0, -p.x)
3. Считаем r = crossProduct(p, q) - векторное произведение p на q
4. Считаем lp = length(p) - длина p
5. Приводим r и q к длине 2*lp*tan(FOV/2)

Здесь мы не учитываем поворот камеры вокруг своей оси, его удобнее сделать после перехода к стандартной камере - в этом случае получаем обычный поворот относительно оси z на угол roll.

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

FinalCameraMatrix = RollMatrix * T1 * MoveMatrix

Расчет матриц RollMatrix и MoveMatrix очевиден.
Награды За огромный вклад в развитие Румора

Оффлайн Garin

  • *
  • Сообщений: 1564
  • Репутация: 5
  • Пол: Мужской
    • ICQ клиент - 244260055
    • Просмотр профиля
    • tiarum.com
Базовые основы 3d-графики
« Ответ #2 : 03 Январь, 2007, 03:42:05 »
0
Разновидности 3D-графики

Полигональная графика
Аналитическая графика
Фрактальная графика
Сплайновая графика


Полигональная графика

      Наиболее распространенной на сегодняшний день является полигональная графика. Это объясняется прежде всего высокой скоростью ее обработки. Любой объект полигональной графики задается набором полигонов. Полигон - это плоский многоугольник. Простейшим вариантом являются треугольные полигоны, ибо, как известно, через любые три точки в пространстве можно провести плоскость. Каждый полигон задается набором точек. Лучше всего задавать набор точек в том порядке, в каком они расположены относительно внешней нормали полигона, так как в данном случае полностью решается проблема удаления нелицевых граней без дополнительных затрат при последующей обработке. Точка же задается тремя координатами - x, y, z. Таким образом, Вы можете задать 3-мерный объект как массив или как структуру.

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

      Аналитическая графика заключается в том, что объекты задаются аналитически, т.е. формулами.       Например:
Шар радиуса r с центром в точке (x 0 , y 0 , z 0 ):

(x-x 0 ) 2 +(y-y 0 ) 2 +(z-z 0 ) 2 =r 2

Эллипсоид с радиусами a, b, c и с центром в точке (x 0 , y 0 , z 0 ):

(x-x 0 ) 2 /a 2 +(y-y 0 ) 2 /b 2 +(z-z 0 ) 2 /c 2 =1

Гиперболоиды с радиусами a, b, c и с центром в точке (x 0 , y 0 , z 0 ):

-(x-x 0 ) 2 /a 2 +(y-y 0 ) 2 /b 2 +(z-z 0 ) 2 /c 2 =1

(x-x 0 ) 2 /a 2 -(y-y 0 ) 2 /b 2 +(z-z 0 ) 2 /c 2 =1

(x-x 0 ) 2 /a 2 +(y-y 0 ) 2 /b 2 -(z-z 0 ) 2 /c 2 =1

Параболоиды с центром в точке (x 0 , y 0 , z 0 ):

a(x-x 0 ) 2 +b(y-y 0 ) 2 +c(z-z 0 ) =0

a(x-x 0 ) 2 +b(y-y 0 )+c(z-z 0 ) 2 =0

a(x-x 0 )+b(y-y 0 ) 2 +c(z-z 0 ) 2 =0

Объекты цилиндрического вида:

a(x-x 0 ) 2 +b(y-y 0 ) 2 +c=0

a(x-x 0 ) 2 +b+c(z-z 0 ) 2 =0

a+b(y-y 0 ) 2 +c(z-z 0 ) 2 =0

a(x-x 0 ) 2 +b(y-y 0 )=0

a(x-x 0 ) 2 +c(z-z 0 )=0

a(x-x 0 )+b(y-y 0 ) 2 =0

a(x-x 0 )+c(z-z 0 ) 2 =0

и т.д..

      Комбинируя различные формулы друг с другом, можно получить оригинальные объекты обтекаемой формы. Но вся сложность заключается в нахождении формулы требуемого объекта.       Другой способ создания аналитических объектов - это создание тел вращения. Так, вращая круг вокруг некоторой оси, можно получить тор, а, вращая одновременно сильно вытянутый эллипс вокруг собственной и внешней осей, можно получить достаточно красивый рифленый тор.

Фрактальная графика

      Алгоритмы фракталов могут создавать невероятные трехмерные изображения. Ключевое понятие любого фрактала - самоподобие. Объект называют самоподобным, когда увеличенные части объекта походят на сам объект и друг на друга.       Рассмотрите простую сферу. Является ли она самоподобной? Нет. При значительно большом увеличении она теряет сходство со сферой и начинает походить на плоскость. Сфера не самоподобна.       Местность относится к "самоподобному" классу. Зазубренный край сломанного горного камня в ладони вашей руки имеет те же самые очертания, что и горный хребет на горизонте. Благодаря этому, мы можем использовать фракталы для генерирования поверхности местности, которая походит на саму себя, независимо от масштаба, в котором она отображена.       Чтобы смоделировать случайную поверхность, мы нуждаемся в двумерном массиве значений высоты. Заметьте, что, хотя наша цель состоит в том, чтобы сгенерировать объемные координаты, массив должен хранить только значения высоты.       Приписывая цвет к каждому значению высоты, Вы можете отождествить отображение высоты с изображением. Теперь рассмотрим как обрабатывать наш двумерный массив значений высоты.       Идея:       Вы начинаете с большим пустым 2-мерным массивом точек. Размерность должна быть (2 m +1)x(2 m +1), где m - натуральное число. Установите значения в углах на одинаковое значение высоты.       Это - отправная точка для итерации обработки, состоящей из 2-х пунктов:
Вы берете квадрат и генерируете случайное значение в середине квадрата. Значение середины рассчитывается как арифметическое среднее четырех значений в углах, плюс случайная величина. Это дает Вам ромбы.
Вы берете каждый ромб и генерируете случайное значение в центре ромба. Значение середины рассчитывается как арифметическое среднее четырех значений в углах, плюс случайная величина, сгенерированная в том же самом диапазоне. Это дает Вам снова квадраты.
      Так, после 1-го прохода Вы закончили бы с четырьмя квадратными полигонами, а после 2-го - с 16 . Третий проход привел бы к 64 квадратным полигонам. Количество полигонов растет очень быстро. Число сгенерированных квадратных полигонов равно 4 i , где i - число итераций через рекурсивную функцию. Поэтому при большей детализации Вам потребуется намного больше вычислительных ресурсов.       На этом, пожалуй, стоит заканчить рассмотрение фрактальной графики.

Сплайновая графика

      Историю сплайнов принято отсчитывать от момента появления первой работы Шенберга в 1946 году. Сначала сплайны рассматривались как удобный инструмент в теории и практике приближения функций. Однако довольно скоро область их применения начала быстро расширяться, и обнаружилось, что существует очень много сплайнов самых разных типов. Сплайны стали активно использоваться в численных методах, в системах автоматического проектирования и автоматизации научных исследований, во многих других областях человеческой деятельности и, конечно, в компьютерной графике.       Сам термин "сплайн" происходит от английского spline. Именно так называется гибкая полоска стали, при помощи которой чертежники проводили через заданные точки плавные кривые. В былые времена подобный способ построения плавных обводов различных тел, таких как, например, корпус корабля, кузов автомобиля был довольно широко распространен в практике машиностроения. В результате форма тела задавалась при помощи набора очень точно изготовленных сечений - плазов. Появление компьютеров позволило перейти от этого, плазово-шаблонного, метода к более эффективному способу задания поверхности обтекаемого тела. В основе этого подхода к описанию поверхностей лежит использование сравнительно несложных формул, позволяющих восстанавливать облик изделия с необходимой точностью. Ясно, что для большинства тел, встречающихся на практике, вряд ли возможно отыскание простых универсальных формул, которые описывали бы соответствующую поверхность глобально, то есть, как принято говорить, в целом. Это означает, что при решении задачи построения достаточно произвольной поверхности обойтись небольшим количеством формул, как правило, не удастся. Вместе с тем аналитическое описание (описание посредством формул) внешних обводов изделия, то есть задание в трехмерном пространстве двумерной поверхности, должно быть достаточно экономным. Это особенно важно, когда речь идет об обработке изделий на станках с числовым программным управлением. Обычно поступают следующим образом: задают координаты сравнительно небольшого числа опорных точек, лежащих на искомой поверхности, а через эти точки проводят плавные поверхности. Именно так поступает конструктор при проектировании кузова автомобиля (ясно, что на этой стадии процесс проектирования сложного объекта содержит явную неформальную составляющую). На следующем шаге конструктор должен получить аналитическое представление для придуманных кривых или поверхностей. Вот для таких задач и используются сплайны.       Средства компьютерной графики, особенно визуализация, существенно помогают при проектировании, показывая конструктору, что может получиться в результате, и давая ему многовариантную возможность сравнить это с тем, что сложилось у него в голове.       Достаточно типичной является следующая задача: по заданному массиву точек в пространстве построить поверхность либо проходящую через все эти точки (задача интерполяции), либо проходящую вблизи от этих точек (задача сглаживания).       Сглаживающая поверхность строится относительно просто, в виде так называемого тензорного произведения. Так принято называть поверхности, описываемые параметрическими уравнениями вида
r(u,v)=S i= 0 m S j=0 n a i (u)b j (v)V ij

      Рассмотрим элементарную бикубическую поверхность Безье. Параметрические уравнения фрагмента этой поверхности имеют следующий вид:
r(u, v)=S i= 0 3 S j=0 3 C 3 j C 3 i u i (1-u) 3-i v j (1-v) 3-j V ij

0<=u<=1; 0<=v<=1

      Элементарная бикубическая поверхность Безье обладает следующими свойствами:
лежит в выпуклой оболочке порождающих ее точек;
является гладкой поверхностью;
упираясь в точки Vоо, Vоз, Vзо, Vзз, касается исходящих из них отрезков контрольного графа заданного набора.
      Более подробную информацию о сплайновых поверхностях Вы можете найти в книгах, целиком посвященных сплайнам и сплайновым поверхностям.
Награды За огромный вклад в развитие Румора

Теги:
 

Сравнение графики

Автор TiaraРаздел Архив старых тем из раздела Skyrim

Ответов: 27
Просмотров: 2651
Последний ответ 09 Июнь, 2011, 08:56:45
от Tiara
Современная Терминология 3d Графики

Автор GarinРаздел Мастерская 3D

Ответов: 17
Просмотров: 7460
Последний ответ 11 Январь, 2007, 01:53:22
от Garin
Жуткости консольной графики

Автор Kris†a™Раздел Архив старых тем из раздела Skyrim

Ответов: 40
Просмотров: 3638
Последний ответ 04 Июль, 2011, 16:00:20
от Roland
Wiki: Oblivion:Основы создания моделей волос

Автор WikiBotРаздел Мастерская TES IV

Ответов: 0
Просмотров: 841
Последний ответ 28 Ноябрь, 2011, 19:01:26
от WikiBot
Wiki: Morrowind:Основы файловой системы

Автор WikiBotРаздел Мастерская TES III

Ответов: 0
Просмотров: 689
Последний ответ 22 Октябрь, 2011, 20:00:50
от WikiBot
Wiki: Morrowind:Основы работы с диалогами

Автор WikiBotРаздел Мастерская TES III

Ответов: 0
Просмотров: 812
Последний ответ 23 Октябрь, 2011, 08:13:07
от WikiBot
Настройки ультра-качества графики Skyrim от Майка

Автор TiaraРаздел Технические вопросы по TES 5

Ответов: 3
Просмотров: 42333
Последний ответ 19 Ноябрь, 2011, 23:28:25
от Майк
Улучшения Графики Skyrim'a

Автор ScorpyXРаздел Технические вопросы по TES 5

Ответов: 37
Просмотров: 59107
Последний ответ 26 Февраль, 2012, 00:27:19
от MorviCool

Поиск

 
Top
SimplePortal 2.3.5 © 2008-2012, SimplePortal