Математические Основы WebGL

Автор: Евгений Рыжков Дата публикации: 26.03.2013

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

Знакомство с базовыми 3d представлениями данных

Расстояние от начала координатной системы и положение точки в пространстве называется координатой.

Отрезок произвольной длинны, называется вектором. Вектор может быть представлен двумя способами:

  1. Заданием компонент вектора.
  2. Заданием направления и модуля вектора.

Компонентами вектора A называются длины проекций этого вектора на каждую из осей координат.

Если вкратце, то компоненты вектора – это просто координаты конечной точки вектора. Задание трехмерного вектора в виде компонент математически выглядит как:

Модулем вектора A называется длинна вектора, она равна по абсолютной величине квадратному корню из суммы квадратов компонент вектора. Любой вектор характеризуется направлением, которое задается одним или более углов между выбранными осями координат (ортами) и модулем этого вектора.

Теперь рассмотрим третий ключевое понятие OpenGL– Матрицы. Матрицей называется объект, состоящий из наборов чисел, сгруппированных в столбцы и строки. В основном в DirectXиспользуются четырехрядные матрицы:

Преобразования векторов и операции с ними

Вектора, можно рассматривать как обычные числа, ведь одной переменной можно присвоить целый вектор:

Математические операции с векторами

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

  1. Сложение векторов
  2. Вычитание векторов
  3. Умножение векторов
  4. Деление вектора на число

Математически это выглядит следующим образом:

Модуль вектора

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

Скалярное и векторное умножении векторов

Умножение векторов отличается от умножения обычных чисел. Во первых, существует два вида умножения векторов: скалярное и векторное.

Результатом скалярного умножения векторов является число, равное косинусу угла между векторами (этот угол определен в плоскости, на которой лежат эти вектора) умноженному на произведение модулей этих векторов:

Результатом векторного умножения векторов является вектор,

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

Норма вектора

Нормой вектора называется модуль вектора.

Нормализованный вектор

Любой вектор, модуль которого равен 1 называется нормализованным на 1 вектором, или просто нормализованным вектором. Такой вектор имеет длину равную единице.

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

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

Символические обозначения векторов

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

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

Такие обозначения потребуется для сокращенного обозначения векторов при использовании их в формулах.

Преобразования матриц и операции с ними

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

Математические операции с матрицами

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

  1. Сложение матриц
  2. Вычитание матриц
  3. Умножение матриц
  4. Деление матрицы на число

Математически это выглядит следующим образом:

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

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

Соответственно, такое же неравенство выполняется для любого количества умножений матриц.

Единичная матрица

В матрицах особую роль играет единичная матрица. Такая матрица имеет следующий вид:

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

Модуль матрицы

Для матрицы, так же как и для вектора определена операция вычисления модуля. В какой-то мере матрицу можно представлять как псевдо-вектор в некотором четырехмерном пространстве. Хотя представления матрицы как вектор не для всех случаев верны, — так как в одних случаях матрица может соответствовать такому представлению, а в других – нет, — но можно вычислить длину такого вектора, в таком случае модуль матрицы будет представлять из себя длину псевдо-вектора, находящегося в четырехмерном пространстве.

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

Матрицы трансформаций

Трансформации бывают трех видов это:

  • Вращение
  • Масштабирование
  • Перемещение

Матрицы трансформаций пригодятся для помещения объекта в нужное место 3d пространства. Причем последовательность таких операций следующая: Сначала мы масштабируем объект, затем поворачиваем объект на нужный угол, потом перемещаем. Если последовательность будет другая, то результат будет непредсказуем, и где объект окажется в 3d пространстве, вы сможете определить сами, если, конечно найдете этот объект. Матрицы вращения бывают для нескольких осей. В основном нужна матрица для вращения вокруг вертикальной оси, она такая:

Матрица масштабирования может быть симметричной и несимметричной. Для второго случая матрица выглядит так:

Несимметричное масштабирование означает, что мы вытягиваем объект в одну сторону больше чем в другие. Если вы хотите пропорционально масштабировать объект, то сделайте все компоненты матрицы x, y, z равными друг другу. Матрица для перемещения выглядит так:

Матрицы, используемые в OpenGL

Для того, чтобы осуществить все необходимые преобразования с объектом, в OpenGL существуют три матрицы. Первая из них располагает в нужном месте 3d пространства объект, остальные две используются для правильного размещения объекта с учетом расположения камеры и перспективы. Итак существуют три матрицы:

  1. Мировая матрица
  2. Матрица камеры
  3. Матрица проекций

В системе OpenGL для этих матриц сделаны следующие обозначения: matrix World, View, Projection. Мировая матрица соответственно равна трем матрицам трансформаций, рассмотренным в предыдущем разделе, умноженным друг на друга.

На рисунке представлено влияние матрицы трансформаций: объект был масштабирован и перемещен из начала координат в нужную точку 3d пространства.

Влияние матрицы камеры: все объекты были повернуты таким образом, как будто на них осуществляется взгляд из определенной точки, находящейся в том месте где находится камера.

Влияние матрицы проекций: объекты располагаются и отображается с нужной перспективой.

Материалы

http://gameinstitute.ru/