Как построить вектор в трехмерной системе координат

Векторы в пространстве и метод координат

Существует два способа решения задач по стереометрии

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

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

Если вы освоили векторы на плоскости и действия с ними — то и с векторами в пространстве разберетесь. Многие понятия окажутся знакомыми.

Содержание
  1. Система координат в пространстве
  2. Плоскость в пространстве задается уравнением:
  3. Как построить вектор в трехмерном пространстве
  4. Что такое трехмерное пространство
  5. Понятие точки в трехмерном пространстве
  6. Разновидности систем координат
  7. Понятие прямой в трехмерном пространстве
  8. Определение векторов и базиса трехмерного пространства
  9. Зависимые и независимые векторы
  10. Плоскость в трехмерном пространстве
  11. Существует ли более трех измерений
  12. Заключение
  13. Равенство векторов
  14. Вычисление модуля вектора
  15. Решение
  16. Нормализация вектора
  17. Решение
  18. Сложение векторов
  19. Вычитание векторов
  20. Умножение вектора на скаляр
  21. Скалярное произведение векторов
  22. Векторное произведение
  23. Решение
  24. Разложение вектора по базису
  25. Связь между базисами
  26. 3D своими руками. Часть 2: оно трехмерное
  27. Системы координат
  28. Точка и вектор
  29. Матрица
  30. Вершины и индексы
  31. Конвейер визуализации
  32. 💡 Видео

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

11 класс, 1 урок, Прямоугольная система координат в пространстве

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

Выберем начало координат. Проведем три взаимно перпендикулярные оси X, Y и Z. Зададим удобный масштаб.

Как построить вектор в трехмерной системе координат

Получилась система координат в трехмерном пространстве. Теперь каждая его точка характеризуется тремя числами — координатами по X, Y и Z. Например, запись M(−1; 3; 2) означает, что координата точки M по X (абсцисса) равна −1, координата по Y (ордината) равна 3, а координата по Z (аппликата) равна 2.

Векторы в пространстве определяются так же, как и на плоскости. Это направленные отрезки, имеющие начало и конец. Только в пространстве вектор задается тремя координатами x, y и z:

Как построить вектор в трехмерной системе координат

Как найти координаты вектора? Как и на плоскости — из координаты конца вычитаем координату начала.

Как построить вектор в трехмерной системе координат
Как построить вектор в трехмерной системе координат

Длина вектора Как построить вектор в трехмерной системе координатв пространстве – это расстояние между точками A и B. Находится как корень квадратный из суммы квадратов координат вектора.

Как построить вектор в трехмерной системе координат

Пусть точка M – середина отрезка AB. Ее координаты находятся по формуле:

Как построить вектор в трехмерной системе координат

Для сложения векторов применяем уже знакомые правило треугольника и правило параллелограмма

Как построить вектор в трехмерной системе координат

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

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Произведение вектора на число:

Как построить вектор в трехмерной системе координат

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

Как построить вектор в трехмерной системе координат

Косинус угла между векторами:

Как построить вектор в трехмерной системе координат

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

1. В кубе ABCDA1B1C1D1 точки E и K — середины ребер соответственно A1B1 и B1C1. Найдите косинус угла между прямыми AE и BK.

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

Как построить вектор в трехмерной системе координат

Длина ребра куба не дана. Какой бы она ни была, угол между AE и BK от нее не зависит. Поэтому возьмем единичный куб, все ребра которого равны 1.

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

Как построить вектор в трехмерной системе координат

Запишем координаты векторов:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

и найдем косинус угла между векторами Как построить вектор в трехмерной системе координати Как построить вектор в трехмерной системе координат:

Как построить вектор в трехмерной системе координат

2. В правильной четырехугольной пирамиде SABCD, все ребра которой равны 1, точки E, K — середины ребер SB и SC соответственно. Найдите косинус угла между прямыми AE и BK.

Лучше всего выбрать начало координат в центре основания пирамиды, а оси X и Y сделать параллельными сторонам основания.

Как построить вектор в трехмерной системе координат

Координаты точек A, B и C найти легко:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Из прямоугольного треугольника AOS найдем Как построить вектор в трехмерной системе координат

Координаты вершины пирамиды: Как построить вектор в трехмерной системе координат

Точка E — середина SB, а K — середина SC. Воспользуемся формулой для координат середины отрезка и найдем координаты точек E и K.

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Найдем координаты векторов Как построить вектор в трехмерной системе координати Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

и угол между ними:

Как построить вектор в трехмерной системе координат

Покажем теперь, как вписать систему координат в треугольную призму:

3. В правильной треугольной призме ABCA1B1C1, все ребра которой равны 1, точка D — середина ребра A1B1. Найдите косинус угла между прямыми AD и BC1

Пусть точка A — начало координат. Возьмем ось X параллельно стороне BC, а ось Y перпендикулярно ей. Другими словами, на оси Y будет лежать отрезок AH, являющийся высотой треугольника ABC. Нарисуем отдельно нижнее основание призмы.

Как построить вектор в трехмерной системе координат

Запишем координаты точек:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Точка D — середина A1B1. Значит, пользуемся формулами для координат середины
отрезка.

Как построить вектор в трехмерной системе координат

Найдем координаты векторов Как построить вектор в трехмерной системе координати Как построить вектор в трехмерной системе координат, а затем угол между ними:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

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

Видео:Как построить точки в системе координат OXYZСкачать

Как построить точки в системе координат OXYZ

Плоскость в пространстве задается уравнением:

Как построить вектор в трехмерной системе координат

Здесь числа A, B и C — координаты вектора, перпендикулярного этой плоскости. Его называют нормалью к плоскости.

Как построить вектор в трехмерной системе координат

Вместо x, y и z можно подставить в уравнение координаты любой точки, принадлежащей данной плоскости. Получится верное равенство.

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

Покажем, как это делается.

Напишем уравнение плоскости, проходящей через точки M (1; 0; 1), N (2; −2; 0) и K (4; 1; 2).

Уравнение плоскости выглядит так:

Как построить вектор в трехмерной системе координат

Подставим в него по очереди координаты точек M, N и K.

Как построить вектор в трехмерной системе координат

То есть A + C + D = 0.

Как построить вектор в трехмерной системе координатКак построить вектор в трехмерной системе координат

Аналогично для точки K:

Как построить вектор в трехмерной системе координат

Получили систему из трех уравнений:

Как построить вектор в трехмерной системе координат

В ней четыре неизвестных: A, B, C и D. Поэтому одну из них мы выберем сами, а другие выразим через нее. Правило простое — вместо одной из переменных можно взять любое число, не равное нулю.

Пусть, например, D = −2. Тогда:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Выразим C и B через A и подставим в третье уравнение:

Как построить вектор в трехмерной системе координат

Решив систему, получим:

Как построить вектор в трехмерной системе координат

Уравнение плоскости MNK имеет вид:

Как построить вектор в трехмерной системе координат

Умножим обе части уравнения на −3. Тогда коэффициенты станут целыми:

Как построить вектор в трехмерной системе координат

Вектор Как построить вектор в трехмерной системе координат— это нормаль к плоскости MNK.

Уравнение плоскости, проходящей через заданную точку Как построить вектор в трехмерной системе координатимеет вид:

Как построить вектор в трехмерной системе координат

Угол между плоскостями равен углу между нормалями к этим плоскостям:

Как построить вектор в трехмерной системе координат

Не правда ли, знакомая формула? Скалярное произведение нормалей поделили на произведение их длин.

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

Как построить вектор в трехмерной системе координат

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

4. В кубе ABCDA1B1C1D1 точки E и F — середины ребер соответственно A1B1 и A1D1. Найдите тангенс угла между плоскостями AEF и BDD1.

Строим чертеж. Видно, что плоскости AEF и BDD1 пересекаются где-то вне куба. В классическом решении пришлось бы строить линию их пересечения. Но векторно-координатный метод значительно всё упрощает. Не будем ломать голову над тем, по какой прямой пересекаются плоскости. Просто отметим координаты нужных нам точек и найдем угол между нормалями к плоскостям AEF и BDD1.

Как построить вектор в трехмерной системе координат

Сначала — нормаль к плоскости BDD1. Конечно, мы можем подставить координаты точек B, D и D1 в уравнение плоскости и найти коэффициенты, которые и будут координатами вектора нормали. А можем сделать хитрее — увидеть нужную нормаль прямо на чертеже. Ведь плоскость BDD1 — это диагональное сечение куба. Вектор Как построить вектор в трехмерной системе координатперпендикулярен этой плоскости.

Итак, первый вектор нормали у нас уже есть: Как построить вектор в трехмерной системе координат

Напишем уравнение плоскости AEF.

Как построить вектор в трехмерной системе координат

Берем уравнение плоскости Как построить вектор в трехмерной системе координати по очереди подставляем в него, вместо x, y и z, соответствующие координаты точек A, E и F.

Как построить вектор в трехмерной системе координатКак построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Пусть С = -1. Тогда A = B = 2.

Уравнение плоскости AEF: Как построить вектор в трехмерной системе координат

Нормаль к плоскости AEF: Как построить вектор в трехмерной системе координат

Найдем угол между плоскостями:

Как построить вектор в трехмерной системе координат

5. Основание прямой четырехугольной призмы BCDA1B1C1D1 — прямоугольник ABCD, в котором AB = 5, AD = √33. Найдите тангенс угла между плоскостью грани AA1D1D и плоскостью, проходящей через середину ребра CD перпендикулярно прямой B1D, если расстояние между прямыми A1C1 и BD равно √3.

Эта задача наглядно показывает, насколько векторный метод проще классического. Попробуйте, для разнообразия, построить необходимые сечения и провести все доказательства — как это делается в «классике» 🙂

Строим чертеж. Прямую четырехугольную призму можно по-другому назвать «параллелепипед».

Как построить вектор в трехмерной системе координат

Замечаем, что длина и ширина параллелепипеда у нас есть, а вот высота — вроде не дана. Как же ее найти?

«Расстояние между прямыми A1C1 и BD равно √3». Прямые A1C1 и BD скрещиваются. Одна из них — диагональ верхнего основания, другая — диагональ нижнего. Вспомним, что расстояние между скрещивающимися прямыми равно длине их общего перпендикуляра. Общий перпендикуляр к A1C1 и BD — это, очевидно, OO1, где O — точка пересечения диагоналей нижнего основания, O1 — точка пересечения диагоналей верхнего. А отрезок OO1 и равен высоте параллелепипеда.

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

Осталась еще «плоскость, проходящая через середину ребра CD перпендикулярно прямой B1D». Но позвольте, если плоскость перпендикулярна прямой B1D — значит, B1D и есть нормаль к этой плоскости! Координаты точек B1 и D известны:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Координаты вектора Как построить вектор в трехмерной системе координат— тоже:

Как построить вектор в трехмерной системе координат

Находим угол между плоскостями, равный углу между нормалями к ним:

Как построить вектор в трехмерной системе координат

Зная косинус угла, находим его тангенс по формуле

Как построить вектор в трехмерной системе координат

Получим:
Как построить вектор в трехмерной системе координат

Ответ: Как построить вектор в трехмерной системе координат

Угол между прямой m и плоскостью α тоже вычисляется с помощью скалярного произведения векторов.

Пусть Как построить вектор в трехмерной системе координат— вектор, лежащий на прямой m (или параллельный ей), Как построить вектор в трехмерной системе координат— нормаль к плоскости α.

Как построить вектор в трехмерной системе координат

Находим синус угла между прямой m и плоскостью α по формуле:

Как построить вектор в трехмерной системе координат

6. В кубе ABCDA1B1C1D1 точка E — середина ребра A1B1. Найдите синус угла между прямой AE и плоскостью BDD1.

Как всегда, рисуем чертеж и выбираем систему координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Находим координаты вектора Как построить вектор в трехмерной системе координат.

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

Найдем угол между прямой и плоскостью:

Как построить вектор в трехмерной системе координат

Ответ: Как построить вектор в трехмерной системе координат

Расстояние от точки M с координатами x0, y0 и z0 до плоскости α, заданной уравнением Ax + By + Cz + D = 0, можно найти по формуле:

Как построить вектор в трехмерной системе координат

7. В основании прямоугольного параллелепипеда BCDA1B1C1D1 лежит прямоугольник ABCD со сторонами AB = Как построить вектор в трехмерной системе координат, AD = Как построить вектор в трехмерной системе координат. Высота параллелепипеда AA1 = Как построить вектор в трехмерной системе координат. Найдите расстояние от точки A до плоскости A1DB.

Построим чертеж и выпишем координаты точек:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Запишем уравнение плоскости A1DB. Вы помните, как это делается — по очереди подставляем координаты точек A1, D и B в уравнение Ax + Be + Cz + D

Как построить вектор в трехмерной системе координатКак построить вектор в трехмерной системе координат

Решим эту систему. Выберем Как построить вектор в трехмерной системе координат

Тогда Как построить вектор в трехмерной системе координат

Уравнение плоскости A1DB имеет вид:

Как построить вектор в трехмерной системе координат

Дальше все просто. Находим расстояние от точки A до плоскости A1DB:

Как построить вектор в трехмерной системе координат

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

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

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

Как построить вектор в трехмерном пространстве

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

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

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

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

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

Как построить вектор в трехмерной системе координат

В данном случае все зависит именно от типа объекта и применяемой системы координат. Сегодня наиболее распространенной (классической) считается Декартова система, которую иногда еще называют прямоугольной. Она и некоторые другие разновидности будут рассмотрены несколько позже.

Как построить вектор в трехмерной системе координат

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

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

Координаты вектора  в пространстве. 11 класс.

Понятие точки в трехмерном пространстве

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

Как построить вектор в трехмерной системе координат

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

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

Координаты вектора. 9 класс.

Разновидности систем координат

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

Как построить вектор в трехмерной системе координат

Наиболее известными считаются цилиндрическая и сферическая системы. Отличие от классической состоит в том, что при задании тех же трех величин, определяющих местоположение точки в трехмерном пространстве, одно из значений является угловым. Иными словами, в таких системах используется окружность, соответствующая углу в 360 градусов. Отсюда и специфичное задание координат, включающее такие элементы, как радиус, угол и образующая. Координаты в трехмерном пространстве (системе) такого типа подчиняются несколько другим закономерностям. Их задание в данном случае контролируется правилом правой руки: если совместить большой и указательный палец с осями X и Y, соответственно, остальные пальцы в изогнутом положении укажут на направление оси Z.

Видео:КООРДИНАТЫ ВЕКТОРА В ПРОСТРАНСТВЕ решение задачСкачать

КООРДИНАТЫ ВЕКТОРА В ПРОСТРАНСТВЕ решение задач

Понятие прямой в трехмерном пространстве

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

Как построить вектор в трехмерной системе координат

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

Видео:Прямоугольная система координат в пространстве. 11 класс.Скачать

Прямоугольная система координат в пространстве. 11 класс.

Определение векторов и базиса трехмерного пространства

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

Как построить вектор в трехмерной системе координат

Заметьте, это могут быть только три вектора, но вот троек векторов можно определить сколько угодно. Размерность пространства определяется количеством линейно-независимых векторов (в нашем случае – три). И пространство, в котором имеется конечное число таких векторов, называется конечномерным.

Видео:Трехмерные линейные трансформации | Сущность Линейной Алгебры, примечаниеСкачать

Трехмерные линейные трансформации | Сущность Линейной Алгебры, примечание

Зависимые и независимые векторы

Что касается определения зависимых и независимых векторов, линейно-независимыми принято считать векторы, являющиеся проекциями (например, векторы оси X, спроецированные на ось Y).

Как построить вектор в трехмерной системе координат

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

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

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

Плоскость в трехмерном пространстве

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

Как построить вектор в трехмерной системе координат

К примеру, плоскостью можно назвать любое количество точек с разными координатами по осям X и Y, но одинаковыми координатами по оси Z. В любом случае одна из трехмерных координат остается неизменной. Однако это, так сказать, общий случай. В некоторых ситуациях трехмерное пространство может пересекаться плоскостью по всем осям.

Видео:Прямоугольная система координат в пространстве. Практическая часть. 11 класс.Скачать

Прямоугольная система координат в пространстве. Практическая часть.  11 класс.

Существует ли более трех измерений

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

Как построить вектор в трехмерной системе координат

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

Кстати сказать, сегодня существует достаточно много мнений по поводу того, что экстрасенсорика тоже является одним из проявлений восприятия многомерного мира, и тому можно найти достаточно много подтверждений.

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

Видео:Математика Без Ху!ни. Полярные координаты. Построение графика функции.Скачать

Математика Без Ху!ни. Полярные координаты. Построение графика функции.

Заключение

В целом же, мы очень кратко рассмотрели основные понятия, относящиеся к трехмерному пространству и базовым определениям. Естественно, существует множество частных случаев, связанных с разными системами координат. К тому же мы постарались особо не лезть в математические дебри для объяснения основных терминов только для того, чтобы вопрос, связанный с ними, был понятен любому школьнику (так сказать, объяснение «на пальцах»).

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

Геометрическим представлением вектора является направленный отрезок прямой линии, что показано на рис. 1. У каждого вектора есть два свойства: длина (также называемая модулем или нормой вектора) и направление . Благодаря этому векторы очень удобны для моделирования физических величин, которые характеризуются модулем и направлением. Например, в главе 14 мы реализуем систему частиц. При этом мы будем использовать векторы для моделирования скорости и ускорения наших частиц. С другой стороны, в трехмерной компьютерной графике векторы часто используются только для моделирования направления. Например, нам часто требуется указать направление распространения световых лучей, ориентацию грани или направление камеры, глядящей на трехмерный мир. Векторы обеспечивают удобный механизм задания направления в трехмерном пространстве.

Как построить вектор в трехмерной системе координат

Рис. 1. Свободные векторы, определенные независимо от системы координат

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

На рис. 1 видно, что обсуждние векторов может вестись без упоминания системы координат, поскольку всю значимую информацию, — длину и направление, — вектор содержит в себе. Добавление системы координат не добавляет информации в вектор; скорее можно говорить, что вектор, значения которого являются его неотъемлимой частью, просто описан относительно конкретной системы координат. И если мы изменим систему координат, мы только опишем тот же самый вектор относительно другой системы.

Отметив этот важный момент, мы перейдем к изучению того, как векторы описываются в левосторонней трехмерной декартовой системе координат. На рис. 2 показаны левосторонняя и правосторонняя системы координат. Различие между ними — положительное направление оси Z. В левосторонней системе координат положительное направление оси Z погружается в страницу. В правосторонней системе координат положительное направление оси Z направлено от страницы.

Как построить вектор в трехмерной системе координат

Рис. 2. Слева изображена левосторонняя система координат. Обратите внимание, что положительное направление оси Z направлено вглубь страницы. Справа изображена правостороняя система координат. Здесь положительное направление оси Z направлено от страницы

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

Как построить вектор в трехмерной системе координат

Рис. 3. Векторы в стандартной позиции, определенные в указанной системе координат. Обратите внимание, что векторы u и v полностью совпадают друг с другом потому что они равны

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

Мы будем пользоваться для обозначения векторов полужирными строчными буквами, но иногда будем применять и полужирные заглавные буквы. Вот пример двух-, трех- и четырехмерных векторов соответственно: u = ( u x , u y ), N = ( N x , N y , N z ), c = ( c x , c y , c z , c w ).

Теперь мы введем четыре специальных трехмерных вектора, которые показаны на рис. 4. Первый из них называется нулевым вектором , и значения всех его компонент равны нулю; мы будем обозначать такой вектор выделенным полужирным шрифтом нулем: 0 = (0, 0, 0). Следующие три специальных вектора называются единичными базовыми векторами (базовыми ортами) трехмерной системы координат. Эти векторы, направленные вдоль осей X, Y и Z нашей координатной системы, мы будем называть i , j и k соответственно. Модуль этих векторов равен единице, а определение выглядит следующим образом: i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1).

Как построить вектор в трехмерной системе координат

Рис. 4. Нулевой вектор и базовые орты трехмерной системы координат

Вектор, длина которого равна единице, называется единичным вектором или ортом .

В библиотеке D3DX для представления векторов в трехмерном пространстве мы можем воспользоваться классом D3DXVECTOR3 . Его определение выглядит следующим образом:

Обратите внимание, что D3DXVECTOR3 наследует компоненты от D3DVECTOR , определение которого выглядит следующим образом:

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

Хотя основной интерес для нас представляют векторы в трехмерном пространстве, занимаясь программированием трехмерной графики мы будем иногда сталкиваться с векторами в двухмерном и четырехмерном пространствах. Библиотека D3DX предоставляет классы D3DXVECTOR2 и D3DXVECTOR4 , предназначенные для представления векторов в двухмерном и четырехмерном пространствах соответственно. Векторы в пространствах с другим количеством измерений обладают теми же свойствами, что и векторы в трехмерном пространстве, а именно — длиной и направлением, отличается только количество измерений. Кроме того, математические операции с векторами, за исключением векторного произведения (см. раздел «Векторное произведение», далее в этой главе), которое определено только для трехмерной системы координат, могут быть обобщены для векторов любой размерности. Таким образом, за исключением векторного произведения, все операции, которые мы обсуждаем для векторов в трехмерном пространстве, распространяются и на векторы в двухмерном, четырехмерном и даже n-мерном пространствах.

Равенство векторов

В геометрии два вектора считаются равными, если они указывают в одном и том же направлении и имеют одинаковую длину. В алгебре говорят, что векторы равны, если у них одинаковое количество измерений и их соответствующие компоненты равны. Например, ( u x , u y , u z ) = ( v x , v y , v z ) если u x = v x , u y = v y и u z = v z .

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

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

Сравнивая числа с плавающей точкой следует быть очень аккуратным, поскольку из-за погрешностей округления, два числа с плавающей точкой, которые должны быть равными, могут слегка отличаться. По этой причине мы проверяем приблизительное равенство чисел с плавающей точкой. Для этого мы определили константу EPSILON , содержащую очень маленькое значение, которое будет служить «буфером». Мы будем говорить, что два числа приблизительно равны, если разница между ними меньше EPSILON . Другими словами, EPSILON дает нам некий допуск для ошибок округления чисел с плавающей точкой. Приведенная ниже функция показывает, как EPSILON может использоваться при проверке равенства двух чисел с плавающей точкой: Об этом не надо беспокоиться, работая с классом D3DXVECTOR , поскольку перегруженные операции сравнения все сделают за нас, но очень важно знать об этой особенности сравнения чисел с плавающей точкой.

Вычисление модуля вектора

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

Как построить вектор в трехмерной системе координат

Вертикальные линии в |u| обозначают модуль u .

ПРИМЕР

Вычислите модуль векторов u = (1, 2, 3) и v = (1, 1).

Решение

Для вектора u мы получаем:

Как построить вектор в трехмерной системе координат

Обобщив формулу (1) для двухмерного пространства, для вектора v мы получим:

Как построить вектор в трехмерной системе координат

Работая с библиотекой D3DX, для вычисления модуля вектора мы можем применять следующую функцию:

Нормализация вектора

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

Как построить вектор в трехмерной системе координат

Мы отмечаем единичный вектор, помещая над его обозначением символ ^ : &#251 .

ПРИМЕР

Нормализуйте векторы u = (1, 2, 3) и v = (1, 1).

Решение

Из приведенных выше формул (2) и (3) мы знаем, что |u| = √ 14 и |v| = √ 2 , поэтому:

Как построить вектор в трехмерной системе координат

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

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

Сложение векторов

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

Как построить вектор в трехмерной системе координат

Геометрическая интерпретация сложения векторов показана на рис. 5.

Как построить вектор в трехмерной системе координат

Рис. 5. Сложение векторов. Обратите внимание, как мы выполняем параллельный перенос вектора v таким образом, чтобы его начало совпало с концом вектора u ; суммой будет вектор начало которого совпадает с началом вектора u , а конец совпадает с концом перенесенного вектора v

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

Вычитание векторов

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

Как построить вектор в трехмерной системе координат

Геометрическая интерпретация вычитания векторов показана на рис. 6.

Как построить вектор в трехмерной системе координат

Рис. 6. Вычитание векторов

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

Как видно на рис. 6, операция вычитания векторов возвращает вектор, начало которого совпадает с концом вектора v , а конец — с концом вектора u . Если мы интерпретируем компоненты u и v как координаты точек, то результатом вычитания будет вектор, направленный от одной точки к другой. Это очень удобная операция, поскольку нам часто будет необходимо найти вектор, описывающий направление от одной точки к другой.

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

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

Как построить вектор в трехмерной системе координат

Класс D3DXVECTOR3 предоставляет оператор умножения вектора на скаляр:

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

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

Как построить вектор в трехмерной системе координат

У приведенной выше формулы нет очевидной геометрической интерпретации. Используя теорему косинусов 1 , мы получим отношение u Ч v = |u||v| cos j , говорящее, что скалярное произведение двух векторов равно произведению косинуса угла между векторами на модули векторов. Следовательно, если u и v — единичные векторы, их скалярное произведение равно косинусу угла между ними.

Вот некоторые полезные свойства скалярного произведения:

  • Если u Ч v = 0, значит u ^ v .
  • Если u Ч v > 0, значит угол j между двумя векторами меньше 90 градусов.
  • Если u Ч v j между двумя векторами больше 90 градусов.
Символ ^ обозначает «ортогональный» или (что то же самое) «перпендикулярный».

Для вычисления скалярного произведения двух векторов в библиотеке D3DX предназначена следующая функция:

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

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

Вычисляется векторное произведение по следующей формуле:

Как построить вектор в трехмерной системе координат

В компонентной форме вычисление выглядит так:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Рис. 7. Векторное произведение. Вектор p = u × v перпендикулярен как вектору u, так и вектору v

Вычислите j = k × i = (0, 0, 1) × (1, 0, 0) и проверьте, что вектор j перпендикулярен как вектору i , так и вектору k .

Решение

Как построить вектор в трехмерной системе координат

Таким образом, j = (0, 1, 0). Вспомните, в предыдущем разделе «Скалярное произведение векторов» говорилось, что если u Ч v = 0, значит u ^ v . Поскольку j Ч k = 0 и j Ч i = 0, мы знаем что вектор j перпендикулярен как вектору k , так и вектору i .

Для вычисления векторного произведения двух векторов в библиотеке D3DX предназначена следующая функция:

Как явствует из рис. 7, вектор –p также взаимно перпендикулярен векторам u и v . Какой из векторов, p или –p будет возвращен в качестве результата векторного произведения определяется порядком операндов. Другими словами, u × v = –( v × u ). Это заначит, что операция векторного произведения не является коммутативной. Определить, какой вектор будет возвращен в качестве результата, можно с помощью правила левой руки . (Мы используем правило левой руки, поскольку работаем с левосторонней системой координат. Если бы у нас была правосторонняя система координат, пришлось бы воспользоваться правилом правой руки.) Если расположить пальцы левой руки вдоль первого вектора, а ладонь руки — вдоль второго, отогнутый на 90 градусов большой палец укажет направление результирующего вектора.

1 Теорема косинусов определяет зависимость между сторонами и углами треугольника. Она утверждает, что во всяком треугольнике квадрат длины стороны равен сумме квадратов двух других сторон без удвоенного произведения длин этих сторон на косинус угла между ними. Если угол прямой, то теорема косинусов переходит в теорему Пифагора, т.к. косинус прямого угла равен 0.

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

Введем некоторые определения.

Размерность векторного пространства – число, соответствующее максимальному количеству линейно независимых векторов в этом пространстве.

Базис векторного пространства – совокупность линейно независимых векторов, упорядоченная и в своей численности равная размерности пространства.

Рассмотрим некое пространство n -векторов. Размерность его соответственно равна n . Возьмем систему из n -единичных векторов:

e ( 1 ) = ( 1 , 0 , . . . , 0 ) e ( 2 ) = ( 0 , 1 , . . . , 0 ) e ( n ) = ( 0 , 0 , . . . , 1 )

Используем эти векторы в качестве составляющих матрицы A : она будет являться единичной с размерностью n на n . Ранг этой матрицы равен n . Следовательно, векторная система e ( 1 ) , e ( 2 ) , . . . , e ( n ) является линейно независимой. При этом к системе невозможно добавить ни одного вектора, не нарушив ее линейной независимости.

Так как число векторов в системе равно n , то размерность пространства n -мерных векторов равна n , а единичные векторы e ( 1 ) , e ( 2 ) , . . . , e ( n ) являются базисом указанного пространства.

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

Если мы поменяем местами первый и второй вектор, получим систему векторов e ( 2 ) , e ( 1 ) , . . . , e ( n ) . Она также будет являться базисом n -мерного векторного пространства. Составим матрицу, взяв за ее строки векторы полученной системы. Матрица может быть получена из единичной матрицы перестановкой местами первых двух строк, ранг ее будет равен n . Система e ( 2 ) , e ( 1 ) , . . . , e ( n ) линейно независима и является базисом n -мерного векторного пространства.

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

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

Векторное пространство с размерностью n имеет столько базисов, сколько существует линейно независимых систем из n -мерных векторов числом n.

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

Рассмотрим применение данной теории на конкретных примерах.

Исходные данные: векторы

a = ( 3 , — 2 , 1 ) b = ( 2 , 1 , 2 ) c = ( 3 , — 1 , — 2 )

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

Решение

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

A = 3 2 3 — 2 1 — 1 1 2 — 2 A = 3 — 2 1 2 1 2 3 — 1 — 2 = 3 · 1 · ( — 2 ) + ( — 2 ) · 2 · 3 + 1 · 2 · ( — 1 ) — 1 · 1 · 3 — ( — 2 ) · 2 · ( — 2 ) — 3 · 2 · ( — 1 ) = = — 25 ≠ 0 ⇒ R a n k ( A ) = 3

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

Ответ: указанные векторы являются базисом векторного пространства.

Исходные данные: векторы

a = ( 3 , — 2 , 1 ) b = ( 2 , 1 , 2 ) c = ( 3 , — 1 , — 2 ) d = ( 0 , 1 , 2 )

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

Решение

Указанная в условии задачи система векторов является линейно зависимой, т.к. максимальное число линейно независимых векторов равно 3. Таким образом, указанная система векторов не может служить базисом трехмерного векторного пространства. Но стоит отметить, что подсистема исходной системы a = ( 3 , — 2 , 1 ) , b = ( 2 , 1 , 2 ) , c = ( 3 , — 1 , — 2 ) является базисом.

Ответ: указанная система векторов не является базисом.

Исходные данные: векторы

a = ( 1 , 2 , 3 , 3 ) b = ( 2 , 5 , 6 , 8 ) c = ( 1 , 3 , 2 , 4 ) d = ( 2 , 5 , 4 , 7 )

Могут ли они являться базисом четырехмерного пространства?

Решение

Cоставим матрицу, используя в качестве строк координаты заданных векторов

A = 1 2 3 3 2 5 6 8 1 3 2 4 2 5 4 7

По методу Гаусса определим ранг матрицы:

A = 1 2 3 3 2 5 6 8 1 3 2 4 2 5 4 7

1 2 3 3 0 1 0 2 0 1 — 1 1 0 1 — 2 1

1 2 3 3 0 1 0 2 0 0 — 1 — 1 0 0 — 2 — 1

1 2 3 3 0 1 0 2 0 0 — 1 — 1 0 0 0 1 ⇒ ⇒ R a n k ( A ) = 4

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

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

Исходные данные: векторы

a ( 1 ) = ( 1 , 2 , — 1 , — 2 ) a ( 2 ) = ( 0 , 2 , 1 , — 3 ) a ( 3 ) = ( 1 , 0 , 0 , 5 )

Составляют ли они базис пространства размерностью 4?

Решение

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

Ответ: нет, не составляют.

Видео:§3 Координаты вектораСкачать

§3 Координаты вектора

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

Примем, что произвольные векторы e ( 1 ) , e ( 2 ) , . . . , e ( n ) являются базисом векторного n-мерного пространства. Добавим к ним некий n -мерный вектор x → : полученная система векторов станет линейно зависимой. Свойства линейной зависимости гласят, что хотя бы один из векторов такой системы может линейно выражаться через остальные. Переформулируя это утверждение, можно говорить о том, что хотя бы один из векторов линейно зависимой системы может раскладываться по остальным векторам.

Таким образом, мы пришли к формулировке важнейшей теоремы:

Любой вектор n -мерного векторного пространства единственным образом раскладывается по базису.

Докажем эту теорему:

зададим базис n -мерного векторного пространства — e ( 1 ) , e ( 2 ) , . . . , e ( n ) . Сделаем систему линейно зависимой, добавив к ней n -мерный вектор x → . Этот вектор может быть линейно выражен через исходные векторы e :

x = x 1 · e ( 1 ) + x 2 · e ( 2 ) + . . . + x n · e ( n ) , где x 1 , x 2 , . . . , x n — некоторые числа.

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

Отнимем от левой и правой частей этого равенства соответственно левую и правую части равенства x = x 1 · e ( 1 ) + x 2 · e ( 2 ) + . . . + x n · e ( n ) . Получим:

1 — x 1 ) · e ( 1 ) + ( x

2 — x 2 ) · e ( 2 ) + . . . ( x

Система базисных векторов e ( 1 ) , e ( 2 ) , . . . , e ( n ) линейно независима; по определению линейной независимости системы векторов равенство выше возможно только тогда, когда все коэффициенты ( x

2 — x 2 ) , . . . , ( x

n — x n ) будут равны нулю. Из чего справедливым будет: x 1 = x

n . И это доказывает единственный вариант разложения вектора по базису.

При этом коэффициенты x 1 , x 2 , . . . , x n называются координатами вектора x → в базисе e ( 1 ) , e ( 2 ) , . . . , e ( n ) .

Доказанная теория делает понятным выражение «задан n -мерный вектор x = ( x 1 , x 2 , . . . , x n ) »: рассматривается вектор x → n -мерного векторного пространства, и его координаты заданы в некотором базисе. При этом также понятно, что этот же вектор в другом базисе n -мерного пространства будет иметь другие координаты.

Рассмотрим следующий пример: допустим, что в некотором базисе n -мерного векторного пространства задана система из n линейно независимых векторов

e ( 1 ) = ( e 1 ( 1 ) , e 2 ( 1 ) , . . . , e n ( 1 ) ) e ( 2 ) = ( e 1 ( 2 ) , e 2 ( 2 ) , . . . , e n ( 2 ) ) ⋮ e ( n ) = ( e 1 ( n ) , e 2 ( n ) , . . . , e n ( n ) )

а также задан вектор x = ( x 1 , x 2 , . . . , x n ) .

Векторы e 1 ( 1 ) , e 2 ( 2 ) , . . . , e n ( n ) в этом случае также являются базисом этого векторного пространства.

Предположим, что необходимо определить координаты вектора x → в базисе e 1 ( 1 ) , e 2 ( 2 ) , . . . , e n ( n ) , обозначаемые как x

Вектор x → будет представлен следующим образом:

2 · e ( 2 ) + . . . + x

Запишем это выражение в координатной форме:

( x 1 , x 2 , . . . , x n ) = x

1 · ( e ( 1 ) 1 , e ( 1 ) 2 , . . . , e ( 1 ) n ) + x

2 · ( e ( 2 ) 1 , e ( 2 ) 2 , . . . , e ( 2 ) n ) + . . . + + x

n · ( e ( n ) 1 , e ( n ) 2 , . . . , e ( n ) n ) = = ( x

2 e 1 ( 2 ) + . . . + x

2 e 2 ( 2 ) + + . . . + x

n e 2 ( n ) , . . . , x

2 e n ( 2 ) + . . . + x

Полученное равенство равносильно системе из n линейных алгебраических выражений с n неизвестными линейными переменными x

n e 2 n ⋮ x n = x

Матрица этой системы будет иметь следующий вид:

e 1 ( 1 ) e 1 ( 2 ) ⋯ e 1 ( n ) e 2 ( 1 ) e 2 ( 2 ) ⋯ e 2 ( n ) ⋮ ⋮ ⋮ ⋮ e n ( 1 ) e n ( 2 ) ⋯ e n ( n )

Пусть это будет матрица A , и ее столбцы – векторы линейно независимой системы векторов e 1 ( 1 ) , e 2 ( 2 ) , . . . , e n ( n ) . Ранг матрицы – n , и ее определитель отличен от нуля. Это свидетельствует о том, что система уравнений имеет единственное решение, определяемое любым удобным способом: к примеру, методом Крамера или матричным методом. Таким образом мы сможем определить координаты x

n вектора x → в базисе e 1 ( 1 ) , e 2 ( 2 ) , . . . , e n ( n ) .

Применим рассмотренную теорию на конкретном примере.

Исходные данные: в базисе трехмерного пространства заданы векторы

e ( 1 ) = ( 1 , — 1 , 1 ) e ( 2 ) = ( 3 , 2 , — 5 ) e ( 3 ) = ( 2 , 1 , — 3 ) x = ( 6 , 2 , — 7 )

Необходимо подтвердить факт, что система векторов e ( 1 ) , e ( 2 ) , e ( 3 ) также служит базисом заданного пространства, а также определить координаты вектора х в заданном базисе.

Решение

Система векторов e ( 1 ) , e ( 2 ) , e ( 3 ) будет являться базисом трехмерного пространства, если она линейно независима. Выясним эту возможность, определив ранг матрицы A , строки которой – заданные векторы e ( 1 ) , e ( 2 ) , e ( 3 ) .

Используем метод Гаусса:

A = 1 — 1 1 3 2 — 5 2 1 — 3

1 — 1 1 0 5 — 8 0 3 — 5

1 — 1 1 0 5 — 8 0 0 — 1 5

R a n k ( A ) = 3 . Таким образом, система векторов e ( 1 ) , e ( 2 ) , e ( 3 ) линейно независима и является базисом.

Пусть в базисе вектор x → имеет координаты x

3 . Связь этих координат определяется уравнением:

3 e 1 ( 3 ) x 2 = x

3 e 2 ( 3 ) x 3 = x

Применим значения согласно условиям задачи:

Решим систему уравнений методом Крамера:

∆ = 1 3 2 — 1 2 1 1 — 5 — 3 = — 1 ∆ x

1 = 6 3 2 2 2 1 — 7 — 5 — 3 = — 1 , x

1 ∆ = — 1 — 1 = 1 ∆ x

2 = 1 6 2 — 1 2 1 1 — 7 — 3 = — 1 , x

2 ∆ = — 1 — 1 = 1 ∆ x

3 = 1 3 6 — 1 2 2 1 — 5 — 7 = — 1 , x

Так, вектор x → в базисе e ( 1 ) , e ( 2 ) , e ( 3 ) имеет координаты x

Ответ: x = ( 1 , 1 , 1 )

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

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

Связь между базисами

Предположим, что в некотором базисе n-мерного векторного пространства даны две линейно независимые системы векторов:

c ( 1 ) = ( c 1 ( 1 ) , c 2 ( 1 ) , . . . , c n ( 1 ) ) c ( 2 ) = ( c 1 ( 2 ) , c 2 ( 2 ) , . . . , c n ( 2 ) ) ⋮ c ( n ) = ( c 1 ( n ) , e 2 ( n ) , . . . , c n ( n ) )

e ( 1 ) = ( e 1 ( 1 ) , e 2 ( 1 ) , . . . , e n ( 1 ) ) e ( 2 ) = ( e 1 ( 2 ) , e 2 ( 2 ) , . . . , e n ( 2 ) ) ⋮ e ( n ) = ( e 1 ( n ) , e 2 ( n ) , . . . , e n ( n ) )

Указанные системы являются также базисами заданного пространства.

n ( 1 ) — координаты вектора c ( 1 ) в базисе e ( 1 ) , e ( 2 ) , . . . , e ( 3 ) , тогда связь координат будет задаваться системой линейных уравнений:

1 ( 1 ) e 1 ( 1 ) + c

2 ( 1 ) e 1 ( 2 ) + . . . + c

n ( 1 ) e 1 ( n ) с 2 ( 1 ) = c

1 ( 1 ) e 2 ( 1 ) + c

2 ( 1 ) e 2 ( 2 ) + . . . + c

n ( 1 ) e 2 ( n ) ⋮ с n ( 1 ) = c

1 ( 1 ) e n ( 1 ) + c

2 ( 1 ) e n ( 2 ) + . . . + c

В виде матрицы систему можно отобразить так:

( c 1 ( 1 ) , c 2 ( 1 ) , . . . , c n ( 1 ) ) = ( c

n ( 1 ) ) · e 1 ( 1 ) e 2 ( 1 ) … e n ( 1 ) e 1 ( 2 ) e 2 ( 2 ) … e n ( 2 ) ⋮ ⋮ ⋮ ⋮ e 1 ( n ) e 2 ( n ) … e n ( n )

Сделаем по аналогии такую же запись для вектора c ( 2 ) :

( c 1 ( 2 ) , c 2 ( 2 ) , . . . , c n ( 2 ) ) = ( c

n ( 2 ) ) · e 1 ( 1 ) e 2 ( 1 ) … e n ( 1 ) e 1 ( 2 ) e 2 ( 2 ) … e n ( 2 ) ⋮ ⋮ ⋮ ⋮ e 1 ( n ) e 2 ( n ) … e n ( n )

И, далее действуя по тому же принципу, получаем:

( c 1 ( n ) , c 2 ( n ) , . . . , c n ( n ) ) = ( c

n ( n ) ) · e 1 ( 1 ) e 2 ( 1 ) … e n ( 1 ) e 1 ( 2 ) e 2 ( 2 ) … e n ( 2 ) ⋮ ⋮ ⋮ ⋮ e 1 ( n ) e 2 ( n ) … e n ( n )

Матричные равенства объединим в одно выражение:

c 1 ( 1 ) c 2 ( 1 ) ⋯ c n ( 1 ) c 1 ( 2 ) c 2 ( 2 ) ⋯ c n ( 2 ) ⋮ ⋮ ⋮ ⋮ c 1 ( n ) c 2 ( n ) ⋯ c n ( n ) = c

n ( n ) · e 1 ( 1 ) e 2 ( 1 ) ⋯ e n ( 1 ) e 1 ( 2 ) e 2 ( 2 ) ⋯ e n ( 2 ) ⋮ ⋮ ⋮ ⋮ e 1 ( n ) e 2 ( n ) ⋯ e n ( n )

Оно и будет определять связь векторов двух различных базисов.

Используя тот же принцип, возможно выразить все векторы базиса e ( 1 ) , e ( 2 ) , . . . , e ( 3 ) через базис c ( 1 ) , c ( 2 ) , . . . , c ( n ) :

e 1 ( 1 ) e 2 ( 1 ) ⋯ e n ( 1 ) e 1 ( 2 ) e 2 ( 2 ) ⋯ e n ( 2 ) ⋮ ⋮ ⋮ ⋮ e 1 ( n ) e 2 ( n ) ⋯ e n ( n ) = e

n ( n ) · c 1 ( 1 ) c 2 ( 1 ) ⋯ c n ( 1 ) c 1 ( 2 ) c 2 ( 2 ) ⋯ c n ( 2 ) ⋮ ⋮ ⋮ ⋮ c 1 ( n ) c 2 ( n ) ⋯ c n ( n )

Дадим следующие определения:

n ( n ) является матрицей перехода от базиса e ( 1 ) , e ( 2 ) , . . . , e ( 3 )

к базису c ( 1 ) , c ( 2 ) , . . . , c ( n ) .

n ( n ) является матрицей перехода от базиса c ( 1 ) , c ( 2 ) , . . . , c ( n )

к базису e ( 1 ) , e ( 2 ) , . . . , e ( 3 ) .

Видео:Лекция 16. Понятие вектора и векторного пространства. Базис векторного пространства.Скачать

Лекция 16. Понятие вектора и векторного пространства. Базис векторного пространства.

3D своими руками. Часть 2: оно трехмерное

Как построить вектор в трехмерной системе координат

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

Во второй части мы рассмотрим:

  • Системы координат
  • Точка и вектор
  • Матрица
  • Вершины и индексы
  • Конвейер визуализации

Системы координат

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

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

Как построить вектор в трехмерной системе координат
Что такое система координат? Это способ определять положение точки или персонажа игры состоящего из точек при помощи чисел. Система координат имеет 2 направления осей (будем их обозначать как X, Y), если мы работаем с 2D графикой. Если мы 2D-объекту зададим больший Y и он станет выше, чем был до этого – это значит, что ось Y направлена вверх. Если мы объекту зададим больший Х и он станет правее – это значит, что ось Х направлена вправо. Это и есть направления осей, а вместе они называются системой координат. Если в месте пересечения осей Х и Y образуется угол 90 градусов, то такую систему координат называют прямоугольной (еще называют Декартовой системой координат) (см. Рисунок выше).

Как построить вектор в трехмерной системе координат

Но это была система координат в 2D мире, в трехмерном же, появляется еще одна ось – Z. Если ось Y (еще говорят ордината) позволяет рисовать выше/ниже, ось Х (еще говорят абсцисса) левее/правее, то ось Z (еще говорят аппликата) позволяет отдалять/приближать объекты. В трехмерной графике часто (но не всегда) используется система координат, в которой ось Y направлена вверх, ось Х направлена вправо, а вот Z может быть направлена, либо в одном направление, либо в другом. Именно поэтому системы координат мы разделим на 2 типа – левостороннюю и правостороннюю (см. Рисунок выше).

Как видно из рисунка, левосторонней системой координат (еще говорят левая система координат) называют когда ось Z, направлена от нас (чем больше Z, тем дальше объект), если же ось Z направлена к нам, то это – правосторонняя система координат (еще говорят правая система координат). Почему их так назвали? Левая, потому что, если левую руку направить ладонью вверх, а пальцами в сторону оси Х, то большой палец укажет направление Z, то есть, будет направлен в сторону монитора, если Х направлен вправо. Тоже проделайте с правой рукой, и ось Z будет направлена от монитора, при Х вправо. Запутались с пальцами? В интернете есть разные способы ставить руку и пальцы, чтобы получить нужные направления осей, но это не обязательная часть.

Для работы с 3D-графикой есть много библиотек для разные языков, где используются разные системы координат. Например, в библиотеке Direct3D используется левосторонняя система координат, а в OpenGL и WebGL правосторонняя, в VulkanAPI ось Y направлена вниз (чем меньше Y тем выше будет объект) а Z от нас, но это всего лишь соглашения, в библиотеках мы можем сами указать ту систему координат, которую считаем более удобной.

Какую систему координат выбрать нам? Подойдет любая, мы только учимся и направления осей сейчас на усвоение материала не повлияют. В примерах мы будем использовать правостороннюю систему координат и чем меньше мы укажем Z для точки, тем дальше она будет от экрана, при этом X,Y будут направлены вправо/вверх.

Точка и вектор

Теперь вы базово знаете, что такое системы координат и какие есть направления осей. Далее необходимо разобрать, что такое точка и вектор, т.к. они нам понадобятся в этой статье для практики. Точкой в 3D-пространстве называют какое-то местоположение, заданное через [X, Y, Z]. Например, мы своего персонажа хотим разместить в самом начале координат (возможно, в центре окна), тогда его положение будет [0, 0, 0], или же можно сказать, что он расположен в точке [0, 0, 0]. Теперь, мы хотим разместить противника левее игрока на 20 единиц (к примеру, пикселей), значит, он будет расположен в точке [-20, 0, 0]. Мы постоянно будем работать с точками, поэтому подробнее их разберем позже.

Что такое вектор? Это направление. В 3D-пространстве оно описывается, как и точка, 3-мя значениями [X, Y, Z]. Например, нам необходимо передвигать персонажа вверх на 5 единиц каждую секунду, значить мы будем менять Y, добавляя к нему каждую секунду 5, но X и Z трогать не будем, такое перемещение можно записать в виде вектора [0, 5, 0]. Если же наш персонаж постоянно двигается вниз на 2 единицы и вправо на 1, то вектор его перемещения будет выглядеть так: [1, -2, 0]. Мы написали -2 т.к. Y вниз уменьшается.

У вектора нет положения, а [X, Y, Z] обозначают направление. Вектор можно прибавлять к точке, для того, чтобы получить новую точку, смещенную на вектор. Например, выше я уже упомянул, что если мы хотим двигать 3D-объект (например, игрового персонажа) каждую секунду на 5 единиц вверх, то вектор смещения будет таким: [0, 5, 0]. Но как его использовать для перемещения?

Допустим, персонаж находится в точке [5, 7, 0], а вектор смещения [0, 5, 0]. Если мы прибавим к точке вектор, то получим новое положение игрока. Складывать точку с вектором, или вектор с вектором можно по следующему правилу.

Пример сложения точки и вектора :

[ 5, 7, 0 ] + [ 0, 5, 0 ] = [ 5 + 0 , 7 + 5 , 0 + 0 ] = [5, 12, 0] – это и есть новое положения нашего персонажа.

Как видим, наш персонаж передвинулся на 5 единиц вверх, отсюда появляется новое понятие – длина вектора. У каждого вектора она есть, кроме вектора [0, 0, 0], который называют нулевым вектором, такой вектор также не имеет направления. У вектора [0, 5, 0] длина равна 5, т.к. такой вектор смещает точку на 5 единиц вверх. У вектора [0, 0, 10] длина 10, т.к. он может сместить точку на 10 по оси Z. Но вот у вектора [12, 3, -4] «на глаз» и не скажешь какая длина, поэтому будем использовать формулу вычисления длины вектора. Возникает вопрос, зачем нам длина вектора? Одно и применений – узнать на какое расстояние переместится персонаж или чтобы сверить скорости персонажей, у кого длина вектора смещения больше, тот и быстрее. Длина также используется для кое-каких операций над векторами. Длину вектора можно вычислить по следующей формуле из первой части (только добавился Z):

Как построить вектор в трехмерной системе координат

Давайте посчитаем по формуле выше длину вектора [6, 3, -8];

Как построить вектор в трехмерной системе координат

Длина вектора [6, 3, -8] приблизительно равна 10.44.

Мы уже знаем, что такое точка, вектор, как суммировать точку и вектор (или 2 вектора), и как вычислять длину вектора. Давайте добавим класс вектора и реализуем в нем суммирование и вычисление длины. Хочу также обратить внимание на то, что мы не будем создавать класс для точки, если нам понадобится точка, то мы будем использовать класс вектора, т.к. и точка и вектор хранят в себе X, Y, Z, просто для точки это положение, а для вектора направление.

Добавьте в проект с предыдущей статьи класс вектора, можно его добавить ниже класса Drawer. Я свой класс назвал Vector и добавил в него 3 свойства X, Y, Z:

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

Теперь реализуем суммирование векторов. Функция будет принимать 2 суммируемых вектора, поэтому я думаю сделать ее статической. Тело функции будет работать согласно формуле выше. Результатом нашего суммирования получится новый вектор, которым мы и будем возвращать:

Осталось реализовать функцию вычисления длины вектора. Опять же, все реализовываем по формулам, которые были выше:

Теперь посмотрим на еще одну операцию над вектором, которая понадобится немного позже в этой и много в последующих статьях – «нормализация вектора». Допустим, у нас в игре есть персонаж, которого мы перемещаем клавишами стрелок. Если нажимаем вверх, то он перемещается на вектор [0, 1, 0], если вниз то [0, -1, 0], влево [-1, 0, 0] и вправо [1, 0, 0]. Здесь хорошо видно, что длины каждого из векторов равны 1, то есть, скорость персонажа равна 1. А давайте добавим перемещение по диагонали, если игрок зажимает стрелочку вверх и вправо, то какой будет вектор смещения? Самый очевидный вариант это вектор [1, 1, 0]. Но если посчитаем его длину, то увидим, что она приблизительно равна 1.414. Получается, что наш персонаж по диагонали будет ходить быстрее? Такой вариант не годится, но чтобы наш персонаж ходил по диагонали со скоростью 1, вектор должен быть: [0.707, 0.707, 0]. Откуда я взял такой вектор? Я взял вектор [1, 1, 0] и нормализовал его, после чего получил [0.707, 0.707, 0]. То есть, нормализация – это приведение вектора к длине 1 (единичной длине) без изменения его направления. Заметьте, что векторы [0.707, 0.707, 0] и [1, 1, 0] указывают в одном направлении, то есть персонаж будет в обоих случаях двигаться строго вверх вправо, но вектор [0.707, 0.707, 0] является нормализованным и скорость персонажа теперь будет равно 1, что исключит баг с ускоренным перемещением по диагонали. Рекомендуется всегда перед любыми вычислениями нормализовать вектор во избежание различного рода ошибок. Давайте посмотрим, как нормализовать вектор. Нужно разделить каждую его компоненту (X, Y, Z) на его длину. Функция нахождения длины уже есть, половина дела сделана, теперь напишем функцию нормализации вектора (внутри класса Vector):

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

Теперь, когда мы знаем что такое нормализация вектора, и знаем что ее лучше выполнять перед использованием вектора, возникает вопрос. Если нормализация вектора – это приведение к единичной длине, то есть скорость перемещения объекта (персонажа) будет равна 1, то как ускорить персонаж? Например, при перемещении персонажа по диагонали вверх/вправо со скоростью 1, его вектор будет [0.707, 0.707, 0], а какой вектор будет если мы захотим персонажа перемещать в 6 раз быстрее? Для этого существует операция, которая называется «умножение вектора на скаляр». Скаляром называют обычное число на которое умножают вектор. Если скаляр будет равен 6, то вектор станет в 6 раз длиннее, а наш персонаж в 6 раз быстрее соответственно. Как же выполнить умножение на скаляр? Для этого необходимо умножить каждую компоненту вектора на скаляр. Например, решим задачу выше, когда персонажа перемещающегося на вектор [0.707, 0.707, 0] (скорость 1) необходимо ускорить в 6 раз, то есть умножить вектор на скаляр 6. Формула умножения вектора «V» на скаляр «s» следующая:

Как построить вектор в трехмерной системе координат

В нашем случае это будет:
Как построить вектор в трехмерной системе координат– новый вектор перемещения, длина которого равна 6.

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

Давайте реализуем функцию multiplyByScalar умножения вектора на скаляр в нашем классе Vector:

Матрица

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

Можно сказать, что матрица – это самый обычный двумерный массив. Просто в программирования используют термин «двумерный массив», а в математике «матрица». Для чего же в 3D-программировании нужны матрицы? Это мы разберем, как только немного научимся с ними работать.

Мы будем использовать только числовые матрицы (массив чисел). У каждой матрицы есть свой размер (как у любого 2-мерного массива). Вот несколько примеров матриц:

Как построить вектор в трехмерной системе координат

Матрица 2 на 3

Как построить вектор в трехмерной системе координат

Матрица 3 на 3

Как построить вектор в трехмерной системе координат

Матрица 4 на 1

Как построить вектор в трехмерной системе координат

Матрица 4 на 3

ПРИМЕР

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

  • Если мы пытаемся умножить число A на число B, то это ведь то же самое, что и B * A. Если мы переставляем, при каком либо действии операнды и результат не меняется, то говорят, что операция коммутативна. Пример: a + b = b + a операция коммутативна, a – b ≠ b – a операция некоммутативна, a * b = b * a операция умножения чисел – коммутативна. Так вот, операция умножения матриц некоммутативна в отличии от умножения чисел. То есть, умножение матрицы M на матрицу N не будет равно умножению матрицы N на M.
  • Умножение матриц возможно, если количество столбцов первой матрицы (которая слева) равняется количеству строк второй матрицы (которая справа).

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

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Умножение M1 на M2 возможно, т.к. в первой матрице 2 столбца, а во второй 2 строки.

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Умножение М1 на М2 возможно, т.к. в первой матрице 3 столбца, а во второй 3 строки.

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Умножение М1 на М2 невозможно, т.к. в первой матрице 2 столбца, а во второй 3 строки.

Думаю, данные примеры немного разъяснили картину, когда возможно умножение. Результатом умножения матриц, будет всегда матрица, количество строк которой будет равно количеству строк 1-й матрицы, а количество столбцов, равно количеству столбцов 2-й. Например, если умножить матрицу 2 на 6 и 6 на 8, то получится матрица размером 2 на 8. Теперь перейдем, непосредственно к самому умножению.

Для умножения важно помнить, что столбцы и строки в матрице нумеруются начиная с 1, а в массиве с 0. Первый индекс в элементе матрицы, указывает на номер строки, а второй на номер столбца. То есть, если элемент матрицы (элемент массива) записан в виде: m28, это значит что мы обращаемся ко второй строке и восьмому столбцу. Но поскольку в коде мы будем работать с массивами, вся индексация строк и столбцов у нас будет начинаться с 0.

Давайте попробуем перемножить 2 матрицы A и B с конкретными размерами и элементами:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Видно, что матрица А имеет размер 3 на 2, а матрица В размер 2 на 2, умножение возможно:

Как построить вектор в трехмерной системе координат

Как видим, у нас получилась матрица 3 на 2, умножение поначалу запутанное, но если есть цель научиться умножать «без напряга», необходимо решить несколько примеров. Вот еще пример умножения матриц A и В:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

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

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

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

Как построить вектор в трехмерной системе координат

Квадратная матрица 2 на 2

Как построить вектор в трехмерной системе координат

Квадратная матрица 3 на 3

Как построить вектор в трехмерной системе координат

Квадратная матрица 4 на 4

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Еще важно запомнить такое свойство, что если умножить любую матрицу M на подходящую по размеру единичную матрицу, к примеру назовем ее I, то получим исходную матрицу M, например: M * I = M или I * M = M. Т.е. умножение матрицы на единичную матрицу никак не влияет на результат. К единичной матрице мы вернемся позднее. В 3D-программировании мы часто будем использовать квадратную матрицу 4 на 4.

Теперь немного разберем, зачем нам нужны будут матрицы и зачем их умножать? В 3D-программировании существует множество различных матриц 4 на 4, которые если умножить на вектор или точку, будут выполнять нужные нам действия. Например, нам необходимо повернуть персонажа в трехмерном пространстве вокруг оси Х, как это сделать? Умножить вектор на специальную матрицу, которая отвечает за поворот вокруг оси X. Если нужно переместить и повернуть точку вокруг начала координат, то нужно умножить эту точку на специальную матрицу. У матриц есть прекрасное свойство – комбинирования преобразований (рассмотрим в этой статье). Допустим, нам необходимо персонажа состоящего из 100 точек (вершин, но об этом тоже будет немного ниже) в приложении увеличить в 5 раз, потом повернуть на 90 градусов по Х, потом перенести на 30 единиц вверх. Как уже было сказано – для разных действий уже существуют специальные матрицы, которые мы рассмотрим. Для выполнения задачи выше, мы, к примеру, в цикле перебираем все 100 точек и каждую сначала умножаем на 1-ю матрицу, чтобы увеличить персонажа, затем умножаем на 2-ю матрицу, чтобы повернуть на 90 градусов по Х, потом умножаем на 3-ю для перемещения на 30 единиц вверх. Итого, для каждой точки у нас 3 умножения матрицы, а точек 100, значит, умножений будет 300. Но если мы возьмем и перемножим между собой матрицы для увеличения в 5-ть раз, поворота на 90 градусов по Х и перемещение на 30 ед. вверх, то получим матрицу, которая в себе содержит все эти действия. Умножив точку на такую матрицу, точка окажется там, где нужно. Подсчитаем теперь, сколько действий выполняется: 2 умножения для 3-х матриц, и 100 умножений для 100 точек, итого 102 умножения – точно лучше, чем 300 умножений до этого. Тот момент, когда мы перемножили 3 матрицы для объединения различных действий в одну матрицу – называется комбинированием преобразований и мы его обязательно сделаем на примере.

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

Например, у нас есть вектор [10, 2, 5] и есть матрица:

Как построить вектор в трехмерной системе координат

Видно, что вектор можно представить матрицей 1 на 3 или матрицей 3 на 1. Поэтому мы можем умножить вектор на матрицу 2 способами:

Как построить вектор в трехмерной системе координат

Здесь мы представили вектор, как матрицу 1 на 3 (еще говорят вектор-строка). Такое умножение возможно, т.к. в первой матрице (векторе-строке) 3 столбца, а во второй матрице 3 строки.

Как построить вектор в трехмерной системе координат

Здесь мы представили вектор, как матрицу 3 на 1 (еще говорят вектор-столбец). Такое умножение возможно, т.к. в первой матрице 3 столбца, а во второй (векторе-столбце) 3 строки.

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

Умножаем вектор-строку на матрицу:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Теперь, умножим матрицу на вектор-столбец:

Как построить вектор в трехмерной системе координат

Мы видим, что умножая вектор-строку на матрицу и матрицу на вектор-столбец, мы получили совершенно разные результаты (вспоминаем про коммутативность). Поэтому, в 3D-программировании существую матрицы, которые предназначены для умножения только на вектор строку, или только на вектор столбец. Если мы умножим матрицу предназначенную для вектора-строки на вектор-столбец, то получим результат, который нам ничего не даст. Используйте удобное вам представление вектора/точки (строка или столбец), только в дальнейшем используйте для вашего представления вектора/точки соответствующие матрицы. В Direct3D, например, используют строковое представление векторов, и все матрицы в Direct3D предназначение для умножения вектора-строки на матрицу. В OpenGL используется представление вектора (или точки), как столбца, и все матрицы предназначены для умножения матрицы на вектор-столбец. В статьях будем использовать вектор-столбец и будем умножать, матрицу на вектор-столбец.

Подведем небольшой итог прочитанного про матрицы.

  • Для выполнения действия над вектором (или точкой) существуют специальные матрицы, некоторые из которых мы посмотрим в этой статье.
  • Для объединения преобразования (перемещения, вращения и т.д.) мы можем перемножить матрицы каждого преобразования между собой и получим матрицу, которая содержит все преобразования вместе.
  • В 3D-программировании мы постоянно будем использовать квадратные матрицы 4 на 4.
  • Мы можем умножать матрицу на вектор (или точку) представив его, как столбец или строку. Но для вектора-столбца и вектора-строки нужно использовать разные матрицы.

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

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

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

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

Теперь необходимо реализовать умножение матрицы на вектор-столбец, как обсудили выше. Но если представить вектор столбцом, то получится матрица вида: Как построить вектор в трехмерной системе координат
на которую нам нужно будет умножать на матрицы 4 на 4 для выполнения различных действий. Но на этом примере прекрасно видно, что такое умножение выполнить нельзя, ведь у вектора-столбца 3 строки, а у матрицы 4 столбца. Что же тогда делать? Нужен какой-то четвертый элемент, тогда у вектора станет 4 строки, которые будут равны количеству столбцов у матрицы. Давайте добавим вектору такой 4-й параметр и назовем его W, теперь у нас все вектора в 3D будут вида [X, Y, Z, W] и такие вектора уже можно будет умножать на матрицу 4 на 4. На самом деле у компоненты W более глубокое назначение, но с ним мы познакомимся в следующей части (ведь не зря у нас матрица 4 на 4, а не 3 на 3). Добавляем в класс Vector, который мы создавали выше компоненту w. Теперь начало класса Vector выглядит так:

Я проинициализировал W единицей, но почему 1? Если мы присмотримся к тому, как умножаются компоненты матрицы и вектора (пример кода ниже), можно заметить, что если поставить в качестве W значение 0 или любое другое отличное от 1, тогда при умножении этот W будет влиять на результат, а мы пока не знаем, как им пользоваться, а если мы его сделаем 1, то он в векторе будет, но результат никак не поменяет.

Теперь вернемся к матрице и реализуем в классе Matrix (можно и в классе Vector, разницы нет) умножения матрицы на вектор, которое уже возможно, благодаря W:

Обратите внимание, что матрицу мы представили массивом 4 на 4, а вектор объектом со свойствами x, y, z, w, в будущем мы вектор поменяем и он тоже будет представлен массивом 1 на 4, т.к. это ускорит умножение. Но сейчас, для того чтобы лучше видеть, как происходит умножение и улучшить понимание кода, мы менять вектор не будем.

Код для умножения матриц между собой и умножения матрицы на вектор мы написали, но все еще не понятно как это нам поможет в трехмерной графике.

Хочу также напомнить, что я вектором называю как точку (положение в пространстве) так и направление, т.к. оба объекта содержат одинаковую структуру данных x, y, z и нововведенный w.

Давайте рассмотрим некоторые из матриц, которые выполняют базовые операции над векторами. Первой из таких матриц будет матрица перемещения (Translation matrix). Умножив матрицу перемещения на вектор (местоположение) он сместится на указанное число единиц в пространстве. А вот и матрица перемещения:

Как построить вектор в трехмерной системе координат

Где dx, dy, dz означают смещения по осям x,y,z соответственно, эта матрица предназначена для умножения на вектор-столбец. Такие матрицы можно найти в интернете или в любой литературе по 3D-программированию, нам не нужно их создавать самим, воспринимайте их сейчас, как формулы, которыми вы пользуетесь со школы, которые просто нужно знать или понимать для чего их использовать. Давайте проверим действительно ли умножив такую матрицу на вектор произойдет смещение. Возьмем в качестве вектора, который мы собираемся перемещать вектор [10, 10, 10, 1] (4-й параметр W всегда оставляем 1) предположим, что это положение нашего персонажа в игре и мы хотим его сместить на 10 единиц вверх, 5 единиц вправо, и на 1 единицу отдалить от экрана. Тогда вектор смещения будет таким [10, 5, -1] ( -1 потому что у нас правосторонняя система координат и чем дальше Z, тем он меньше). Если мы посчитаем результат без матриц, обычным суммированием векторов. То получится такой результат: [10 + 10, 10 + 5, 10 + -1, 1] = [20, 15, 9, 1] – это новые координаты нашего персонажа. Умножив матрицу выше на начальные координаты [10, 10, 10, 1], мы должны получить такой же результат, давайте проверим это в коде, напишем умножение после классов Drawer, Vector и Matrix:

В этом примере, в матрицу перемещения мы подставили нужное смещение персонажа (translationMatrix), проинициализировали его начальное положение (characterPosition) и потом перемножили его с матрицей, а результат вывели через console.log (это отладочный вывод в JS). Если вы используете не JS, то выведите X, Y, Z самостоятельно при помощи инструментов вашего языка. Результат, который мы получили в консоли: [20, 15, 9, 1], все сходится с результатом, который мы посчитали выше. У вас может возникнуть вопрос, зачем получать такой же результат умножением вектора на специальную матрицу, если мы его гораздо проще получили просуммировав вектор со смещением покомпонентно. Ответ не самый простой и мы подробнее его еще обсудим, но сейчас можно отметить что как обсуждалось ранее, мы матрицы с разными преобразованиями можем комбинировать между собой, таким образом сокращая очень много вычислений. Матрицу translationMatrix в примере выше, мы создали в виде массива вручную и подставили туда необходимое смещение, но поскольку мы этой и другими матрицами будем пользоваться часто, то давайте вынесем ее в метод в классе Matrix, и смещение в нее будем передавать аргументами:

Присмотритесь еще раз к матрице перемещения, вы увидите, что dx, dy, dz находятся в последнем столбце и если мы посмотрим код умножения матрицы на вектор, то заметим, что именно этот столбец умножается на W компоненту вектора. И если бы она была, например 0, то dx, dy, dz, мы бы умножали на 0 и перемещение не работало бы. Но мы можем W делать равное 0, если мы хотим в классе Vector хранить направление, т.к. направление перемещать нельзя, то так бы мы обезопасили себя, и даже если мы умножим такое направление на матрицу перемещения, то это никак не поломает вектор направления, т.к. все перемещение будем умножаться на 0.

Итого можем применить такое правило, местоположение мы создаем так:

А направление создам так:

Так мы сможем отличать местоположение и направление, и при умножении направления на матрицу перемещения мы случайно не сломаем вектор направления.

Вершины и индексы

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

Как построить вектор в трехмерной системе координат

На изображении мы видим, что у куба 8 вершин (для удобства я их пронумеровал). И все вершины между собой соединены линиями (ребра куба). Т.е., чтобы описать куб и нарисовать его линиями, нам нужно 8 координат каждой вершины, и также нужно указать из какой вершины до какой нам рисовать линию, чтобы получился куб, ведь если мы мы неправильно соединим вершины, например проведем линию из вершины 0 в вершину 6, то это точно будет не куб, а другой объект. Давайте сейчас опишем координаты каждой из 8 вершин. В современной графике 3D-модели могут состоять из десятков тысяч вершин, и конечно же никто вручную их не прописывает. Модели рисуют в 3D-редакторах и когда экспортируют 3D-модель, в ее коде уже есть все вершины, нам нужно только их загрузить и нарисовать, но мы пока что учимся и не умеем читать форматы 3D-моделей, поэтому куб опишем вручную, он очень простой.

Представим, что куб выше, находится в центре координат, его середина находится в точке 0, 0, 0 и он должен отображаться вокруг этого центра:

Как построить вектор в трехмерной системе координат

Давайте начнем с вершины 0, и пусть наш куб будет очень маленьким, чтобы не писать сейчас большие значения, размеры моего куба будут 2 в ширину, 2 в высоту и 2 в глубину, т.е. 2 на 2 на 2. На картинке видно, что вершина 0 немного левее центра 0, 0, 0, поэтому я задам X = -1, т.к. чем левее, тем меньше X, также вершина 0 немного выше центра 0, 0, 0, а в нашей системе координат чем выше местоположение, тем больше Y, я задам своей вершине Y = 1, также Z для вершины 0, немного ближе к экрану по отношению к точке 0, 0, 0, поэтому он будет равен Z = 1, ведь в правосторонней системе координат, Z увеличивается с приближением объекта. В итоге мы получили координаты -1, 1, 1 для нулевой вершины, давайте проделаем то же самое для оставшихся 7-ми вершин и сохраним это в массиве, чтобы можно было с ними работать в цикле, у меня получился такой результат (массив можно создать ниже классов Drawer, Vector, Marix):

Каждую вершину я положил в экземпляр класса Vector, это не лучший вариант для производительности (лучше в массиве), но сейчас наша цель разобраться как все работает.

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

Просто точки куба рисовать пикселями не очень наглядно, т.к. все что мы увидим – это 8 пикселей, по одному на каждую вершину, гораздо лучше нарисовать куб линиями используя функцию drawLine из прошлой статьи. Но для этого нам нужно понять из каких вершин в какие у нас проходят линии. Взглянем на изображение куба с индексами еще раз и мы увидим, что он состоит из 12 линий (или ребер). Также очень легко увидеть что мы знаем координаты начала и конца каждой линии. Например одна из линий (верхняя ближняя) должна быть нарисована из вершины 0 в вершину 3, или же из координат [-1, 1, 1] в координаты [1, 1, 1]. Информацию о каждой линии нам придется записать в коде вручную смотря на изображение куба, но как правильно это сделать? Если у нас 12 линий и у каждой линии есть начало и конец, т.е. 2 точки, тогда, чтобы нарисовать куб нам понадобится 24 точки? Это правильный ответ, но давайте взглянем на изображение куба еще раз и обратим внимание на то что у куба каждая линия имеет общие вершины, например, в вершине 0 соединяются 3 линии, и так с каждой вершиной. Мы можем сэкономить память и не записывать координаты начала и конца каждой линии, достаточно создать массив и указать индексы вершин из массива vertices в которых эти линии начинаются и заканчиваются. Давайте создадим такой массив и опишем его только индексами вершин, по 2 индекса на каждую линию (начало линии и конец). А немного далее, когда будем рисовать эти линии, мы с легкостью достанем их координаты из массива vertices. Мой массив линий (я назвал его edges, т.к. это ребра куба) я создал ниже массив вершин и выглядит он так:

В этом массиве 12 пар индексов, по 2 индекса вершин на каждую линию.

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

Как построить вектор в трехмерной системе координат

Параметры sx, sy, sz на главной диагонали означают во сколько раз мы хотим увеличить объект. Если мы в матрицу подставим 10, 10, 10 вместо sx, sy, sz, и умножим эту матрицу на вершины куба, это сделает что наш куб в десять раз больше и он уже будет не 2 на 2 на 2, а 20 на 20 на 20.

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

Конвейер визуализации

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

Обратите внимание, что мы не меняем исходные вершины куба, а сохраняем результат умножения в массив sceneVertices, потому что мы можем захотеть нарисовать несколько кубов разных размеров в разных координатах, и если мы будем менять исходные координаты, то следующий куб уже нарисовать не получится, т.к. не из чего будет начинать, начальные координаты будут испорчены первым кубом. В коде выше я увеличил исходный куб в 100 раз по всем направлениям, благодаря умножению всех вершины на матрицу масштабирования с аргументами 100, 100, 100, и также я переместил все вершины куба правее и ниже на 400 и -300 пикселей соответственно, поскольку у нас размеры canvas с прошлой статьи 800 на 600, это как раз будет половина ширины и высоты области рисования, иными словами – центр.

С вершинам мы пока что закончили, но еще нужно все это нарисовать используя drawLine и массив edges, давайте ниже цикла с вершинами напишем еще один цикл для перебора edges и в нем нарисуем все линии:

Вспомним, в прошлой статье все рисование мы начинаем с очистки экрана от предыдущего состояния вызовом метод clearSurface, затем я перебираю все грани куба и рисую куб линиями синего цвета (0, 0, 255), а сами координаты линий я беру из массива sceneVertices, т.к. там лежат уже отмасштабированные и перемещенные вершины в предыдущем цикле, но индексы этих вершин совпадают с индексами оригинальных вершин из массива vertices, т.к. я обрабатывал их и ложил в массив sceneVertices без изменения порядка.

Если мы сейчас запустим код, то ничего не увидим на экране. Это потому что в нашей системе координат Y смотрит вверх, а в системе координат canvas вниз. Получается, что наш куб есть, но он находится за пределами экрана и чтобы это исправить, нам нужно перед рисованием пикселя в классе Drawer перевернуть картинку по Y (отзеркалировать). Пока что такого варианта нам будет достаточно, в итоге код рисования пикселя у меня выглядит так:

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

Если сейчас вы запустите код, то на экране будет такое изображение:

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Матрица поворота вокруг оси X

Как построить вектор в трехмерной системе координат

Матрица поворота вокруг оси Y

Как построить вектор в трехмерной системе координат

Матрица поворота вокруг оси Z

Если мы умножим вершины куба на одну из этих матриц, то куб повернется на указанный угол (a) вокруг той оси, матрицу поворота вокруг которой мы выберем. Тут есть некоторые особенности при повороте вокруг сразу нескольких осей и на них мы посмотрим ниже. Из примера матриц видно, что они используют 2 функции sin и cos и в JavaScript уже есть функционал для их вычисления Math.sin(a) и Math.cos(a), но они работают с радианной мерой углов, которая может показаться не самой удобной, если мы хотим повернуть модель. Мне, например, гораздо удобнее что-то повернуть на 90 градусов (градусная мера), что в радианной мере будет означать Pi / 2 (В JS также есть приблизительное значение Pi это константа Math.PI). Давайте в класс Matrix добавим 3 метода для получения матриц вращения, с принимаемым углом поворота в градусах, который мы преобразуем в радианы, т.к. они нужны для работы функций sin / cos:

Все 3 метода начинаются с преобразования градусов в радианы, после чего мы подставляем угол поворота в радианах в матрицу поворота, передавая углы в функции sin и cos. Почему матрица именно такая, вы можете подробнее прочитать на хабре в тематических статьях, с очень подробным разъяснением, в противном случае – вы можете воспринимать эти матрицы как формулы, которые вычислили для нас и мы можем быть уверенными в том, что они рабочие.

Выше в коде мы реализовали 2 цикла, первый – преобразовывает вершины, второй – выводит линии по индексам вершин, в итоге мы получаем из вершин картинку на экране, и давайте этот участок кода назовем конвейер визуализации. Конвейер потому что мы берем вершину и поочередно делаем с ней разные операции, масштаб, сдвиг, поворот, отрисовку, как на обычном промышленном конвейере. Теперь давайте в первый цикл в конвейере визуализации добавим помимо масштабирования, еще и поворот вокруг осей. Сначала я поверну вокруг X, потом вокруг Y, затем увеличу модель и перемещу ее (2 последних действия уже есть), итого весь код цикла у меня будет таким:

В этом примере я повернул все вершины вокруг оси X на 20 градусов, потом вокруг Y на 20 градусов и 2 оставшихся преобразования у меня уже были. Если вы все сделали правильно, то ваш куб, теперь должен выглядеть трехмерным:

Как построить вектор в трехмерной системе координат

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

Как построить вектор в трехмерной системе координат

Как построить вектор в трехмерной системе координат

Поворот на 20 градусов вокруг X, затем на 20 градусов вокруг YПоворот на 20 градусов вокруг Y, затем на 20 градусов вокруг X

Есть и другие особенности, например, если куб повернуть на 90 градусов по оси Х, затем на 90 градусов по оси Y, и наконец, на 90 градусов вокруг оси Z, то последний поворот вокруг Z, отменит поворот вокруг Х, и получится такой же результат как если бы вы просто повернули фигуру на 90 градусов вокруг оси Y. Чтобы посмотреть почему так происходит, возьмите любой прямоугольный (или кубический) объект в руки (напр. собранный кубик Рубика), запомните начальное положение объекта и проверните его сначала на 90 градусов вокруг воображаемого Х, а затем на 90 градусов вокруг Y и на 90 градусов вокруг Z и запомните, какой стороной он к вам стал, затем начните с запомненного ранее начального положения и проделайте то же самое, убрав повороты повороты X и Z, повернути только вокруг Y — вы увидите, что результат одинаковый. Сейчас мы не будем решать эту проблему и вдаваться в ее подробности, такое вращение на данный момент нас полностью устраивает, но мы эту проблему еще упомянем в третьей части (если хочется подробнее разобраться сейчас, попробуйте поискать статьи на хабре по запросу «шарнирный замок»).

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

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

Давайте добавим простейшую анимацию, а именно – будем менять угол вращения вокруг оси Y в интервале, например, будем изменять угол вращения вокруг оси Y на 1 градус, каждые 100 миллисекунд. Для этого нужно положить код конвейера визуализации в функцию setInterval, которую мы впервые использовали в 1-й статье. Код конвейера с анимацией выглядит так:

Результат должен быть таким:

Как построить вектор в трехмерной системе координат

Последнее, что мы сделаем в этой части – вывод осей системы координат на экран, чтобы было видно вокруг чего вращается наш куб. Ось Y нарисуем из центра вверх, длинной в 200 пикселей, ось X – вправо, тоже длинной 200 пикселей, а ось Z, нарисуем вниз и влево (по диагонали) длинной 150 пикселей, как это показано в самом начале статьи на рисунке правосторонней системы координат. Начнем с самой простой части, это оси X, Y, т.к. их линия смещается лишь в одном направлении. После цикла, который рисует куб (цикл перебора edges) добавим отрисовку X, Y осей:

Вектор center это середина окна рисования, т.к. у нас текущие размеры 800 на 600, а -300 для Y я указал, т.к. функция drawPixel переворачивает Y и делает его направление подходящим для canvas (в canvas Y смотрит вниз). Затем мы рисуем 2 оси используя drawLine, смещая сначала Y на 200 пикселей вверх (конец линии оси Y), затем X на 200 пикселей вправо (конец линии оси X). Результат:

Как построить вектор в трехмерной системе координат

Теперь давайте нарисуем линию оси Z, она диагональная внизвлево и ее вектор смещения будет [-1, -1, 0] и также мы должны нарисовать линию длиной 150 пикселей, т.е. вектор смещения [-1, -1, 0] должен быть длинной 150, первый вариант это [-150, -150, 0], но если мы посчитаем длину такого вектора, то она будет равняться примерно 212 пикселей. Выше в этой статье мы обсуждали как правильно получить вектор нужной длины. Первым делом нам необходимо его нормализовать, чтобы привести к длине 1, а затем умножить на скаляр той длины, которую хотим получить, в нашем случае это 150. И последним делом просуммируем координаты центра экрана и вектор смещения оси Z, таким образом мы получим, где линия оси Z должна заканчиваться. Давайте напишем код, после кода вывода 2-х предыдущих осей для отрисовки линии оси Z:

И в результате вы получите все 3 оси нужной длины:

Как построить вектор в трехмерной системе координат

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

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

💡 Видео

9 класс, 3 урок, Связь между координатами вектора и координатами его начала и концаСкачать

9 класс, 3 урок, Связь между координатами вектора и координатами его начала и конца

Координаты точки в трехмерном пространствеСкачать

Координаты точки в трехмерном пространстве

Построение проекции вектора на осьСкачать

Построение проекции вектора на ось

9 класс, 2 урок, Координаты вектораСкачать

9 класс, 2 урок, Координаты вектора

построение точки в пространствеСкачать

построение точки в пространстве
Поделиться или сохранить к себе: