Сдвиг плоскости на вектор

learnopengl. Урок 1.7 — Трансформации

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

Часть 2. Базовое освещение

Часть 3. Загрузка 3D-моделей

Часть 4. Продвинутые возможности OpenGL

Часть 5. Продвинутое освещение

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

Как бы то ни было, для полного понимания трансформаций мы, во первых, должны разобраться с векторами. Основная задача этой главы — дать вам основные математические знания, которые нам понадобятся позже.

Содержание
  1. Вектора
  2. Скалярные векторные операции
  3. Обратный вектор
  4. Сложение и вычитание
  5. Длина
  6. Умножение вектора на вектор
  7. Скалярное произведение
  8. Векторное произведение
  9. Матрицы
  10. Сложение и вычитание
  11. Умножение матрицы на скаляр
  12. Умножение матриц
  13. Умножение матрицы на вектор
  14. Единичная матрица
  15. Матрица масштабирования
  16. Матрица сдвига
  17. Матрица вращения
  18. Комбинирование матриц
  19. На практике
  20. Движения плоскости. Теорема Шаля. Афинные преобразования плоскости
  21. Преобразования плоскости
  22. Движения плоскости
  23. 1. Параллельный перенос (сдвиг) на заданный вектор
  24. 2. Поворот вокруг заданной точки, называемой центром поворота, на заданный угол
  25. 3. Центральная симметрия (симметрия относительно заданной точки, называемой центром симметрии)
  26. 4. Осевая симметрия (симметрия относительно заданной прямой, называемой осью симметрии)
  27. 5. Скользящая симметрия (композиция осевой симметрии относительно заданной прямой и параллельного переноса на заданный отличный от нуля вектор, параллельный этой прямой)
  28. Движения плоскости, сохраняющие ориентацию. Движения плоскости, изменяющие ориентацию. Теорема Шаля
  29. Аффинные преобразования плоскости
  30. 1. Сжатие (растяжение) к прямой с заданным коэффициентом сжатия (растяжения)
  31. 2. Сжатие (растяжение) по двум заданным взаимно перпендикулярным направлениям с заданными коэффициентами сжатия (растяжения)
  32. 3. Гомотетия с заданным центром гомотетии и заданным коэффициентом сжатия (растяжения)
  33. 4. Преобразование подобия с заданным коэффициентом подобия
  34. Классификация аффинных преобразований плоскости
  35. Что такое движения плоскости: параллельный перенос, поворот. Преобразование подобия. Гомотетия
  36. 🌟 Видео

Видео:Направляющий и нормальный вектор прямой на плоскости | Векторная алгебраСкачать

Направляющий и нормальный вектор прямой на плоскости | Векторная алгебра

Вектора

В самом простом определении, вектора — это не более чем направления. У вектора может быть направление и магнитуда (также иногда называется модулем или длиной). Вы можете представлять себе вектора в качестве направлений на карте сокровищ: “Сделайте 10 шагов налево, теперь 3 шага на север и теперь 5 шагов направо”. В данном примере “налево” — это направление, а “10 шагов” — это длина вектора. Направления на этой карте сокровищ составляются из 3 векторов. Вектора могут иметь любую размерность, но чаще всего используются двухкомпонентные и четырехкомпонентные вектора. Если вектор двухкомпонентный, то он описывает направление на плоскости (или на 2D графике), если вектор трехкомпонентный, то он описывает направление в трехмерном мире.

Ниже вы можете видеть 3 вектора, каждый из которых представлен в виде (x, y) в качестве стрелок на 2D графике. Поскольку более интуитивно представлять вектора в 2D (чем в 3D), то вы можете думать о 2D векторах, как о 3D векторах, но с нулевой z координатой. До тех пор, пока вектор описывает направление — позиция вектора не меняет его значения. На графике можно увидеть, что вектора v и w одинаковы, хотя из позиции отличаются:

Сдвиг плоскости на вектор

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

Сдвиг плоскости на вектор

Поскольку вектора зачастую описывают направление — то иногда их тяжело представить в виде позиции. Обычно мы визуализируем вектор следующим образом: мы устанавливаем центр в (0, 0, 0), а затем указываем направление, описанное точкой. Таким образом получается позиционный вектор (также мы можем взять за центр другую точку, а потом сказать “Этот вектор указывает на точку в пространстве из этой точки”). Позиционный вектор (3, 5) будет указывать на точку (3, 5) на графе с основанием (0, 0). С помощью векторов мы можем описывать как направления так и позиции в двухмерном и трехмерном пространствах.

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

Скалярные векторные операции

Скаляр — это одно число (или однокомпонентный вектор, если вы хотите продолжать работать с векторами). Во время сложения/вычитания/умножения или деления вектора на скаляр мы просто складываем/вычитаем/умножаем или делим каждый элемент вектора на этот скаляр. Пример:

Сдвиг плоскости на вектор

Где вместо сложения может быть вычитание, умножение или деление.

Обратный вектор

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

Сдвиг плоскости на вектор

Сложение и вычитание

Сложение двух векторов производится покомпонентно. Пример:

Сдвиг плоскости на вектор

Визуально сумма векторов v=(4,2) и k=(1,2) выглядит так:

Сдвиг плоскости на вектор

Также как и с обычным сложением и вычитанием, вычитание векторов — это тоже сложение, но с обратным вторым вектором:

Сдвиг плоскости на вектор

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

Сдвиг плоскости на вектор

Длина

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

Сдвиг плоскости на вектор

Поскольку длина сторон (x, y) известна, и мы хотим узнать длину гипотенузы — то мы делаем это следующим образом:

Сдвиг плоскости на вектор

Где ||v|| — это длина вектора v. Такая формула легко расширяется в 3D добалением z^2. Пример расчета длины:

Сдвиг плоскости на вектор

Вычисленное значение: 4.47

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

Сдвиг плоскости на вектор

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

Видео:Математика без Ху!ни. Уравнение плоскости.Скачать

Математика без Ху!ни. Уравнение плоскости.

Умножение вектора на вектор

Умножение двух векторов выполняется довольно странно. Нормальное умножение не применимо, поскольку оно не имеет визуального смысла, но у нас есть 2 специфических подхода, из которых можно выбирать во время умножения: первый — скалярное произведение, которое изображается как точка, а второе — векторное произведение, которое изображается как крест.

Скалярное произведение

Скалярное произведение двух векторов эквивалентно скалярному произведению длин этих векторов, умноженное на косинус угла между ними. Если это предложение сбило вас с толку, то посмотрите на формулу:

Сдвиг плоскости на вектор

Где угол между векторами описан как тета. Почему это может быть интересно? Что же, представим если вектора v и k являются единичными векторами. Соответственно формула сокращается до:

Сдвиг плоскости на вектор

Теперь скалярное произведение определяет только угол между двумя векторами. Вы возможно помните, что функция cos становится 0, с углом в 90 градусов ну и 1 с углом 0. Это позволяет легко проверять ортогональны ли вектора или параллельны друг другу (ортогональность означает, что вектора прямоугольны). Если хотите узнать больше про sin или cosine, то рекомендую видео Khan Academy про базовую тригонометрию.

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

Так как же считать скалярное произведение? Скалярное произведение — это умножение компонентов векторов и последующее сложение результатов. Пример:

Сдвиг плоскости на вектор

Для вычисления угла между векторами нам потребуется обратить функцию косинуса (cos^-1) в данном случае — это 143.1 градуса. Таким образом мы эффективно вычислили угол между этими двумя векторами. Скалярное произведение очень полезно во время работы со светом.

Векторное произведение

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

Сдвиг плоскости на вектор

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

Сдвиг плоскости на вектор

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

Видео:ГРАФИК ФУНКЦИЙ — Сдвиги Графика Функции, Как строить Графики Функции // Алгебра 8 классСкачать

ГРАФИК ФУНКЦИЙ — Сдвиги Графика Функции, Как строить Графики Функции // Алгебра 8 класс

Матрицы

Теперь, после того как мы обсудили почти все на счет векторов, настало время углубиться в матрицы. Матрица, обычно, это четырехугольних из набора чисел, символов и/или выражений. Вот пример матрицы 2х3:

Сдвиг плоскости на вектор

Доступ к элементам матрицы осуществляется с помощью (i,j), где i — это строка, а j — это столбец. Вот почему матрица выше называется 2х3 (3 столбца и 2 строки). Такая система — обратна той, что используется в 2D графах (x, y). Для получения значения 4 из матрицы выше, мы должны указать индекс (2, 1) (вторая строка, первый столбец).

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

Сложение и вычитание

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

Сдвиг плоскости на вектор

Скаляр просто прибавляется во всем элементам матрицы. Тоже самое происходит и при вычитании:

Сдвиг плоскости на вектор

Сложение и вычитание между двумя матрицами выполняется поэлементно. Таким образом операции сложения и вычитания могут быть применены только к матрицам одинакового размера. Пример:

Сдвиг плоскости на вектор

Тоже самое, только с вычитанием:

Сдвиг плоскости на вектор

Умножение матрицы на скаляр

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

Сдвиг плоскости на вектор

Видео:18+ Математика без Ху!ни. Скалярное произведение векторов. Угол между векторами.Скачать

18+ Математика без Ху!ни. Скалярное произведение векторов. Угол между векторами.

Умножение матриц

Умножение матриц не очень сложное, но и не такое простое. Умножение имеет несколько ограничений:

  1. Вы можете умножать только матрицы, где число столбцов первой совпадает с числом строк второй матрицы.
  2. Умножение матриц не коммутативно. A * B != B * A.

Вот пример умножения двух матриц 2х2:

Сдвиг плоскости на вектор

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

Сдвиг плоскости на вектор

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

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

В результате получается матрица размером (n, m), где n — количество строк в левой матрице, а m — количество столбцов в правой матрице.

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

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

Сдвиг плоскости на вектор

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

Умножение матрицы на вектор

Мы уже использовали вектора в прошлых уроках. Мы использовали их, чтобы представлять позиции, цвета и текстурные координаты. Теперь давайте немного углубимся в кроличью нору и расскажем, что вектор — это на самом деле просто Nx1 матрица, где N — это количество компонентов вектора. Если вы чуть подумаете об этом — это имеет смысл. Вектора, прямо как матрицы — массив чисел, но только с 1 колонкой. И как же нам поможет эта информация? Что же, если у нас есть матрица MxN мы сможем ее умножить на Nx1 вектор, так как количество столбцов матрицы равно количеству строк вектора.

Но зачем нам вообще уметь умножать матрицу на вектор? Довольно много различных 3D/2D трансформаций можно выполнить, умножая матрицу на вектор, получая измененный вектор. Если вы все еще не уверены в том, что полностью понимаете текст выше, то вот немного примеров:

Видео:Аналитическая геометрия, 1 урок, Векторы в пространствеСкачать

Аналитическая геометрия, 1 урок, Векторы в пространстве

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

В OpenGL обычно работают с матрицами трансформации размерами 4х4 по той причине, что большинство векторов имеет 4 компонента. Самая простая матрица трансформации которую можно обсудить — это единичная матрица. Единичная матрица — это NxN матрица, заполненная нулями, но с 1 по диагонали. Как мы можете заметить эта матрица совершенно не изменяет вектор:

Сдвиг плоскости на вектор

Вектор выглядит нетронутым. Это становится очевидно из правил умножения: первый результирующий элемент — это каждый элемент первой строки матрицы, умноженные на каждый элемент вектора. Поскольку каждый элемент строки равен 0, кроме первого — то мы получаем 1 * 1 + 0 * 2 + 0 * 3 + 0 * 4 = 1. Тоже самое применяется и к остальным 3 элементам вектора.

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

Видео:Векторный метод в стереометрии. Задача 14 профильный ЕГЭСкачать

Векторный метод в стереометрии. Задача 14 профильный ЕГЭ

Матрица масштабирования

Когда мы масштабируем вектор — мы увеличиваем длину стрелки на величину масштабирования, сохраняя направление. Пока мы работаем в 2 или 3 размерностях мы можем определить масштабирование вектором из 2 или 3 величин, каждая из которых масштабирует одну из осей (x, y или z).

Давайте попробуем масштабировать вектор v = (3,2). Мы будем масштабировать вектор по оси x на 0.5, что сделает его в 2 раза уже; и масштабируем вектор по оси y на 2, что увеличит высоту в 2 раза. Давайте посмотрим как будет выглядеть если мы масштабируем вектор на (0.5, 2). Запишем результат в виде s.

Сдвиг плоскости на вектор

Помните, что OpenGL зачастую работает в 3D пространстве, соответственно для 2D можно оставить Z координату, равную 1. Операция масштабирования, которую мы только что выполнили, является неоднородной, поскольку величина масштабирования для каждой оси различается. Если бы величина масштабирования была бы одинаковой — то такое преобразование называется однородным.

Давайте построим матрицу трансформации которая выполнит для нас масштабирование. Мы уже увидели на единичной матрице, что диагональный элемент будет умножен на соответствующий элемент вектора. Что если мы заменим единицы в единичной матрице на тройки? В таком случае мы умножим все элементы вектора на это значение. Соответственно если мы представим величины масштабирования как (S1, S2, S3) то мы сможем определить матрицу масштабирования для любого вектора (x, y, z):

Сдвиг плоскости на вектор

Заметьте, что 4 элемент вектора равняется 1. Этот компонент обозначается как w и будет потом использован для других задач.

Матрица сдвига

Сдвиг — это процесс добавления одного вектора к другому для получения нового вектора с другой позицией, то-есть сдвиг вектора на основании вектора сдвига. Мы уже обсуждали сложение векторов, поэтому для вас это не будет чем-то новым.
Также как и с матрицей масштабирования в матрице 4х4 есть несколько позиций для выполнения требуемых операций, для сдвига — это верхние 3 элемента четвертой колонки. Если мы представим вектор сдвига как (Tx, Ty, Tz) — то мы можем определить матрицу сдвига следующим образом:

Сдвиг плоскости на вектор

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

Гомогенные координаты
Компонента вектора w также называется гомогенной координатой. Для получения 3D вектора из гомогенной координаты мы делим x, y и z координаты на w. Обычно этого не замечают, так как w большую часть времени равна 1.0. Использование гомогенных координат имеет несколько преимуществ: они позволяют нам выполнять сдвиги на 3D векторах (без w компоненты это было бы невозможно) и в следующей главе мы используем значение w для создания 3D визуализаций.
Также когда гомогенная координата равна 0 — то вектор считается вектором направления, так как вектор с компонентой w равной 0 не может быть сдвинут.

С матрицей сдвига мы можем двигать объекты по всем 3 направлениям (x, y, z), что делает эту матрицу крайне полезной для наших задач.

Матрица вращения

Последние пару трансформаций были довольно просты для понимания и представления в 2D или 3D пространстве, но вращения немного более заковыристые. Если вы хотите узнать как же именно эти матрицы формируются — то я рекомендую видео Khan Academy про линейную алгебру.

Для начала давайте определим что вообще такое — вращение вектора. Вращение в 2D и 3D определяется углом. Угол может выражаться в углах или в радианах, в которых полный оборот — это 360 градусов или 2Pi соответственно. Я предпочитаю работать с градусами, поскольку они более логичны для меня.

Большинство вращательных функций требует угол в радианах, но благо преобразование из одной системы в другую выполнить довольно просто:
Градусы = радианы * (180.0f / PI)
Радианы = градусы * (PI / 180.0f)
Где PI примерно 3.14159265359

Вращение на половину круга — требует от нас вращения на 360/2 = 180 градусов. Вращение на 1/5 направо требует от нас вращение на 360/5 = 72 градуса направо. Вот пример обычного 2D вектора, где v повернут на 72 градуса направо от k.

Сдвиг плоскости на вектор

Вращение в 3D описывается углом и осью вращения. Угол определяет то насколько вектор будет повернут относительно данной оси. При вращении 2D векторов в 3D мире, к примеру, мы установим ось вращения — Z.

С помощью тригонометрии мы можем преобразовывать вектора в повернутые на определенный угол. Обычно это делается хитрой комбинацией sin и cos функций. Обсуждение того, как генерируется матрицы трансформации — выходит за пределы нашего урока.

Матрица вращения определена для каждой оси в 3D пространстве, где угол показан как тета.
Матрица вращения вокруг оси X:

Сдвиг плоскости на вектор

Матрица вращения вокруг оси Y:

Сдвиг плоскости на вектор

Матрица вращения вокруг оси Z:

Сдвиг плоскости на вектор

С помощью матриц вращения мы можем вращать наши вектора по одной из трех осей. Также можно совмещать их, например в начале повернуть по X оси, а потом по Y. Правда такой подход быстро приведет к проблеме, называемый проблемой шарнирного замка (Gimbal Lock). Мы не будем вдаваться в детали, но лучше использовать вращение по конкретной оси, например (0.662, 0.2, 0.722) (заметьте, что это единичный вектор), вместо того, чтобы совмещать вращения по конкретным осям. Матрица для таких преобразований существует и выглядит она следующим образом, где (Rx, Ry, Rz) — это ось вращения:

Сдвиг плоскости на вектор

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

Комбинирование матриц

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

Сдвиг плоскости на вектор

Заметьте, что во время умножения матриц мы в начале выполняем сдвиг, а потом масштабирование. Умножение матриц не коммутативно, что означает, что порядок умножения важен. Во время умножения матриц правая матрица умножается на вектор, поэтому вам надо читать умножения справа налево. Рекомендуется в начале масштабировать, затем вращать и в конце сдвигать, во время объединения матриц, в ином случае они могут отрицать друг-друга. Например если вы в начале выполните сдвиг, а затем масштабирование, то матрица сдвига тоже будет масштабировать!

В итоге матрица трансформации применяется следующим образом:

Сдвиг плоскости на вектор

Отлично, вектор масштабирован в 2 раза и смещен на (1, 2, 3).

Видео:Вектор. Сложение и вычитание. 9 класс | МатематикаСкачать

Вектор. Сложение и вычитание. 9 класс | Математика

На практике

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

GLM это аббревиатура от OpenGL Mathematics. Эта библиотека является заголовочной, что означает, что нам достаточно подключить требуемые заголовочные файлы. Не нужно заморачиваться ни с линковкой ни с компиляцией. GLM можно скачать с официального сайта. Скопируйте корневую директорию с заголовочными файлами в вашу папку includes и можно начинать.

Большая часть функциональности GLM можно найти в 3 заголовочных файлах:

Давайте посмотрим, сможем ли мы применить наши знания в преобразованиях для сдвига вектора (1, 0, 0) на (1, 1, 0) (заметьте, что мы обозначили из как glm::vec4 с гомогенной координатой равной 1.0):

В начале мы создали вектор названный vec с помощью встроенного в GLM векторного класса. Затем мы определяем mat4, которая является единичной матрицей 4х4. Затем мы создаем матрицу трансформации, передавая нашу единичную матрицу в функцию glm::translate, вместе с вектором сдвига.
Затем мы умножаем наш вектор на матрицу трансформации и выводим результат. Если вы все еще помните как работает матрица сдвига — то вы понимаете, что результирующий вектор должен быть (1+1, 0+1, 0+0), который равен (2, 1, 0). Код выше выводит 210, что означает, что матрица сдвига сделала свою работу.

Давайте попробуем сделать нечто более интересное и попробуем масштабировать, а затем повернуть объект из прошлого урока. В начале мы повернем контейнер на 90 градусов против часовой стрелки. Затем масштабируем его на 0.5 для того, чтобы уменьшить его в 2 раза. Давайте построим матрицу трансформации для этого.

В начале мы уменьшаем контейнер на 0.5, по каждой оси, а затем поворачиваем контейнер на 90 градусов по Z координате. Заметьте, что текстура также повернулась. Поскольку мы передаем матрицу в каждую из GLM функций, GLM автоматически перемножает матрицы, в результате получая матрицу трансформации.

Некоторые версии GLM принимают углы в радианах, а не в градусах. Если у вас такая версия — то преобразуйте градусы в радианы с помощью glm::radians(90.0f).

Следующий большой вопрос — это как передать матрицу трансформации в шейдер? Ранее мы уже говорили, что GLSL имеет тип mat4. Так что нам осталось принять mat4 в качестве uniform переменной и умножить вектор позиции на эту матрицу.

В GLSL также имеются типы mat2 и mat3, которые предоставляют такие же операции, что и вектора. Все затронутые в этой статье операции доступны в матричных типах.

Мы добавили uniform и умножили позиционный вектор на трансформационную матрицу перед тем как передать ее в gl_Position. Наш контейнер теперь должен стать меньше в 2 раза и повернуться на 90 градусов. Но нам все еще надо передать трансформационную матрицу в шейдер?

В начале мы получаем позицию uniform переменной и затем отправляем в нее данные матрицы с помощью функции glUniform с постфиксом Matrix4fv. Первый аргумент должен быть позицией переменной. Второй аргумент сообщает OpenGL сколько матриц мы собираемся отправлять, в нашем случае 1. Третий аргумент говорит требуется ли транспонировать матрицу. OpenGL разработчики часто используют внутренних матричный формат, называемый column-major ordering, который используется в GLM по умолчанию, поэтому нам не требуется транспонировать матрицы, мы можем оставить GL_FALSE. Последний параметр — это, собственно, данные, но GLM не хранит данные точно так как OpenGL хочет их видеть, поэтому мы преобразовываем их с помощью value_ptr.

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

Сдвиг плоскости на вектор

Отлично! Наш контейнер действительно повернут налево и стал в 2 раза меньше, так что трансформация прошла успешно. А теперь давайте заставим вращаться наш контейнер в реальном времени, а также передвинем его в нижний правый угол. Для того, чтобы это сделать придется производить вычисления при каждой итерации основного цикла. Мы используем функцию GLFW для получения времени, чтобы менять угол со временем:

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

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

Если вы все сделали правильно — то вы получите что-то вроде этого:

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

Если вам не удалось получить правильный результат или вы где-то застряли — то взгляните на исходный код вместе с вершинным и фрагментным шейдерами.

В следующем уроке мы обсудим как использовать матрицы для определения различных координатных пространств для наших вершин. Это будет новым шагом в мир 3D графики в реальном времени!

Видео:1. Уравнение плоскости проходящей через точку перпендикулярно вектору / общее уравнение / примерыСкачать

1. Уравнение плоскости проходящей через точку перпендикулярно вектору / общее уравнение / примеры

Движения плоскости. Теорема Шаля.
Афинные преобразования плоскости

Сдвиг плоскости на векторПреобразования плоскости
Сдвиг плоскости на векторДвижения плоскости
Сдвиг плоскости на векторТеорема Шаля
Сдвиг плоскости на векторАфинные преобразования плоскости
Сдвиг плоскости на векторКлассификация афинных преобразований плоскости

Сдвиг плоскости на вектор

Видео:ВЫЧИТАНИЕ ВЕКТОРОВ ЧАСТЬ I #егэ #огэ #математика #геометрия #профильныйегэСкачать

ВЫЧИТАНИЕ ВЕКТОРОВ ЧАСТЬ I #егэ #огэ #математика #геометрия #профильныйегэ

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

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

Из определения 1 вытекает, что, если F – преобразование плоскости α , а M – произвольная точка плоскости , то F(M) тоже является точкой плоскости α .

Определение 2 . Точку F(M) называют образом точки M при преобразовании F , а точку M называют прообразом точки F(M) при преобразовании F.

Аналогично определяются образы и прообразы любых фигур на плоскости при преобразовании F.

Определение 3 . Преобразование плоскости называют взаимно однозначным преобразованием плоскости на себя , если разные точки имеют разные образы, и каждая точка плоскости имеет прообраз.

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

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

Таким образом, если F и G – два преобразования, то произведением Сдвиг плоскости на векторэтих преобразований будет такое преобразование H, которое произвольную точку A плоскости переводит в точку A’ этой плоскости, определяемую по формуле:

Видео:Cкалярное произведение векторов в пространстве. 11 класс.Скачать

Cкалярное произведение векторов в пространстве. 11 класс.

Движения плоскости

Определение 5 . Движением плоскости называют такое преобразование плоскости, при котором расстояние между двумя любыми точками плоскости равно расстоянию между их образами.

Следующие преобразования являются движениями плоскости:

1. Параллельный перенос (сдвиг) на заданный вектор

При параллельном переносе плоскости на заданный вектор Сдвиг плоскости на вектор(рис.1) произвольная точка A плоскости переходит в такую точку A’ плоскости, что выполнено равенство

Сдвиг плоскости на вектор

Сдвиг плоскости на вектор

Сдвиг плоскости на вектор

Замечание . Движение, при котором каждая точка плоскости остаётся на своём месте, называют тождественным преобразованием . Тождественное преобразование можно рассматривать как параллельный перенос на вектор, равный нулю.

2. Поворот вокруг заданной точки, называемой центром поворота, на заданный угол

При повороте плоскости вокруг точки O на угол φ (рис. 2) произвольная точка A плоскости переходит в такую точку A’ плоскости, что выполнены равенства

Сдвиг плоскости на вектор

Сдвиг плоскости на вектор

Сдвиг плоскости на вектор

3. Центральная симметрия (симметрия относительно заданной точки, называемой центром симметрии)

При центральной симметрии плоскости относительно точки O произвольная точка A плоскости переходит в такую точку A’ плоскости, что серединой отрезка AA’ является точка O – заданный центр симметрии (рис.3).

Сдвиг плоскости на вектор

4. Осевая симметрия (симметрия относительно заданной прямой, называемой осью симметрии)

При осевой симметрии относительно прямой PQ ( ось симметрии ) произвольная точка A плоскости переходит в такую точку A’ плоскости, что, во-первых, прямая AA’ перпендикулярна прямой PQ , а, во-вторых, точка пересечения прямых AA’ и PQ является серединой отрезка AA’

Сдвиг плоскости на вектор

5. Скользящая симметрия (композиция осевой симметрии относительно заданной прямой и параллельного переноса на заданный отличный от нуля вектор, параллельный этой прямой)

Если прямая PQ – ось симметрии, а параллельный перенос задаётся вектором Сдвиг плоскости на векторпараллельным прямой PQ , то результат скользящей симметрии можно условно изобразить так, как показано на рисунке 5.

Сдвиг плоскости на вектор

Сдвиг плоскости на вектор

Сдвиг плоскости на вектор

Видео:Видеоурок "Преобразование координат"Скачать

Видеоурок "Преобразование координат"

Движения плоскости, сохраняющие ориентацию. Движения плоскости, изменяющие ориентацию. Теорема Шаля

Рассмотрим на плоскости произвольный равносторонний треугольник и обозначим его вершины буквами A, B и C так, чтобы при обходе по сторонам треугольника в направлении

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

Сдвиг плоскости на вектор

Предположим теперь, что некоторое движение F переводит треугольник ABC в треугольник A’B’C’, у которого

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

В первом случае при обходе по сторонам треугольника A’B’C’ в направлении

треугольник A’B’C’ располагается слева, и обход производится против часовой стрелки (рис.7).

Сдвиг плоскости на вектор

Во втором случае при обходе по сторонам треугольника A’B’C’ в направлении

треугольник A’B’C’ располагается справа, и обход производится по часовой стрелке (рис.8).

Сдвиг плоскости на вектор

Определение 6 . Если при движении F осуществляется первый случай, то такое движение называют движением, сохраняющим ориентацию плоскости ( движением 1-го рода, собственным движением ). Если при движении F осуществляется второй случай, то такое движение называют движением, изменяющим ориентацию ( движением 2-го рода, несобственным движением ).

Классификацию всех движений плоскости даёт следующая теорема Шаля.

Теорема Шаля . Любое движение плоскости, сохраняющее ориентацию, является или параллельным переносом, или поворотом. Любое движение плоскости, изменяющее ориентацию, является или осевой симметрией, или скользящей симметрией.

Видео:СКАЛЯРНОЕ УМНОЖЕНИЕ ВЕКТОРОВ ЧАСТЬ I #математика #егэ #огэ #формулы #профильныйегэ #векторыСкачать

СКАЛЯРНОЕ УМНОЖЕНИЕ ВЕКТОРОВ ЧАСТЬ I #математика #егэ #огэ #формулы #профильныйегэ #векторы

Аффинные преобразования плоскости

Определение 7 . Аффинным преобразованием плоскости называют такое взаимно однозначное преобразование плоскости на себя, при котором образом любой прямой на плоскости является прямая.

Поскольку каждое движение плоскости переводит прямые линии в прямые линии, то каждое движение является аффинным преобразованием.

Однако аффинные преобразования не ограничиваются движениями плоскости. Следующие преобразования также являются аффинными преобразованиями плоскости:

1. Сжатие (растяжение) к прямой с заданным коэффициентом сжатия (растяжения)

При сжатии (растяжении) плоскости к прямой PQ с заданным коэффициентом сжатия k (рис.9) произвольная точка A плоскости переходит в такую точку A’ плоскости, что выполнены следующие условия:

  • прямая AA’ перпендикулярна прямой PQ ;
  • если обозначить буквой A» точку пересечения прямых AA’ и PQ , то будет справедливо равенство

  • если k > 0 , то точки A и A’ лежат по одну сторону от прямой PQ , если же k , то точки A и A’ лежат по разные стороны от прямой PQ .
  • Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    Замечание 1 . В случае, когда | k | , рассматриваемое аффинное преобразование называют сжатием к прямой PQ , если же | k | > 1 , то это преобразование называют растяжением .

    Замечание 2 . Будем использовать для рассматриваемого сжатия (растяжения) обозначение

    Сдвиг плоскости на вектор

    2. Сжатие (растяжение) по двум заданным взаимно перпендикулярным направлениям с заданными коэффициентами сжатия (растяжения)

    Пусть PQ и MN – две взаимно перпендикулярных прямых, а числа k1 и k2 – коэффициенты сжатия (расширения) плоскости в направлении прямых PQ и MN соответственно. Тогда сжатием (растяжением) по двум заданным взаимно перпендикулярным направлениям PQ и MN с коэффициентами k1 и k2 (рис.10) называют композицию сжатий (растяжений).

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    3. Гомотетия с заданным центром гомотетии и заданным коэффициентом сжатия (растяжения)

    Гомотетией с центром в точке O и коэффициентом k называют такое аффинное преобразование, при котором произвольная точка A плоскости переходит в такую точку A’ плоскости, что выполнены следующие условия:

    • точка A’ лежит на прямой AO ;
    • справедливо равенство

  • если k > 0 , то точки A и A’ лежат по одну сторону от точки O , если же k , то точки A и A’ лежат по разные стороны от точки O (рис.11).
  • Замечание . Рассмотрим две произвольных взаимно перпендикулярных прямых PQ и MN, пересекающихся в точке O. Тогда гомотетия с центром в точке O и коэффициентом k совпадёт со сжатием (растяжением) по направлениям PQ и MN с коэффициентами, равными k . Другими словами, гомотетия является композицией сжатий (растяжений):

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    4. Преобразование подобия с заданным коэффициентом подобия

    Преобразованием подобия с коэффициентом подобия k называют аффинное преобразование, представленное в виде композиции гомотетии с коэффициентом k и движения (рис. 12).

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    Сдвиг плоскости на вектор

    Видео:Линейная алгебра. Векторы и операции над векторами.Скачать

    Линейная алгебра. Векторы и операции над векторами.

    Классификация аффинных преобразований плоскости

    Справедлива следующая теорема о классификации аффинных преобразований плоскости.

    Видео:Векторы. Метод координат. Вебинар | МатематикаСкачать

    Векторы. Метод координат. Вебинар | Математика

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

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

    Параллельный перенос. Пусть а — данный вектор. Параллельным переносом на вектор а называется отображение плоскости на себя, при котором каждая точка М отображается в точку М1, что вектор MМ1 равен вектору а.

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

    Сдвиг плоскости на вектор

    Поворот. Обозначим на плоскости точку О (центр поворота) и зададим угол α (угол поворота). Поворотом плоскости вокруг точки О на угол α называется отображение плоскости на себя, при котором каждая точка М отображается в точку М1, что ОМ = ОМ1 и угол MOМ1 равен α. При этом точка О остается на своем месте, т. е. отображается сама в себя, а все остальные точки поворачиваются вокруг точки О в одинаковом направлении — по часовой стрелке или против часовой стрелки (на рисунке изображен поворот против часовой стрелки).

    Сдвиг плоскости на вектор

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

    Геометрическое преобразование плоскости, при котором любая пара точек А и В отображается на такую пару точек А1 и В1, что А1 В1 = k∙АВ, где k — фиксированная для данного преобразования положительная константа, называется преобразованием подобия. Число k называется при этом коэффициентом подобия.

    Очевидно, что движения плоскости — частный случай подобия (с коэффициентом 1).

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

    Сдвиг плоскости на вектор

    Свойства преобразования подобия.

    1. Преобразование подобия сохраняет отношения пар отрезков: если АВ и CD — два произвольных отрезка, а А1 В1 и C1D1 — их образы, то А1 В1 / C1D1 = АВ / CD.
    2. Равные отрезки отображаются в равные; середина отрезка — в середину его образа.
    3. Если на плоскости заданы две прямоугольные системы координат и дано число k > 0 , то однозначно определено преобразование подобия с коэффициентом k, отображающее оси первой системы координат в одноименные оси второй.

    Геометрическое преобразование плоскости с неподвижной точкой S, которое всякой точке А, отличной от S, ставит в соответствие такую точку А1, что SА1 = k∙SA, где k ≠ 0 — наперед заданное число, называется гомотетией с центром S и коэффициентом k. Если фигура F1 получена из фигуры F с помощью гомотетии, то фигуры F и F1 называются гомотетичными.

    Сдвиг плоскости на вектор

    Свойства гомотетии.

    1. Гомотетия с коэффициентом k есть подобие с коэффициентом │k│.
    2. Гомотетия переводит всякую прямую в параллельную ей прямую.
    3. Всякая гомотетия может быть задана центром гомотетии и парой соответствующих друг другу точек.

    Другие движения плоскости — центральная симметрия и осевая симметрия — что это такое.

    🌟 Видео

    Доказать, что векторы a, b, c образуют базис и найти координаты вектора d в этом базисеСкачать

    Доказать, что векторы a, b, c образуют базис и найти координаты вектора d в этом базисе

    Скалярное произведение векторов. 9 класс.Скачать

    Скалярное произведение векторов. 9 класс.

    Профильный ЕГЭ 2024. Векторы. Координатная плоскость. Задача 2Скачать

    Профильный ЕГЭ 2024. Векторы. Координатная плоскость. Задача 2

    Уравнение плоскости. Практическая часть. 11 класс.Скачать

    Уравнение плоскости. Практическая часть. 11 класс.

    Разложение вектора по базису. 9 класс.Скачать

    Разложение вектора по базису. 9 класс.

    Координаты точки и координаты вектора 1.Скачать

    Координаты точки и координаты вектора 1.
    Поделиться или сохранить к себе: