теория, алгоритмы, примеры на С++ и OpenGL  

Мы vkontakte.ru


Rambler's Top100 Rambler's Top100
Каталог@Mail.ru - каталог ресурсов интернет

Друзья

Словарь синонимов русского языка

Векторы в пространстве. Однородные координаты. Матрицы преобразований

Вектор в трехмерном пространстве

Вектор в трехмерном пространстве определяется тремя координатами p(x, y, z). При рассмотрении двумерных преобразований вводились однородные координаты. Также будет удобно ввести их при рассмотрении трехмерного пространства. Как мы увидим в дальнейшем, их использование позволяет задавать аффинные и нелинейные преобразования (например перспективное) в виде матриц, что позволяет создавать весьма эффективные и простые реализации.

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

Однородные координаты

Определение. Однородные координаты — координаты, обладающие тем свойством, что определяемый ими объект не меняется при умножении всех координат на одно и то же число.

Однородными координатами вектора (х, у, z) является тройка чисел (x', y', z', w), где х = х' / w, у = y' / w, z = z' / w, а w — некоторое вещественное число (случай, когда w = 0 является особым).

Данные координаты не позволяют однозначно задать точку пространства. Например, (1, 1, 1, 1) и (2, 2, 2, 2) задают одну и ту же точку (1, 1, 1). При переходе к однородным координатам для точки с координатами (x, y, z) предлагается взять набор (x, y, z, 1). В процессе преобразований координата w может меняться. Обратный переход к декартовым координатам осуществляется посредством деления на w-координату.

Матрицы преобразований в трехмерном пространстве

Матрица преобразования для однородных координат имеет размер 4х4. Рассмотрим пример матричного преобразования в однородных координатах.

         |   2    0    0    1    |

M    =   |   0    3    0    2    |

         |   0    0    1   -1    |

         |   0    0    0    1    |

x' = 2 * x + 1

y' = 3 * y + 2

z' = 1 * z – 1

w' = 1

Данная матрица определяет следующее преобразование: растяжение по оси x в два раза, по оси у в три раза и перенос на вектор (1, 2, -1). При этом матрица M применяется к вектору-столбцу слева:

             | M11  M12  M13  M14 |   | px

p' = M * p = | M21  M22  M23  M24 | * | py |

             | M31  M32  M33  M34 |   | pz

             | M41  M42  M43  M44 |   | 1  

Заметим, что вектор p' также представляет собой вектор-столбец. На самом деле возможны две, равноправные с точки зрения математики, записи:

1)      Вектор записывается как столбец:

|    2    0    0    1    |     | x |     | 2 * x + 1 |

|    0    3    0    2    |  *  | y |  =  | 3 * y + 2 |

|    0    0    1   -1    |     | z |     | 1 * z – 1 | 

|    0    0    0    0    |     | 1 |     |     1     |

2)      Вектор записывается как строка, матрица транспонируется:

     |    2    0    0    0    |

        | x  y  z  1 |  *   |    0    3    0    0    |

  |    0    0    1    0    |

  |    1    2   -1    0    |

 

=  | 2 * x + 1    3 * y + 2    1 * z – 1    1 |

C точки зрения самого преобразования эти записи эквивалентны. Какую из них использовать – это вопрос договоренности. На практике, и в OpenGL и в DirectX используется первый вариант, с учетом того, что матрицы укладываются в памяти по столбцам. Т.е. матрица

| M11  M12  M13  M14 |

| M21  M22  M23  M24 |

| M31  M32  M33  M34 |

| M41  M42  M43  M44 |

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

            M11 M21 M31 M41 M12 M22 M32 M42 M13 M23 M33 M43 M14 M24 M34 M44

В трехмерной математике также принято использовать первый вариант записи.

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

Матрица не аффинного преобразования

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

|    1    0    0    0    |

Mproj =   |    0    1    0    0    |

|    0    0    1    0    |

|    0    0   -1    0    |


| x |     |  x  |

pproj = Mproj * p = Mproj *   | y |  =  |  y  |

| z |     |  z  |

| 1 |     | -z  |

pproj = ( -x / z, -y / z, -1, 1 )

Прим. Последняя строка как раз и определяет вид изменений w-координаты исходного вектора.

Резюме

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

Далее нам потребуются следующие вещи, непосредственно связанные с матрицами:

  • Аффинные преобразования в трехмерном пространстве и их матричная запись.
  • Точечные преобразования. Преобразования локальной системы координат. Связь между ними.

Они будут подробно рассмотрены в последующих статьях.