42. Как определить направление угловой скорости?
Углова́я ско́рость — векторная физическая величина, характеризующая скорость вращения тела. Вектор угловой скорости по величине равен углу поворота тела в единицу времени:
,
а направлен по оси вращения согласно правилу буравчика, то есть, в ту сторону, в которую ввинчивался бы буравчик с правой резьбой, если бы вращался в ту же сторону. Единица измерения угловой скорости, принятая в системах СИ и СГС) — радианы в секунду. (Примечание: радиан, как и любые единицы измерения угла, — физически безразмерен, поэтому физическая размерность угловой скорости — просто [1/секунда]).Определим угловую скорость как вектор, величина которого численно равна угловой скорости, b направленный вдоль оси вращения, причем, если смотреть с конца этого вектора, то вращение направлено против часовой стрелки. Исторически сложилось, что положительным направлением вращения считается вращение «против часовой стрелки», хотя, конечно, выбор этого направления абсолютно условен. Для определения направления вектора угловой скорости можно также воспользоваться «правилом буравчика» (которое также называется «правилом правого винта») — если направление движения ручки буравчика (или штопора) совместить с направлением вращения, то направление движения всего буравчика совпадет с направлением вектора угловой скорости.
43. Как определить направление углового ускарения? Угловое ускорение — векторная физическая величина, характеризующая быстроту изменения угловой скорости твёрдого тела.Угловое ускорение равно первой производной от угловой скорости по времени.Формула угловой скорости:
Единица углового ускорения — радиан в секунду в квадрате.
Углово́е ускоре́ние — псевдовекторная физическая величина, характеризующая быстроту изменения угловой скорости твёрдого тела.
При вращении тела вокруг неподвижной оси, угловое ускорение по модулю равно [1] :

Вектор углового ускорения α направлен вдоль оси вращения (в сторону
при ускоренном вращении и противоположно
— при замедленном).
При вращении вокруг неподвижной точки вектор углового ускорения определяется как первая производная от вектора угловой скорости ω по времени [2] , то есть
,
и направлен по касательной к годографу вектора
в соответствующей его точке.
44. При каком условии мы имеем право считать в лабораторной работе №4 «Изучение основного закона динамики вращательного движения» линейное ускорение точек на ободе щкива равным ускорению поступательного движения груза?
Момент сил создается грузом m, привязанным к нити Н, которая навита на один из шкивов. Если момент сил трения Mтр, приложенный к оси маятника, мал по сравнению с моментом силы натяжения нити, то проверка уравнения
не представляет труда. Действительно, измеряя время t, в течение которого груз из состояния покоя опустится на расстояние h, можно легко найти ускорение груза а, в проекции на координатную ось, совпадающую с направлением движения:
, которое связано с угловым ускорением (при отсутствии проскальзывания нити относительно обода шкива) очевидным соотношением
, где r — радиус шкива.
Глава 10. Вращаем объекты: момент силы

Эта и следующая главы посвящены вращательному движению объектов самой разной природы: от космических станций до пращи. Именно такое движение стало причиной того, что наша планета имеет круглую форму. Если вам известны основные свойства прямолинейного движения и законы Ньютона (они подробно описываются в двух первых частях этой книги), то вы сможете быстро овладеть основами вращательного движения. Даже если вы позабыли некоторые сведения из прежних глав, не беда, ведь к ним всегда можно вернуться в случае необходимости. В этой главе представлены основные понятия вращательного движения: угловая скорость угловое ускорение, тангенциальное ускорение, момент силы и т.п. Однако довольно слов, приступим к делу!
Переходим от прямолинейного движения к вращательному
Для такого перехода нужно изменить уравнения, которые использовались ранее для описания прямолинейного движения. В главе 7 уже упоминались некоторые эквиваленты (или аналоги) из мира прямолинейного и вращательного движения.
Вот как выглядят основные формулы прямолинейного движения, которые подробно описываются в главе 3:
- \( v=\Delta
/\Delta\) , где \( v \) — это скорость, \( \Delta \) — перемещение, a \( \Delta\) — время перемещения; - \( a=\Delta
/\Delta \) , где \( a \) — это ускорение, \( \Delta \) — изменение скорости, a \( \Delta \) — время изменения скорости; - \( \Delta
=v_0(t_1-t_0)+<>^1\!/\!_2a(t_1-t_0)^2 \) , где \( v_0 \) — это начальная скорость, \( t_0 \) — это начальный момент времени, a \( t_1 \) — это конечный момент времени; - \( v^2_1-v^2_0=2a\Delta
\) , где \( v_1 \) — это конечная скорость.
По аналогии можно легко вывести основные формулы вращательного движения:
- \( \omega=\Delta<\theta>/\Delta
\) , где \( \omega \) — угловая скорость, \( \Delta <\theta>\) — угол поворота, \( \Delta \) — время поворота на угол \( \Delta <\theta>\) ; - \( \alpha=\Delta<\omega>/\Delta
\) , где \( \alpha \) — угловое ускорение, \( \Delta <\omega>\) — изменение угловой скорости, \( \Delta \) — время изменения угловой скорости; - \( \theta=\omega_0(t_1-t_0)+<>^1\!/\!_2a(t_1-t_0)^2 \) , где \( \omega_0 \) — это начальная скорость;
- \( \omega^2_1-w^2_0=2as \) , где \( \omega_1 \) — это конечная скорость.
Разбираемся с параметрами вращательного движения
В физике движение принято разделять на поступательное и вращательное. При поступательном движении любая прямая, связанная с движущимся объектом, остается параллельной самой себе. При вращательном движении все точки тела движутся по окружностям. Тангенциальным движением называется часть вращательного движения, происходящего по касательной к окружности вращения, а радиальным (или нормальным) движением — часть вращательного движения, происходящего перпендикулярно (по нормали) к касательной, т.е. вдоль радиуса окружности.
Параметры прямолинейного поступательного и вращательного движений можно связать следующими формулами:

Допустим, колеса мотоцикла вращаются с угловой скоростью \( \omega \) , равной 21,5 \( 21,5\pi \) радиан в секунду. С какой скоростью едет мотоцикл? Чтобы дать ответ на этот вопрос, достаточно воспользоваться простой формулой связи линейной и угловой скорости.
Вычисляем линейную скорость вращательного движения
Скорость тангенциального движения материальной точки принято называть линейной скоростью вращательного движения. На рис. 10.1 приведен пример вращения мячика для игры в гольф по окружности с радиусом \( \mathbf

Угловая скорость связана с линейной скоростью соотношением \( v=r\omega \) , которое легко интуитивно понять. При одинаковой угловой скорости, чем дальше материальная точка от центра окружности вращения, тем больше ее линейная скорость.
Попробуем получить уже упомянутую выше формулу связи линейной и угловой скорости \( v=r\omega \) . Длина окружности \( L \) радиуса \( r \) выражается известной формулой \( L=2\pi r \) , а полный угол, который охватывает окружность, равен \( 2\pi \) радиан. Соответственно, длина дуги окружности длиной \( \Delta s \) , охватывающая угол \( \Delta\theta \) , равна:

Из формулы прямолинейного движения

путем подстановки выражения для \( \Delta s \) получим:


где \( \omega \) — угловая скорость, \( \Delta <\theta>\) — угол поворота, \( \Delta

Теперь можно легко и просто дать ответ на вопрос, поставленный в конце предыдущего раздела, т.е. определить скорость мотоцикла по угловой скорости вращения его колес. Итак, колеса мотоцикла вращаются с угловой скоростью \( \omega \) , равной 21,5 \( \pi \) радиан в секунду. Пусть радиус колеса \( r \) равен 40 см, тогда достаточно использовать следующую формулу:

Подставляя в нее значения, получим:

Итак, скорость мотоцикла равна 27 м/с или 97 км/ч.
Вычисляем тангенциальное ускорение
Тангенциальным ускорением называется скорость изменения величины линейной скорости вращательного движения. Эта характеристика вращательного движения очень похожа на линейное ускорение прямолинейного движения (см. главу 3). Например, точки на колесе мотоцикла в момент старта имеют нулевую линейную скорость, а спустя некоторое время после разгона ускоряются до некоторой ненулевой линейной скорости. Как определить это тангенциальное ускорение точки колеса? Переформулируем вопрос: как связать линейное ускорение

где \( a \) — это ускорение, \( \Delta v \) — изменение скорости, a \( \Delta t \) — время изменения скорости, с угловым ускорением

где \( \Delta\omega \) — изменение угловой скорости, \( \Delta t \) — время изменения угловой скорости?
Как мы уже знаем, линейная и угловая скорости связаны равенством

Подставим это выражение в предыдущую формулу линейного ускорения:

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

Поскольку угловое ускорение \( \alpha=\Delta\omega/\Delta t \) , то:

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

Иначе говоря, тангенциальное ускорение равно произведению радиуса на угловое ускорение.
Вычисляем центростремительное ускорение
Центростремительнным ускорением называется ускорение, необходимое для удержания объекта на круговой орбите вращательного движения. Как связаны угловая скорость и центростремительное ускорение? Формула для центростремительного ускорения уже приводилась ранее (см. главу 7):

Теперь, используя известную формулу связи линейной и угловой скорости \( v=r\omega \) , получим:

По этой формуле можно определить величину центростремительного ускорения по известной угловой скорости и радиусу. Например, для вычисления центростремительного ускорения Луны, вращающейся вокруг Земли, удобно использовать именно эту формулу.
Луна делает полный оборот вокруг Земли за 28 дней, т.е. за 28 дней Луна проходит \( 2\pi \) радиан. Отсюда получаем угловую скорость Луны:

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

После подстановки этого значения в предыдущую формулу получим:

Средний радиус орбиты Луны равен 3,85·10 8 м. Подставляя эти значения угловой скорости и радиуса в формулу центростремительного ускорения, получим:

Зная это ускорение и массу Луны, которая равна 7,35·10 22 кг, можно определить центростремительную силу, необходимую для удержания Луны на ее орбите:

Используем векторы для изучения вращательного движения
В предыдущих разделах этой главы угловая скорость и угловое ускорение рассматривались как скаляры, т.е. как параметры, характеризующиеся только величиной. Однако эти параметры вращательного движения, на самом деле, являются векторами, т.е. они обладают величиной и направлением (см. главу 4). В этом разделе рассматривается величина и направление некоторых параметров вращательного движения.
Определяем направление угловой скорости
Как нам уже известно, вращающееся колесо мотоцикла имеет не только угловую скорость, но и угловое ускорение. Что можно сказать о направлении вектора угловой скорости? Оно не совпадает с направлением линейной тангенциальной скорости, а… перпендикулярно плоскости колеса!
Эта новость всегда приводит к некоторому замешательству среди новичков: угловая скорость \( \omega \) , оказывается, направлена вдоль оси вращающегося колеса (рис. 10.2). Во вращающемся колесе единственной неподвижной точкой является его центр. Поэтому начало вектора угловой скорости принято располагать в центре окружности вращения.
Для определения направления вектора угловой скорости \( \omega \) часто используют правило правой руки. Если охватить ладонью ось вращения, а пальцы свернуть так, чтобы они указывали на направление тангенциальной скорости, то вытянутый большой палец укажет направление вектора угловой скорости \( \omega \) .

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

где \( \alpha \) — угловое ускорение, \( \Delta\omega \) — изменение угловой скорости, \( \Delta t \) — время изменения угловой скорости.
В векторной форме оно имеет следующий вид:

где \( \mathbf <\alpha>\) — вектор углового ускорения, а \( \Delta\mathbf <\omega>\) — изменение вектора угловой скорости. Отсюда ясно, что направление вектора углового ускорения совпадает с направлением изменения вектора угловой скорости.
Если вектор угловой скорости меняется только по величине, то направление вектора углового ускорения параллельно направлению вектора угловой скорости. Если величина угловой скорости растет, то направление вектора углового ускорения совпадает с направлением вектора угловой скорости, как показано на рис. 10.3.
А если величина угловой скорости падает, то направление вектора углового ускорения противоположно направлению вектора угловой скорости, как показано на рис. 10.4.

Поднимаем грузы: момент силы
В физике большое значение имеет не только время, но и место приложения силы. Всем когда-либо приходилось пользоваться рычагом для перемещения тяжелых грузов. Чем длиннее рычаг, тем легче сдвинуть груз. На языке физики применение силы с помощью рычага характеризуется понятием момент силы.
Приложение момента силы неразрывно связано с вращательным движением объектов. Если приложить силу к краю карусели, то карусель начнет вращательное движение. Чем дальше точка приложения силы, тем легче раскрутить карусель до заданной угловой скорости (параметры вращательного движения описываются в главе 1 1 ).
В верхней части рис. 10.5 показаны весы-качели с грузом массы \( m_1 \) на одном конце и грузом большей массы \( m_2=2m_1 \) посередине. Чтобы уравновесить весы-качели, нужно сместить груз с большей массой \( m_2 \) к другому концу весов, как показано в нижней части рис. 10.5. Как известно из опыта, размещение груза в точке вращения весов не приводит к уравновешиванию весов. Чтобы уравновесить весы, нужно сдвинуть груз с большей массой \( m_2=2m_1 \) к другому концу весов на расстояние вдвое меньшее, чем расстояние от точки вращения до второго груза с массой \( m_1 \) .

Знакомимся с формулой момента силы
Для уравновешивания весов важно не только, какая сила используется, но и где она прикладывается. Расстояние от точки приложения силы до точки вращения называется плечом силы.
Предположим, что нам нужно открыть дверь, схематически показанную на рис. 10.6. Как известно из опыта, дверь практически невозможно открыть, если прилагать силу вблизи петель (см. схему А на рис. 10.6). Однако, если приложить силу посередине двери, то открыть ее будет гораздо проще (см. схему Б на рис. 10.6). Наконец, прилагая силу у противоположного края двери по отношению к расположению петель, ее можно открыть с еще меньшим усилием (см. схему В на рис. 10.6).
На рис. 10.6 расстояние от мест расположения петель до точки приложения силы и есть плечо силы. Моментом силы называется произведение прилагаемой силы \( F \) на плечо силы \( l \) :

Момент силы в системе СИ измеряется в Н·м, а в системе СГС — в дин·см (подробнее эти системы единиц измерения описываются в главе 2).

Вернемся к примеру на рис. 10.6, где требуется открыть дверь шириной 1 м с помощью силы величиной 200 Н. В случае А (см. рис. 10.6) плечо силы равно нулю и произведение этого плеча на силу любой величины (включая и силу 200 Н) даст нулевой момент силы. В случае Б (см. рис. 10.6) плечо силы равно половине ширины двери, т.е. плечо силы \( l \) равно 0,5 м и момент силы будет равен:

В случае В (см. рис. 10.6) плечо силы равно ширине двери, т.е. плечо силы \( l \) равно 1 м и момент силы будет равен:

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

Размышляем над тем, как создается момент силы
Момент силы из предыдущего примера требуется создавать всегда для открытия двери независимо от того, какую дверь приходится открывать: легкую калитку изгороди или массивную дверь банковского сейфа. Как вычислить необходимый момент силы? Сначала нужно определить плечо сил, а потом умножить его на величину силы.
Однако не всегда все так просто. Посмотрите на схему Б на рис. 10.7. Как видите, сила прилагается под некоторым углом \( \theta \) . Как в таком случае определить плечо силы? Если бы угол \( \theta \) был прямым, то мы могли бы воспользоваться уже известно нам формулой:

Однако в данном случае угол \( \theta \) не является прямым.
В таком случае нужно просто помнить следующее правило: плечом силы называется длина перпендикуляра, опущенного из предполагаемой точки вращения на прямую, относительно которой действует сила.
Попробуем применить это правило определения плеча силы для схемы Б на рис. 10.7. Нужно продлить линию, вдоль которой действует сила, а потом опустить на нее перпендикуляр из точки вращения двери. Из полученного прямоугольного треугольника легко определить искомое плечо силы:

Если угол \( \theta \) равен нулю, то никакого момента силы не возникает (см. схему А на рис. 10.7).
Итак, получаем для момента силы для схемы Б на рис. 10.7:

Например, если требуется открыть дверь шириной 1 м с помощью силы величиной 200 Н, приложенной под углом \( \theta \) = 45°, то создаваемый момент этой силы будет равен:

Как видите, этот момент силы 140 Н·м меньше, чем момент силы 200 Н·м, созданный под прямым углом на схеме В на рис. 10.6.
Определяем направление момента силы
Учитывая все приведенные выше сведения о моменте силы, у читателя вполне может возникнуть подозрение, что момент силы обладает направлением. И это действительно так. Момент силы является векторной величиной, направление которой определяется по правилу правой руки. Если охватить ладонью ось вращения, а пальцы свернуть так, чтобы они указывали на направление силы, то вытянутый большой палец укажет направление вектора момента силы.
На рис. 10.8 показан пример силы \( \mathbf

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

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

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

Попробуем определить силу, с которой болт должен удерживать всю конструкцию, показанную на рис. 10.9. Пусть плакат имеет массу 50 кг и висит на шесте 3 м от точки опоры шеста, а массу шеста в данном примере будем считать пренебрежимо малой. Болт находится в 10 см от точки опоры шеста.
Согласно условиям равновесия, сумма всех моментов сил должна быть равна нулю:


где \( \mathbf
Чему равны упомянутые моменты? Момент силы со стороны плаката можно легко определить по формуле:

где \( m \) = 50 кг — это масса плаката, \( \mathbf
Подставляя значения, получим:

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

где \( \mathbf
Подставляя полученные выражения для моментов сил в формулу:


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

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

Более сложный пример: учитываем силу трения при расчете равновесия
Рассмотрим теперь другую более сложную задачу, в которой для расчета равновесия системы объектов нужно учесть силу трения. Предположим, что работник магазина решил использовать переносную лестницу для монтажа рекламного плаката, как схематически показано на рис. 10.10.
Пусть лестница длиной \( l_л \) = 4 м стоит под углом \( \theta \) = 45° к поверхности тротуара, работник имеет массу \( m_р \) = 45 кг и находится на ней на расстоянии \( l_р \) = 3 м от нижнего конца лестницы, лестница имеет массу \(m_л \) = 20 кг, а коэффициент трения покоя между поверхностью тротуара и концами лестницы равен \( \mu_п \) = 0,7. Вопрос: будет ли такая система объектов находиться в состоянии равновесия? Попросту говоря, достаточной ли будет сила трения, чтобы лестница вместе с рабочим не соскользнула и упала?
Итак, для ответа на этот вопрос нам нужно учесть следующие силы, действующие на лестницу:
- \( \mathbf
\) — нормальная сила со стороны стены; - \( \mathbf
\) — вес рабочего; - \( \mathbf
\) — вес лестницы; - \( \mathbf
> \) — сила трения между поверхностью тротуара и концами лестницы; - \( \mathbf
\) — нормальная сила со стороны тротуара.
Согласно условиям равновесного поступательного движения, сумма всех сил, действующих на лестницу, должна быть равна нулю:


Это значит, что сумма всех сил вдоль горизонтальной оси, а именно нормальной силы со стороны стены \( \mathbf


Перефразируя поставленный выше вопрос о достаточности силы трения, получим: выполняется ли условие

Кроме того, сумма всех сил вдоль вертикальной оси, а именно веса рабочего \( \mathbf


Согласно условиям равновесного вращательного движения, также необходимо равенство нулю всех моментов сил, действующих на лестницу:

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



Поскольку \( L_р=l_р \) , \( L_л=l_л/2 \) (центр тяжести лестницы находится посередине лестницы), \( L_с=l_л \) , \( \alpha=360^<\circ>-\theta \) , \( \beta=360^<\circ>-\theta \) и \( \gamma=\theta \) , то получим:


Таким образом, мы получили систему из двух уравнений с двумя неизвестными сил \( \mathbf

Зададимся вопросом: соблюдается ли условие

Из системы двух уравнений получим:

Итак, остается выяснить, соблюдается ли условие:

После подстановки значений получим:

Поскольку \( \mu_т \) = 0,7, то упомянутое условие соблюдается, и лестница с рабочим не упадет.
Линейная алгебра для разработчиков игр
Эта статья является переводом цикла из четырёх статей «Linear algebra for game developers», написанных David Rosen и посвящённых линейной алгебре и её применению в разработке игр. С оригинальными статьями можно ознакомиться тут: часть 1, часть 2, часть 3 и часть 4. Я не стал публиковать переводы отдельными топиками, а объединил все статьи в одну. Думаю, что так будет удобнее воспринимать материал и работать с ним. Итак приступим.
Зачем нам линейная алгебра?
Одним из направлений в линейной алгебре является изучение векторов. Если в вашей игре применяется позиционирование экранных кнопок, работа с камерой и её направлением, скоростями объектов, то вам придётся иметь дело с векторами. Чем лучше вы понимаете линейную алгебру, тем больший контроль вы получаете над поведением векторов и, следовательно, над вашей игрой.
Что такое вектор?
В играх вектора используются для хранения местоположений, направлений и скоростей. Ниже приведён пример двухмерного вектора:
Вектор местоположения (также называемый «радиус-вектором») показывает, что человек стоит в двух метрах восточнее и в одном метре к северу от исходной точки. Вектор скорости показывает, что за единицу времени самолёт перемещается на три километра вверх и на два — влево. Вектор направления говорит нам о том, что пистолет направлен вправо.
Как вы можете заметить, вектор сам по себе всего лишь набор цифр, который обретает тот или иной смысл в зависимости от контекста. К примеру, вектор (1, 0) может быть как направлением для оружия, как показано на картинке, так и координатами строения в одну милю к востоку от вашей текущей позиции. Или скоростью улитки, которая двигается вправо со скоростью в 1 милю в час (прим. переводчика: довольно быстро для улитки, 44 сантиметра в секунду).
Важно отслеживать единицы измерения. Допустим у нас есть вектор V (3,5,2). Это мало что говорит нам. Три чего, пять чего? В нашей игре Overgrowth расстояния указываются в метрах, а скорости в метрах в секунду. Первое число в этом векторе — это направление на восток, второе — направление вверх, третье — направление на север. Отрицательные числа обозначают противоположные направления, на запад, вниз и на юг. Местоположение, определяемое вектором V (3,5,2), находится в трёх метрах к востоку, в пяти метрах вверху и в двух метрах к северу, как показано на картинке ниже.

Итак, мы изучили основы работы с векторами. Теперь узнаем как вектора использовать.
Сложение векторов
Чтобы сложить вектора, нам надо просто сложить каждую их составляющую друг с другом. Например:
(0, 1, 4) + (3, -2, 5) = (0+3, 1-2, 4+5) = (3, -1, 9)
Зачем нам нужно складывать вектора? Наиболее часто сложение векторов в играх применяется для физического интегрирования. Любой физический объект будет иметь вектора для местоположения, скорости и ускорения. Для каждого кадра (обычно это одна шестидесятая часть секунды), мы должны интегрировать два вектора: добавить скорость к местоположению и ускорение к скорости.
Давайте рассмотрим пример с прыжками Марио. Он начинает с позиции (0, 0). В момент начала прыжка его скорость (1, 3), он быстро двигается вверх и вправо. Его ускорение равно (0, -1), так как гравитация тянет его вниз. На картинке показано, как выглядит его прыжок, разбитый на семь кадров. Чёрным текстом показана его скорость в каждом фрейме.

Давайте рассмотрим первые кадры поподробнее, чтобы понять как всё происходит.
Для первого кадра, мы добавляем скорость Марио (1, 3) к его местоположению (0, 0) и получаем его новые координаты (1, 3). Затем мы складываем ускорение (0, -1) с его скоростью (1, 3) и получаем новое значение скорости Марио (1, 2).
Делаем то-же самое для второго кадра. Добавляем скорость (1, 2) к местоположению (1, 3) и получаем координаты (2, 5). Затем добавляем ускорение (0, -1) к его скорости (1, 2) и получаем новую скорость (1, 1).
Обычно игрок контролирует ускорение игрового персонажа с помощью клавиатуры или геймпада, а игра, в свою очередь, рассчитывает новые значения для скоростей и местоположения, используя физическое сложение (через сложение векторов). Это та-же задача, которая решается в интегральном исчислении, просто мы его сильно упрощаем для нашей игры. Я заметил, что мне намного проще внимательно слушать лекции по интегральному исчислению, думая о практическом его применении, которое мы только что описали.
Вычитание векторов
Вычитание рассчитывается по тому-же принципу что и сложение — вычитаем соответствующие компоненты векторов. Вычитание векторов удобно для получения вектора, который показывает из одного местоположения на другое. Например, пусть игрок находится по координатам (1, 2) с лазерным ружьём, а вражеский робот находится по координатам (4, 3). Чтобы определить вектор движения лазерного луча, который поразит робота, нам надо вычесть местоположение игрока из местоположения робота. Получаем:
(4, 3) — (1, 2) = (4-1, 3-2) = (3, 1).

Умножение вектора на скаляр
Когда мы говорим о векторах, мы называем отдельные числа скалярами. Например (3, 4) — вектор, а 5 — это скаляр. В играх, часто бывает нужно умножить вектор на число (скаляр). Например, моделируя простое сопротивление воздуха путём умножения скорости игрока на 0.9 в каждом кадре. Чтобы сделать это, нам надо умножить каждый компонент вектора на скаляр. Если скорость игрока (10, 20), то новая скорость будет:
0.9*(10, 20) = (0.9 * 10, 0.9 * 20) = (9, 18).
Длина вектора
Если у нас есть корабль с вектором скорости V (4, 3), нам также понадобится узнать как быстро он двигается, чтобы посчитать потребность в экранном пространстве или сколько потребуется топлива. Чтобы сделать это, нам понадобится найти длину (модуль) вектора V. Длина вектора обозначается вертикальными линиями, в нашем случае длина вектора V будет обозначаться как |V|.
Мы можем представить V как прямоугольный треугольник со сторонами 4 и 3 и, применяя теорему Пифагора, получить гипотенузу из выражения: x 2 + y 2 = h 2
В нашем случае — длину вектора H с компонентами (x, y) мы получаем из квадратного корня: sqrt(x 2 + y 2 ).
Итак, скорость нашего корабля равна:
|V| = sqrt(4 2 + 3 2 ) = sqrt(25) = 5

Этот подход используется и для трёхмерных векторов. Длина вектора с компонентами (x, y, z) рассчитывается как sqrt(x 2 + y 2 + z 2 )
Расстояние
Если игрок P находится в точке (3, 3), а взрыв произошёл в точке E по координатам (1, 2), нам надо определить расстояние между игроком и взрывом, чтобы рассчитать степень ущерба, нанесённого игроку. Это легко сделать, комбинируя две вышеописанных операции: вычитание векторов и их длину.
Мы вычитаем P — E, чтобы получить вектор между ними. А затем определяем длину этого вектора, что и даёт нам искомое расстояние. Порядок следования операндов тут не имеет значения, |E — P| даст тот-же самый результат.
Расстояние = |P — E| = |(3, 3) — (1, 2)| = |(2, 1)| = sqrt(2 2 +1 2 ) = sqrt(5) = 2.23

Нормализация
Когда мы имеем дело с направлениями (в отличие от местоположений и скоростей), важно, чтобы вектор направления имел длину, равную единице. Это сильно упрощает нам жизнь. Например, допустим орудие развёрнуто в направлении (1, 0) и выстреливает снаряд со скоростью 20 метров в секунду. Каков в данном случае вектор скорости для выпущенного снаряда?
Так как вектор направления имеет длину равную единице, мы умножаем направление на скорость снаряда и получаем вектор скорости (20, 0). Если-же вектор направления имеет отличную от единицы длину, мы не сможем сделать этого. Снаряд будет либо слишком быстрым, либо слишком медленным.
Вектор с длиной равной единице называется «нормализованным». Как сделать вектор нормализованным? Довольно просто. Мы делим каждый компонент вектора на его длину. Если, к примеру, мы хотим нормализовать вектор V с компонентами (3, 4), мы просто делим каждый компонент на его длину, то есть на 5, и получаем (3/5, 4/5). Теперь, с помощью теоремы Пифагора, мы убедимся в том, что его длина равна единице:
(3/5) 2 + (4/5) 2 = 9/25 + 16/25 = 25/25 = 1
Скалярное произведение векторов
Что такое скалярное произведение (записывается как •)? Чтобы рассчитать скалярное произведение двух векторов, мы должны умножить их компоненты, а затем сложить полученные результаты вместе
(a1, a2) • (b1, b2) = a1b1 + a2b2
Например: (3, 2) • (1, 4) = 3*1 + 2*4 = 11. На первый взгляд это кажется бесполезным, но посмотрим внимательнее на это:

Здесь мы можем увидеть, что если вектора указывают в одном направлении, то их скалярное произведение больше нуля. Когда они перпендикулярны друг другу, то скалярное произведение равно нулю. И когда они указывают в противоположных направлениях, их скалярное произведение меньше нуля.
В основном, с помощью скалярного произведения векторов можно рассчитать, сколько их указывает в одном направлении. И хоть это лишь малая часть возможностей скалярного произведения, но уже очень для нас полезная.
Допустим у нас есть стражник, расположенный в G(1, 3) смотрящий в направлении D(1,1), с углом обзора 180 градусов. Главный герой игры подсматривает за ним с позиции H(3, 2). Как определить, находится-ли главный герой в поле зрения стражника или нет? Сделаем это путём скалярного произведения векторов D и V (вектора, направленного от стражника к главному герою). Мы получим следующее:
V = H — G = (3, 2) — (1, 3) = (3-1, 2-3) = (2, -1)
D•V = (1, 1) • (2, -1) = 1*2 + 1*-1 = 2-1 = 1
Так как единица больше нуля, то главный герой находится в поле зрения стражника.

Мы уже знаем, что скалярное произведение имеет отношение к определению направления векторов. А каково его более точное определение? Математическое выражение скалярного произведения векторов выглядит так:
Где Θ (произносится как «theta») — угол между векторами A и B.
Это позволяет нам найти Θ (угол) с помощью выражения:
Как я говорил ранее, нормализация векторов упрощает нашу жизнь. И если A и B нормализованы, то выражение упрощается следующим образом:
Давайте опять рассмотрим сценарий со стражником. Пусть теперь угол обзора стражника будет равен 120 градусам. Получим нормализованные вектора для направления взгляда стражника (D’) и для направления от стражника к главному герою (V’). Затем определим угол между ними. Если угол более 60 градусов (половина от угла обзора), то главный герой находится вне поля зрения стражника.
D’ = D / |D| = (1, 1) / sqrt(1 2 + 1 2 ) = (1, 1) / sqrt(2) = (0.71, 0.71)
V’ = V / |V| = (2, -1) / sqrt(2 2 + (-1) 2 ) = (2,-1) / sqrt(5) = (0.89, -0.45)
Θ = acos(D’V’) = acos(0.71*0.89 + 0.71*(-0.45)) = acos(0.31) = 72
Угол между центром поля зрения стражника и местоположением главного героя составляет 72 градуса, следовательно стражник его не видит.

Понимаю, что это выглядит довольно сложно, но это потому, что мы всё делаем вручную. В программе это всё довольно просто. Ниже показано как я сделал это в нашей игре Overgrowth с помощью написанных мной С++ библиотек для работы с векторами:
Векторное произведение
Допустим у нас есть корабль с пушками, которые стреляют в правую и в левую стороны по курсу. Допустим, что лодка расположена вдоль вектора направления (2, 1). В каких направлениях теперь стреляют пушки?
Это довольно просто в двухмерной графике. Чтобы повернуть направление на 90 градусов по часовой стрелке, достаточно поменять местами компоненты вектора, а затем поменять знак второму компоненту.
(a, b) превращается в (b, -a). Следовательно у корабля, расположенного вдоль вектора (2, 1), пушки справа по борту будут стрелять в направлении (1, -2), а пушки с левого борта, будут стрелять в противоположном направлении. Меняем знаки у компонент вектора и получаем (-1, 2).

А что если мы хотим рассчитать это всё для трехмерной графики? Рассмотрим пример с кораблём.
У нас есть вектор мачты M, направленной прямо вверх (0, 1, 0) и направление ветра: север-северо-восток W (1, 0, 2). И мы хотим вычислить вектор направления паруса S, чтобы наилучшим образом «поймать ветер».
Для решения этой задачи мы используем векторное произведение: S = M x W.

Подставим теперь нужные нам значения:
S = MxW = (0, 1, 0) x (1, 0, 2) = ([1*2 — 0*0], [0*1 — 0*2], [0*0 — 1*1]) = (2, 0, -1)
Для расчётов вручную довольно сложно, но для графических и игровых приложений я рекомендую написать функцию, подобную той, что указана ниже и не вдаваться более в детали подобных расчётов.
Векторное произведение часто используется в играх, чтобы рассчитать нормали к поверхностям. Направления, в которых «смотрит» та или иная поверхность. Например, рассмотрим треугольник с векторами вершин A, B и С. Как мы найдем направление в котором «смотрит» треугольник, то есть направление перпендикулярное его плоскости? Это кажется сложным, но у нас есть инструмент для решения этой задачи.
Используем вычитание, для определения направления из A в С (C — A), пусть это будет «грань 1» (Edge 1) и направление из A в B (B — A), пусть это будет «грань 2» (Edge 2). А затем применим векторное произведение, чтобы найти вектор, перпендикулярный им обоим, то есть перпендикулярный плоскости треугольника, также называемый «нормалью к плоскости».

Вот так это выглядит в коде:
В играх основное выражение освещённости записывается как N • L, где N — это нормаль к освещаемой поверхности, а L — это нормализованный вектор направления света. В результате поверхность выглядит яркой, когда на неё прямо падает свет, и тёмной, когда этого не происходит.
Теперь перейдем к рассмотрению такого важного для разработчиков игр понятия, как «матрица преобразований» (transformation matrix).
Для начала изучим «строительные блоки» матрицы преобразований.
Базисный вектор
Допустим мы пишем игру Asteroids на очень старом «железе» и нам нужен простой двухмерный космический корабль, который может свободно вращаться в своей плоскости. Модель корабля выглядит так:

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

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

Теперь старый подход будет слишком медленным, так как надо будет поворачивать довольно большое количество точек. Одно из элегантных решений данной проблемы будет звучать так — «Что если вместо поворота каждой точки модели корабля, мы повернём координатную решётку нашей модели?»

Как это работает? Давайте посмотрим внимательнее, что собой представляют координаты.
Когда мы говорим о точке с координатами (3, 2), мы говорим, что её местоположение находится в трех шагах от точки отсчёта по координатной оси X, и двух шагах от точки отсчёта по координатной оси Y.
По-умолчанию координатные оси расположены так: вектор координатной оси X (1, 0), вектор координатной оси Y (0, 1). И мы получим расположение: 3(1, 0) + 2(0, 1). Но координатные оси не обязательно должны быть в таком положении. Если мы повернём координатные оси, в это-же время мы повернём все точки в координатной решётке.
Чтобы получить повернутые оси X и Y мы применим тригонометрические функции, о которых говорили выше. Если мы поворачиваем на 49 градусов, то новая координатная ось X будет получена путём поворота вектора (0, 1) на 49 градусов, а новая координатная ось Y будет получена путём поворота вектора (0, 1) на 49 градусов. Итак вектор новой оси X у нас будет равен (0.66, 0.75), а вектор новой оси Y будет (-0.75, 0.66). Сделаем это вручную для нашей простой модели из трёх точек, чтобы убедиться, что это работает так, как нужно:
Координаты верхней точки (0, 2), что означает, что её новое местоположение находится в 0 на новой (повёрнутой) оси X и 2 на новой оси Y:
0*(0.66,0.75) + 2*(-0.75, 0.66) = (-1.5, 1.3)
Нижняя левая точка (-1, -1), что означает, что её новое местоположение находится в -1 на повернутой оси X, и -1 на повернутой оси Y:
-1*(0.66,0.75) + -1*(-0.75, 0.66) = (0.1, -1.4)
Нижняя правая точка (1, -1), что означает её новое местоположение находится в 1 на повернутой оси X, и -1 на повернутой оси Y
1*(0.66,0.75) + -1*(-0.75, 0.66) = (1.4, 0.1)

Мы показали, как координаты корабля отображаются в другой координатной сетке с повернутыми осями (или «базисными векторами»). Это удобно в нашем случае, так как избавляет нас от необходимости применять тригонометрические преобразования к каждой из точек модели корабля.
Каждый раз, когда мы изменяем базисные вектора (1, 0) и (0, 1) на (a, b) и (c, d), то новая координата точки (x, y) может быть найдена с помощью выражения:
Обычно базисные вектора равны (1, 0) и (0, 1) и мы просто получаем x(1, 0) + y(0, 1) = (x, y), и нет необходимости заботиться об этом дальше. Однако, важно помнить, что мы можем использовать и другие базисные вектора, когда нам это нужно.
Матрицы
Матрицы похожи на двухмерные вектора. Например, типичная 2×2 матрица, может выглядеть так:
Когда вы умножаете матрицу на вектор, вы суммируете скалярное произведение каждой строки с вектором, на который происходит умножение. Например, если мы умножаем вышеприведённую матрицу на вектор (x, y), то мы получаем:
Будучи записанным по-другому, это выражение выглядит так:
Выглядит знакомо, не так-ли? Это в точности такое-же выражение, которые мы использовали для смены базисных векторов. Это означает, что умножая 2×2 матрицу на двухмерный вектор, мы тем самым меняем базисные вектора. Например, если мы вставим стандартные базисные вектора в (1, 0) и (0, 1) в колонки матрицы, то мы получим:
Это единичная матрица, которая не даёт эффекта, который мы можем ожидать от нейтральных базисных векторов, которые мы указали. Если-же мы повернём базисные вектора на 49-градусов, то мы получим:
Эта матрица будет поворачивать двухмерный вектор на 49 градусов против часовой стрелки. Мы можем сделать код нашей игры Asteriods более элегантным, используя матрицы вроде этой. Например, функция поворота нашего корабля может выглядеть так:
Однако, наш код будет ещё более элегантным, если мы сможем также включить в эту матрицу перемещение корабля в пространстве. Тогда у нас будет единая структура данных, которая будет заключать в себе и применять информацию об ориентации объекта и его местоположении в пространстве.
К счастью есть способ добиться этого, хоть это и выглядит не очень элегантно. Если мы хотим переместиться с помощью вектора (e, f), мы лишь включаем его в нашу матрицу преобразования:
И добавляем дополнительную единицу в конец каждого вектора, определяющего местоположение объекта, например так:
Теперь, когда мы перемножаем их, мы получаем:
(a, c, e) • (x, y, 1) + (b, d, f) • (x, y, 1) + (0, 0, 1) • (x, y, 1)
Что, в свою очередь, может быть записано как:
x(a, b) + y(c, d) + (e, f)
Теперь у нас есть полный механизм трансформации, заключённый в одной матрице. Это важно, если не принимать в расчёт элегантность кода, так как с ней мы теперь можем использовать все стандартные манипуляции с матрицами. Например перемножить матрицы, чтобы добавить нужный эффект, или мы можем инвертировать матрицу, чтобы получить прямо противоположное положение объекта.
Трехмерные матрицы
Матрицы в трехмерном пространстве работают так-же как и в двухмерном. Я приводил примеры с двухмерными векторами и матрицами, так как их просто отобразить с помощью дисплея, показывающего двухмерную картинку. Нам просто надо определить три колонки для базисных векторов, вместо двух. Если базисные вектора это (a,b,c), (d,e,f) and (g,h,i) то наша матрица будет выглядеть так:
Если нам нужно перемещение (j,k,l), то мы добавляем дополнительную колонку и строку, как говорили раньше:
И добавляем единицу [1] в вектор, как здесь:
Вращение в двухмерном пространстве
Так как в нашем случае у нас только одна ось вращения (расположенная на дисплее), единственное, что нам надо знать, это угол. Я говорил об этом ранее, упоминая, что мы можем применять тригонометрические функции для реализации функции двухмерного вращения наподобие этой:
Более элегантно это можно выразить в матричной форме. Чтобы определить матрицу, мы можем применить эту функцию к осям (1, 0) и (0, 1) для угла Θ, а затем включить полученные оси в колонки нашей матрицы. Итак, начнём с координатной оси X (1, 0). Если мы применим к ней нашу функцию, мы получим:
(1*cos(Θ) — 0*sin(Θ), 1*sin(Θ) + 0*cos(Θ)) = (cos(Θ), sin(Θ))
Затем, мы включаем координатную ось Y (0, 1). Получим:
(0*cos(Θ) — 1*sin(Θ), 0*sin(Θ) + 1*cos(Θ)) = (-sin(Θ), cos(Θ))
Включаем полученные координатные оси в матрицу, и получаем двухмерную матрицу вращения:
Применим эту матрицу к Сюзанне, мартышке из графического пакета Blender. Угол поворота Θ равен 45 градусов по часовой стрелке.

Как видите — это работает. Но что если нам надо осуществить вращение вокруг точки, отличной от (0, 0)?
Например, мы хотим вращать голову мартышки вокруг точки, расположенной в её ухе:

Чтобы сделать это, мы можем начать с создания матрицы перемещения (translation matrix) T, которая перемещает объект из начальной точки в точку вращения в ухе мартышки, и матрицу вращения R, для вращения объекта вокруг начальной точки. Теперь для вращения вокруг точки, расположенной в ухе, мы можем сперва переместить точку в ухе на место начальной точки, с помощью инвертирования матрицы T, записанной как T -1 . Затем, мы вращаем объект вокруг начальной точки, с помощью матрицы R, а затем применяем матрицу T для перемещения точки вращения назад, к своему исходному положению.
Ниже дана иллюстрация к каждому из описанных шагов:

Это важный шаблон, который мы будем применять позднее — применение вращения для двух противоположных трансформаций позволяет нам вращать объект в другом «пространстве». Что очень удобно и полезно.
Теперь рассмотрим трёхмерное вращение.
Трёхмерное вращение
Вращение вокруг оси Z работает по тому-же принципу, что и вращение в двухмерном пространстве. Нам лишь нужно изменить нашу старую матрицу, добавив к ней дополнительную колонку и строку:
Применим эту матрицу к трехмерной версии Сюзанны, мартышки из пакета Blender. Угол поворота Θ пусть будет равен 45 градусов по часовой стрелке.

То-же самое. Вращение только вокруг оси Z ограничивает нас, как насчёт вращения вокруг произвольной оси?
Вращение, определяемое осью и углом (Axis-angle rotation)
Представление вращения, определяемого осью и углом, также известно как вращение в экспоненциальных координатах, параметризованное вращением двух величин. Вектора, определяющего вращение направляющей оси (прямая линия) и угла, описывающего величину поворота вокруг этой оси. Вращение осуществляется согласно правилу правой руки.
Итак, вращение задаётся двумя параметрами (axis, angle), где axis — вектор оси вращения, а angle — угол вращения. Этот приём довольно прост и являет собой отправную точку для множества других операций вращения, с которыми я работаю. Как практически применить вращение, определяемое осью и углом?
Допустим мы имеем дело с осью вращения, показанной на рисунке ниже:

Мы знаем как вращать объект вокруг оси Z, и мы знаем как вращать объект в других пространствах. Итак, нам лишь надо создать пространство, где наша ось вращения будет являться осью Z. И если эта ось будет осью Z, то что будет являться осями X и Y? Займемся вычислениями сейчас.
Чтобы создать новые оси X и Y нам нужно лишь выбрать два вектора, которые перпендикулярны новой оси Z и перпендикулярны друг другу. Мы уже говорили ранее о векторном умножении, которое берёт два вектора и даёт в итоге перпендикулярный им вектор.
У нас есть один вектор сейчас, это ось вращения, назовём его A. Возьмём теперь случайный другой вектор B, который находится не в том-же направлении, что и вектор A. Пусть это будет (0, 0, 1) к примеру.
Теперь мы имеем ось вращения A и случайный вектор B, мы можем получить нормаль C, через векторное произведение A и B. С перпендикулярен векторам A и B. Теперь мы делаем вектор B перпендикулярным векторам A и C через их векторное произведение. И всё, у нас есть все нужные нам оси координат.
На словах это звучит сложно, но довольно просто выглядит в коде или будучи показанным в картинках.
Ниже показано, как это выглядит в коде:
Тут показана иллюстрация для каждого шага:

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

Теперь мы можем вращать объект вокруг произвольной оси. В конце концов мы можем просто создать матрицу T = T = M -1 RM и использовать её много раз, без дополнительных усилий с нашей стороны. Есть более эффективные способы конвертирования вращений, определяемых осью и углом во вращения, определяемые матрицами. Просто описанный нами подход показывает многое из того, о чём мы говорили ранее.
Вращение, определяемое осью и углом, возможно, самый интуитивно понятный способ. Применяя его, очень легко инвертировать поворот, поменяв знак у угла, и легко интерполировать, путём интерполяции угла. Однако тут есть серьёзное ограничение, и заключается оно в том, что такое вращение не является суммирующим. То есть вы не можете комбинировать два вращения, определяемых осью и углом в третье.
Вращение, определяемое осью и углом — хороший способ для начала, но оно должно быть преобразовано во что-то другое, чтобы использоваться в более сложных случаях.
Эйлеровские углы
Эйлеровские углы представляют собой другой способ вращения, заключающийся в трёх вложенных вращениях относительно осей X, Y и Z. Вы, возможно, сталкивались с их применением в играх, где камера показывает действие от первого лица, либо от третьего лица.
Допустим вы играете в шутер от первого лица и вы повернулись на 30 градусов влево, а затем посмотрели на 40 градусов вверх. В конце-концов в вас стреляют, попадают, и, в результате удара, камера поворачивается вокруг своей оси на 45 градусов. Ниже показано вращение с помощью углов Эйлера (30, 40, 45).

Углы Эйлера — удобное и простое в управлении средство. Но у этого способа есть два недостатка.
Первый, это вероятность возникновения ситуации под названием «блокировка оси» или «шарнирный замок» (gimbal lock). Представьте, что вы играете в шутер от первого лица, где вы можете посмотреть влево, вправо, вверх и вниз или повернуть камеру вокруг зрительной оси. Теперь представьте, что вы смотрите прямо вверх. В этой ситуации попытка взглянуть налево или направо будет аналогична попытке вращения камеры. Всё что мы можем вы этом случае, это вращать камеру вокруг своей оси, либо посмотреть вниз. Как вы можете представить, это ограничение делает непрактичным применение углов Эйлера в лётных симуляторах.
Второе — интерполяция между двумя эйлеровскими углами вращения не даёт кратчайшего пути между ними.
Например, у вас две интерполяции между двумя одинаковыми вращениями. Первая использует интерполяцию эйлеровского угла, вторая использует сферическую линейную интерполяцию (spherical linear interpolation (SLERP)), чтобы найти кратчайший путь.

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

Как вы можете заметить, интерполированное вращение значительно меньше, чем любое из исходных вращений, и две оси более не перпендикулярны друг другу. Это логично, если вдуматься — середина отрезка, соединяющего любые две точки на сфере будет расположена ближе к центру сферы.
Это в свою очередь порождает известный «эффект фантика» (candy wrapper effect), при применении скелетной анимации. Ниже показана демонстрация этого эффекта на примере кролика из нашей игры Overgrowth (прим. переводчика: обратите внимание на середину туловища кролика).

Вращение, основанное на матричных операциях, очень полезно, так как они могут аккумулировать вращения без всяких проблем, вроде блокировки оси (gimbal lock), и может очень эффективно применяться к точкам сцены. Вот почему поддержка вращения на матрицах встроена в графические карты. Для любого типа трёхмерной графики матричный формат вращения — это всегда итоговый применяемый способ.
Однако, как мы уже знаем, матрицы не очень хорошо интерполируются, и они не столь интуитивно понятны.
Итак, остался только один главный формат вращения. Последний, но тем не менее, важный.
Кватернионы
Что-же такое кватернионы? Если очень кратко, то это альтернативный вариант вращения, основанный на оси и угле (axis-angle rotation), который существует в пространстве.
Подобно матрицам они могут аккумулировать вращения, то есть вы можете составлять из них цепочку вращений, без опаски получить блокировку оси (gimbal lock). И в то-же время, в отличие от матриц, они могут хорошо интерполироваться из одного положения в другое.
Являются-ли кватернионы лучшим решением, нежели остальные способы вращений (rotation formats)?
На сегодняшний день они комбинируют все сильные стороны других способов вращений. Но у них есть два слабых места, рассмотрев которые, мы придём к выводу, что кватернионы лучше использовать для промежуточных вращений. Итак, каковы недостатки кватернионов.
Во-первых кватернионы непросто отобразить на трёхмерном пространстве. И мы вынуждены всегда реализовывать вращение более простым способом, а затем конвертировать его. Во-вторых, кватернионы не могут эффективно вращать точки, и мы вынуждены конвертировать их в матрицы, чтобы повернуть значительное количество точек.
Это означает, что вы скорее всего не начнете или не закончите серию вращений с помощью кватернионов. Но с их помощью можно реализовать промежуточные вращения более эффективно, нежели при применении любого другого подхода.
«Внутренняя кухня» механизма кватернионов не очень понятна и не интересна мне. И, возможно, не будет интересна и вам, если только вы не математик. И я советую вам найти библиотеки, которые работают с кватернионами, чтобы облегчить вам решение ваших задач с их помощью.
Математические библиотеки «Bullet» или «Blender» будут хорошим вариантом для начала.
Слободянюк А.И. Физика 10/12.2
Прежде чем дать строгое определение характеристик магнитного поля нам необходимо сделать небольшое физико-математическое отступление, что бы познакомиться с еще одной операцией над векторами – векторным произведением.
12.2.1 Вектор угловой скорости; векторное произведение.

Рассмотрим еще раз вращательное движение твердого тела. Чтобы однозначно задать кинематические характеристики такого движения необходимо указать ось вращения и величину угловой скорости (Рис.5). Фактически, как и в случае поступательного движения, необходимо указать величину и направление, что удобно сделать в единой векторной форме. Определим [1] угловую скорость как вектор, величина которого численно равна угловой скорости, b направленный вдоль оси вращения, причем, если смотреть с конца этого вектора, то вращение направлено против часовой стрелки. Исторически сложилось [2] , что положительным направлением вращения считается вращение «против часовой стрелки», хотя, конечно, выбор этого направления абсолютно условен.
Для определения направления вектора угловой скорости можно также воспользоваться «правилом буравчика» (которое также называется «правилом правого винта») — если направление движения ручки буравчика (или штопора) совместить с направлением вращения, то направление движения всего буравчика совпадет с направлением вектора угловой скорости.
Посмотрим, как можно теперь найти линейную скорость произвольной точки A вращающегося тела, находящейся на расстоянии r от оси вращения. Тогда модуль скорости точки A будет равен \(V_A = \omega r\). Направлен этот вектор перпендикулярно плоскости, проходящей через ось вращения и рассматриваемую точку.

Введем теперь систему координат, начало которой, точка O, находится на оси вращения (Рис.6). Тогда положение произвольной точки A задается радиус-вектором \(
\vec r\) , соединяющим начало отсчета с выбранной точкой. Модуль скорости этой точки можно рассчитать по формуле
V = \omega r’ = \omega r \sin \alpha\) , (1)
где \(r’ = r \sin \alpha\) — расстояние до оси вращения, α — угол между векторами \(
\vec r\). Направлен вектор скорости \(
\vec V\) перпендикулярно плоскости, проходящей через векторы \(
\vec r\). Так давайте, определим новую математическую операцию над векторами \(
\vec r\), такую, чтобы ее результатом был вектор \(
Естественно, что такая операция была придумана до нас и называется она векторным произведением
\vec V = \vec \omega \times \vec r\) . (2)
Определение. Векторным произведением двух векторов \(
\vec B\), называется вектор \(
\vec C = \vec A \times \vec B\) , модуль которого равен
|\vec C| = |\vec A| \cdot |\vec B| \sin \alpha\) , (3)
где α — угол между векторами-сомножителями \(
\vec B\), отсчитываемый от первого сомножителя ко второму; направлен вектор произведения перпендикулярно каждому из векторов-сомножителей в такую сторону, чтобы кратчайший поворот, от первого сомножителя \(
\vec A\) ко второму \(
\vec B\) проходил против часовой стрелки, если смотреть с конца вектора \(
Отметим, что модуль векторного произведения численно равен площади параллелограмма, построенного на векторах-сомножителях.

Для того чтобы найти результат векторного произведения \(
\vec C = \vec A \times \vec B\) произвольных векторов \(
\vec B\) по определению необходимо проделать следующее (Рис. 7):
-
построить плоскость, проходящую через векторы сомножители \(
\vec C\), чтобы ближайший поворот от первого сомножителя \(
\vec A\) ко второму \(
Направление вектора произведения также можно определять по правилу правого винта: если вращать ручку буравчика от первого сомножителя ко второму, то направление его движения укажет направление вектора произведения.
Задание для самостоятельной работы.
- Проверьте, пользуясь определением векторного произведения, справедливость формулы (2), связывающей линейную и угловую скорости точки.
Укажем также некоторые свойства векторного произведения, которые легко доказать, исходя из определения.
-
При изменении порядка сомножителей направление произведения изменяется на противоположное \(
12.2.2 Вектор момента силы — векторное произведение.
Рассмотрим теперь понятие вектора момента силы. Ранее мы определили момент силы, как произведение момента силы на ее плечо. Покажем, что момент силы может быть описан как вектор и представлен в виде векторного произведения.

Пусть произвольное твердое тело может вращаться вокруг фиксированной оси, с которой совместим ось Oz декартовой системы координат (Рис.8). Пусть сила \(
\vec F\) приложена к точке A, расположенной на оси Ox, на расстоянии r от оси вращения (положение этой точки задается радиус-вектором \(
\vec r\)) и направлена перпендикулярно оси Ox. Действие этой силы приведет к вращению тела вокруг оси, которое может быть описано вектором угловой скорости \(
\vec \omega\), направленным вдоль оси вращения. Разумно определить вектор момента силы так, чтобы он был направлен тоже вдоль оси вращения [3] . В нашем случае модуль вектора момента силы равен произведению \(M = rF\), можно заметить, «правильное» направление этого вектора будет задано, если определить его как векторное произведение
\vec M = \vec r \times \vec F\) . (5)
Эта формула дает самое строгое определение вектора момента силы. Проверьте самостоятельно, что для произвольного вектора силы, лежащего в плоскости xOy, формула (5) дает вектор момента силы, направленный вдоль оси вращения, модуль которого соответствует данному ранее определению.

Наконец, рассмотрим более общий случай: пусть произвольное тело может вращаться вокруг фиксированной оси Oz, приложенная сила \(
\vec F\) направлена произвольно и приложена к произвольной точке A с радиус-вектором \(
Если ось вращения фиксирована, то тело может вращаться только вокруг этой оси. Проведем через точку приложения силы A окружность с центром на оси вращения, плоскость которой перпендикулярна этой оси. Разложим вектор силы на следующие составляющие: осевую Fz — вдоль оси вращения; радиальную Fr — вдоль радиуса построенной окружности; тангенциальную Fτ — вдоль касательной к построенной окружности. Каждая из этих составляющих имеет наглядный и очевидный физический смысл: Осевая составляющая стремится сдвинуть тело вдоль оси, если тело закреплено, она должна быть уравновешена силами реакции в опорах оси; радиальная составляющая стремится сдвинуть тело в перпендикулярном направлении (или изогнуть ось), она также компенсируется силами реакции; и только тангенциальная составляющая способна придать вращение телу. Поэтому момент силы, который приводит к вращению тела, определяется как произведение тангенциальной составляющей силы на расстояние от оси вращения до точки приложения силы
Найдем теперь вектор момента силы по данному выше определению (5). В соответствии с определением операции векторного произведения построим плоскость (Рис. 10), проходящую через векторы \(
\vec F\), и восстановим перпендикуляр к ней, который (с учетом правила буравчика) укажет направление вектора \(
\vec M = \vec r \times \vec F\). Модуль этого вектора равен \(
|\vec M| = r F \sin \alpha\) , где α — угол между векторами \(
\vec F\). В общем случае направление вектора момента силы не совпадает с направлением оси вращения.
Однако не следует забывать, что на тело помимо рассматриваемой силы \(
\vec F\), действуют силы реакции в опорах оси, моменты которых отличны от нуля [4] . Поэтому при рассмотрении вращения тела вокруг фиксированной оси нас интересует только проекция вектора \(
\vec M = \vec r \times \vec F\) на ось вращения. Следовательно, можно утверждать, что момент силы, приводящий к вращению тела, рассчитывается по формуле
M_z = M \cos \beta = r F \sin \alpha \cos \beta\) , (7)
где β — угол между вектором момента силы и осью вращения.
Остальные проекции вектора момента силы компенсируются моментами сил реакции.
Для расчета вектора момента силы можно также воспользоваться разложением вектора силы на составляющие
\vec M = \vec r \times \vec F = \vec r \times (\vec F_z + \vec F_r + \vec F_<\tau>) = \vec r \times \vec F_z + \vec r \times \vec F_r + \vec r \times \vec F_<\tau>\) .
В этом выражение первые два слагаемых являются векторами, перпендикулярными оси вращения, поэтому не могут привести к вращению тела, и только последнее слагаемое имеет составляющую, направленную вдоль оси вращения.
Задание для самостоятельной работы.
- В качестве хорошего упражнения по стереометрии докажите, что формулы (6) и (7) эквивалентны.
12.2.3 Вектор индукции магнитного поля.
Вспомним, электрическое поле действует с некоторой силой \(
\vec F\) на неподвижный электрический заряд, величина этой силы пропорциональна величине заряда q, поэтому отношение силы, действующей на электрический заряд к его величине, не зависит от свойств заряда, следовательно, является характеристикой, электрического поля – его напряженностью \(
\vec E = \frac<\vec F>\) . В этом случае пробный заряд фактически выступает в роли прибора для обнаружения поля и измерения его характеристик.
Магнитное поле действует на движущиеся заряды, следовательно, и характеристика этого поля должна быть связана с этой силой. Но движущийся заряд описывается не только величиной заряда, но и вектором скорости, следовательно, и сила, действующая на этот заряд, зависит также от вектора его скорости. Поэтому движущийся пробный заряд, как прибор для обнаружения магнитного поля не обладает сферической симметрией (как неподвижный точечный заряд), следовательно, характеристика магнитного поля не может быть определена так же просто как напряженность электрического поля [5] .
Практически более удобно в качестве «пробного» прибора для изучения магнитного поля использовать малый проводящий контур с электрическим током [6] , поведение которого в магнитном поле аналогично поведению намагниченной стрелки.

Вспомним, что для создания постоянного тока в замкнутом контуре необходим источник ЭДС, тем не менее, можно реально создать малый контур с постоянным током. Для этого достаточно подвесить проводящую рамку на двух тонких проводах, подключенных к источнику (рис.11). Так как в подводящих проводах токи текут в противоположных направлениях, то суммарный ток равен нулю. Как было установлено Эрстедом и подтверждено А. Ампером в магнитном поле контур с током стремится занять определенную ориентацию в пространстве, стремится повернуться, следовательно, со стороны магнитного поля на контур (как и на стрелку) действует вращающий момент сил. Момент сил (а не сила, как в случае электрического поля), действующих на контур, служит для определения характеристики магнитного поля.
Опыт показывает, что момент сил, действующих на контур, зависит от его ориентации в пространстве, следовательно, физическая величина, описывающее магнитное поле, должна быть векторной. В общем случае этот вектор может изменяться от точки к точке, поэтому магнитное поле должно описываться математически как уже знакомое нам векторной поле.
Так как мы хотим определить «точечную» характеристику магнитного поля, то такой контур (или магнитную стрелку) следует считать бесконечно малым.
В очередной раз мы должны сделать традиционную оговорку – бесконечно малый контур физически нереализуем – даже провода имеют конечную толщину, поэтому переход к бесконечно малому контуру следует понимать в физическом смысле – мал, настолько, что с математической точки можно считать бесконечно малым, но реально реализуемым.
Чтобы избавиться от неоднозначности измеряемого момента сил, связанной с ориентацией контура, выберем такое положение контура, при котором модель момента сил максимален Mmax. Наконец, учтем еще один экспериментальный факт – момент сил, действующих на контур, пропорционален силе тока в контуре I и площади контура S.
Следовательно, отношение момента сил к произведению силы тока в контуре на его площадь является величиной, не зависящей от свойств контура, поэтому является характеристикой поля, которая называется индукцией магнитного поля
Теперь необходимо определиться с направлением вектора индукции магнитного поля. Наиболее наглядно направление этого вектора в данной точке указывает северный полюс магнитной стрелки в состоянии устойчивого равновесия. Свяжем теперь это направление с ориентацией контура с током, который мы выбрали в качестве индикатора поля. Для этого введем еще одну характеристику контура – его магнитный момент [7] .

Магнитными моментом контура (рис. 12) называется вектор направленный перпендикулярно плоскости контура, модуль которого равен произведению силы тока в контуре на его площадь \(p_m = IS\) . Направление этого вектора определяется по правилу правого винта – если направление тока совпадает с направлением вращения винта, то направление движения последнего совпадает с направлением вектора магнитного момента. Если смотреть с конца вектора момента, то направление обхода контура по направлению тока положительной, то есть против часовой стрелки.
Таким образом, направление вектора индукции магнитного поля совпадает с направлением вектора магнитного момента контура, помещенного в данную точку поля и находящегося в положении устойчивого равновесия.

Еще раз рассмотрим ориентации векторов, которые задействованы в определении вектора индукции магнитного поля. Пусть в некоторой области пространства магнитное поле можно считать однородным (то есть вектор индукции во всех точках постоянен, как по величине, так и по направлению). Будем также считать, что ось вращения контура перпендикулярна направлению вектора индукции магнитного поля (Рис.13). Вектор момента сил \(
\vec M\) перпендикулярен вектору магнитной индукции \(
\vec B\) и вектору магнитного момента контура \(
\vec p_m\). На контур будет действовать со стороны магнитного поля максимальный момент сил в том случае, когда эти векторы перпендикулярны (то есть вектор индукции поля лежит в плоскости контура), а в положении равновесия вектор индукции перпендикулярен плоскости контура.
Наконец, запишем общее выражение для момента силы, действующего на контур с током со стороны магнитного поля, воспользовавшись операцией векторного произведения
\vec M = \vec p_m \times \vec B\) . (9)
Простота этой формулы оправдывает все наши долгие рассуждения по определению характеристики магнитного поля. Фактически эта формула может рассматриваться как определение вектора индукции магнитного поля.
Сравните с выражением для силы, действующей со стороны электрического поля на точечный заряд \(
\vec F = q \vec E\) . Похоже: q — характеристика индикатора электрического поля, \(
\vec p_m\) — характеристика индикатора магнитного поля; \(
\vec E\) — основная характеристика электрического поля, \(
\vec B\) — основная характеристика магнитного поля; \(
\vec F\) — результат воздействия электрического поля на точечный заряд, \(
\vec M\) — результат воздействия магнитного поля на контур.
Индукция магнитного поля является размерной физической величиной. В системе СИ единицей измерения индукции является Тесла (сокращенно Тл), названная в честь американского (югославского происхождения) физика и инженера Николы Тесла. Эта единица является производной, она может быть выражена через другие единицы с помощью формулы (8):
[B] = Тл = [M]/([I]·[S]) = Н·м/(А·м 2 ) = Н/(А·м) = кг/(А·с 2 ). (10)