Привет, Хабр!
Мы, программисты, инженеры и физики, привыкли к своему зоопарку математических инструментов. Векторы — для направлений и позиций. Матрицы — для трансформаций. Кватернионы — для вращений без головной боли с блокировкой осей. Комплексные числа — для 2D-поворотов и обработки сигналов. Каждый инструмент хорош для своей задачи, но мы постоянно переключаемся между ними, преобразуя данные и жонглируя концепциями.
А что, если я скажу вам, что существует единый математический объект, который может быть всем этим одновременно? Объект, который по своей природе является и скаляром, и вектором, и кватернионом, и даже спинором, в зависимости от того, как на него посмотреть.
Это не фантастика. Это — алгебра Клиффорда, также известная как геометрическая алгебра. Идея настолько мощная, что она способна навсегда изменить ваш взгляд на геометрию в 3D.
Пристегните ремни. Мы отправляемся в путешествие, где абстрактная алгебра превращается в наглядную геометрию. И огромное спасибо @master_program за переработку исходного текста в эту статью, а так же за дополнения и картинки, очень повысившие удобство чтения.
________________________________________________________________
Шаг 1: Готовим сцену — Алгебра, где векторы можно перемножать
Что такое алгебра Клиффорда Cl(3,0)? Не пугайтесь названия. В основе — всего три базовых вектора из нашего родного 3D-пространства: e1,e2,e3. У них всего два правила жизни:
- 
Квадрат любого базового вектора равен +1:
.
 - 
Они антикоммутируют:
 
Главное отличие от стандартной векторной алгебры в том, что здесь введено геометрическое произведение. Мы можем перемножать векторы и получать не просто число (скалярное произведение) или другой вектор (векторное произведение), а нечто более общее. Подробнее про данную операцию читайте в статье @master_program "Давайте забудем всё про скалярное и векторное. Есть способ гораздо лучше".
Для тех, кто любит матрицы, есть отличные новости. Эта алгебра изоморфна (то есть, структурно идентична) алгебре комплексных матриц 2×2. Мы можем просто сказать:
Именно поэтому любой 3D-вектор v=(x,y,z) можно представить как матрицу :
Это наш мост между абстрактной алгеброй и чем-то, что можно потрогать в коде.

Шаг 2: Великая формула представления
Давайте расшифруем этот шифр:
— это любой элемент алгебры Клиффорда. Не просто вектор, а вообще что угодно — сумма скаляра, вектора, чего-то еще... Наш главный герой.
— это какой-то фиксированный единичный вектор. Он как холст, на котором оператор рисует свою геометрию.
— это оператор, который мы конструируем из двух произвольных 3D-векторов, v1 и v2:
— это его эрмитово-сопряженная версия:
.
геометрическое произведение здесь идентично матричному произведению.
Формула утверждает нечто поразительное: геометрию любого элемента A можно полностью описать, найдя всего два вектора, v1 и v2, которые определяют его действие.
Но как именно они действуют?
___________________________________________________________________
Шаг 3: Вскрываем оператор T — танец реальной и мнимой геометрии
Забудем на секунду про матрицы и посмотрим, что происходит на уровне самой геометрии. Мы разберем, как каждая часть оператора T преобразует произвольный вектор v через геометрическое произведение.
Часть I: Действие «реального» вектора v1 — Кватернионы в действии
Что такое v1v? Это не точка и не крестик. Это геометрическое произведение, которое всегда можно разложить на две части:

Скалярная часть S=(v1⋅v): Это просто проекция v на направление v1. Она говорит нам, "насколько v смотрит в ту же сторону, что и v1". Это элемент масштабирования.
Бивекторная часть B=(v1∧v): Это самое интересное. Бивектор — это не вектор, а ориентированная плоскость, в которой лежат v1 и v. Его "величина" — это площадь параллелограмма, а "ориентация" — направление вращения от v1 к v. Бивекторы — это прирожденные генераторы вращений. Это работает почти как задание вектора в полярных координатах.

Смотрите, что получилось: скаляр + бивектор. Да это же в точности структура кватерниона! Поэтому назовем это действие "кватернионным". Вектор v1 отвечает за вращения и масштабирование.

Часть II: Действие «мнимого» вектора i⋅v2 — Магия дуальности
Теперь очередь i(v2v). Снова раскладываем произведение. Здесь и далее будем использовать I (псевдоскаляр e1e2e3) вместо i, чтобы быть ближе к геометрии:

Псевдоскалярная часть (I(v2⋅v)): Скалярное произведение — это число. Умноженное на I, оно становится элементом, описывающим объем или ориентацию (правое/левое). Но так же это проекция v на направление бивектора i⋅v2, заданное нормалью к плоскости бивектора.
Векторная часть (I(v2∧v)): Бивектор v2∧v — это плоскость. Умножение на I в 3D — это операция дуальности: она превращает плоскость в перпендикулярный ей вектор.
Итак, вектор v2 отвечает за преобразования, связанные с ориентацией и построением нормалей.
Итог:
Действие оператора  на вектор v порождает сразу все четыре типа элементов алгебры:

Один оператор — четыре разных геометрических сущности. Чувствуете мощь?

Шаг 4: Реконструкция — как из двух векторов рождается целая вселенная
Теперь давайте погрузимся глубже и докажем, что эта система не просто красива, но и жестко определена.
Именно здесь и кроется самая элегантная идея. Мы покажем, что, зная лишь "осколки" — результаты преобразования — мы можем однозначно восстановить всю систему целиком.
Часть I: Введение мультивектора А в общем виде
Прежде всего, давайте запишем наш мультивектор A в самом общем виде. Любой мультивектор A можно разложить на "реальную" и "мнимую" кватернионные части:
Обозначим эти части как S1,v1′ и S2,v2′.
Давайте будем следовать этой логике. Пусть:
— скалярная часть.
— бивекторная часть.
— псевдоскалярная часть.
— векторная часть (дуальная бивектору B2).
Тогда наш мультивектор A — это просто их сумма:
Теперь мы хотим доказать, что этот A в точности равен .

Часть II: Восстановление исходной системы
Предположим, мы не знаем исходный "пробный" вектор v, но знаем результаты его преобразования: бивекторы B1 и B2, которые породил наш оператор.
Бивектор B1=v1∧v представляет плоскость, содержащую v1 и v.
Бивектор B2=v2∧v представляет плоскость, содержащую v2 и v.
В 3D каждый бивектор имеет дуальный вектор, который ему ортогонален. Давайте назовем их V′1 и V′2:
Как нам найти направление v?
Вектор V′1 по определению ортогонален и v1, и v. Аналогично, V′2 ортогонален и v2, и v.
Это значит, что оба вектора, V′1 и V′2, лежат в плоскости, ортогональной вектору v.
А векторное произведение двух векторов, лежащих в одной плоскости, дает вектор, ортогональный этой плоскости. Следовательно:
параллелен v
Чтобы получить единичный вектор , нам остается только нормализовать результат:
 
Это доказывает, что система геометрически замкнута. Если мы знаем, как оператор подействовал на вектор, мы можем однозначно восстановить направление этого вектора. Геометрия не разваливается.
Часть III: Получение главной формулы сведения к (1)
        (2)
Что здесь происходит? Это просто хитрая алгебраическая перегруппировка. Давайте сначала посмотрим на выражение в скобках. Для любого вектора v в Cl(3,0) его обратный элемент
  
Если v единичный, тогда
  .  
Умножение на  справа — это способ "извлечь" оператор преобразования. Если 
, тогда 
Давайте применим это к нашему разложению A на четыре части:
  
Сгруппируем их по-другому:

Теперь вспомним, что:
Первая скобка — это просто
.
Вторая скобка — это
.
Следовательно,
А для сопряженного оператора, как в исходной формуле (1), все будет аналогично:
Формула показывает, что если мы возьмем полный мультивектор A, "разделим" его на v (умножив на ), чтобы получить оператор, а затем снова "соберем" (умножив на v), то мы, естественно, вернемся к исходному A.
К этому моменту у вас наверное должен был закрасться вопрос : "А зачем нам сопряженный оператор?". Ответ прост - он необходим для согласованности с матрицей Грамма, одним из базовых понятий линейной алгебры. Именно за счет умножения на эрмитово-сопряженный элемент, в частном случае мы получаем модуль кватерниона. А эрмитово-сопряженный к вектору равен самому вектору, поэтому для определения модуля вектора, как правило, про необходимость этой операции "забывают".
Это может показаться тавтологией, но все это доказывает самосогласованность: представление мультивектора A через оператор T и его действие на вектор v — это не приближение и не аналогия, а точное и обратимое математическое тождество.
А теперь давайте сгруппируем члены по их рангу (или "типу"):
Ранг 0 (Скаляр):
Ранг 1 (Вектор):
Ранг 2 (Бивектор):
Ранг 3 (Псевдоскаляр):
Вот оно!
Итак, мультивектор A — это сумма четырех геометрически осмысленных частей, каждая из которых рождается из взаимодействия векторов  и 
 с вектором 
, выступающим в роли "холста".
Это и есть тот самый "универсальный солдат": один объект, хранящий в себе сразу четыре типа геометрической информации.
___________________________________________________________
Шаг 5: Универсальный солдат — почему это обобщение всего?
Теперь мы готовы понять, почему этот подход так крут. Он не просто описывает что-то одно, он содержит в себе всё. Полный базис алгебры Cl(3,0) состоит из  элементов:
1 (один скаляр)
(три вектора)
(три бивектора)
(один псевдоскаляр)
Любой элемент алгебры A (его называют мультивектором) — это просто сумма этих базовых элементов с какими-то коэффициентами.
Вместо того чтобы таскать за собой восемь коэффициентов, мы представляем A через его геометрическое действие. Это и есть фундаментальный сдвиг в мышлении. Мы не спрашиваем "из чего он состоит?", мы спрашиваем "что он делает?".
__________________________________________________________________________
Шаг 6: Частные случаи — Зоопарк математики в одном вольере
Давайте посмотрим, как из нашего общего мультивектора A получить все те инструменты, к которым мы так привыкли.
Где здесь кватернионы?
Кватернионы — это элементы, состоящие из скалярной и бивекторной частей. В нашей алгебре они образуют так называемую "четную подалгебру" — если перемножить два таких элемента, результат снова будет кватернионом. Если мы хотим, чтобы наш A был чисто кватернионным, мы просто обнуляем его векторную и псевдоскалярную части. Таким образом, кватернионы - это частный случай нашего оператора при .
Например, ротор  — это кватернион, который вращает объекты вокруг оси бивектора B (нормали к B) на угол θ.
Где здесь спиноры?
Это самый тонкий момент. В стандартной физике спинор (например, описывающий электрон) — это нечто странное, что при повороте на 360° меняет знак. В алгебре Клиффорда спиноры — это элементы специального "отфильтрованного" подпространства.
Чтобы его получить, всю алгебру умножают на проектор P (элемент, для которого . Например, в физике используют 
. Это как надеть специальные очки, которые позволяют видеть только часть мира.
Наш подход более общий. Мы работаем с полным элементом A. Нам не нужны "очки". Если нам понадобится спинор, мы просто возьмем наш A и умножим его на проектор P. Мы не теряем информацию, мы просто выбираем, на что смотреть.
Где здесь комплексные числа? Элемент вида  (сумма скаляра и псевдоскаляра) ведет себя в точности как комплексное число, где роль мнимой единицы i играет псевдоскаляр I. Мы можем это легко проверить: 
.
Если положить и 
 параллельными v, мы можем получить те самые элементы вида s+ip, которые ведут себя как комплексные числа. 
Где здесь векторы?
Если мы хотим, чтобы наш элемент A был просто вектором, нам нужно подобрать  и 
 так, чтобы после умножения на v остались только векторные компоненты. А именно надо сделать 
, 
ортогональным v.
Таким образом, наш общий мультивектор A — это "материнская" структура, из которой все остальные объекты получаются как частные случаи или проекции.

Заключение: Зачем все это нужно?
Эта красивая теория — не просто гимнастика для ума. Она имеет глубокие практические следствия.
Для 3D-графики и разработки игр: Представьте, что вместо отдельных классов для
Vector3,Quaternion,Matrix4x4у вас есть один-единственный объектMultivector. Вращения, отражения, масштабирования, определение положений — все это делается через одно унифицированное геометрическое произведение. Код становится чище, интуитивнее и потенциально быстрее. Библиотеки вродеganja.jsуже показывают, как это может выглядеть.Для физики и робототехники: Алгебра Клиффорда позволяет записывать уравнения электромагнетизма, механики и даже квантовой теории в невероятно компактной и элегантной форме, свободной от координат. Она напрямую кодирует геометрию, а не ее проекции на оси X, Y, Z.
Для понимания: Самое главное — это дает интуицию. За сложными формулами вращений и преобразований скрывается простая геометрия проекций и плоскостей.
Таким образом, мы обнаружили новый мощный способ мышления:
Любой элемент алгебры Клиффорда Cl(3,0) можно представить как оператор T=v1+iv2, действующий на базовый единичный вектор.
Этот оператор имеет "реальную" часть v1, которая отвечает за кватернионные преобразования (проекции и вращения), и "мнимую" часть iv2, которая отвечает за преобразования, связанные с дуальностью (создание псевдоскаляров и векторов из бивекторов).
Этот подход объединяет все математические сущности (векторы, кватернионы, спиноры) в единой структуре полного мультивектора, показывая, что они являются лишь разными проявлениями одного и того же геометрического объекта.
Здесь мы увидели ключ к двери в мир, где геометрия и алгебра — это одно и то же. Мир, где один объект может быть всем, что нам нужно. И, возможно, это самый элегантный способ думать о геометрии из всех, что мы когда-либо изобретали.
Надеюсь, это путешествие было для вас таким же захватывающим, как и для меня. Спасибо за внимание
Другие наши статьи на тему геометрической алгебры:
Давайте забудем всё про скалярное и векторное. Есть способ гораздо лучше - великолепная статься для введения читателя в смыслы геометрической алгебры. Где подробно описан смысл геометрического произведения и удобства от такого описания.
Вывод ОТО в геометрической алгебре - кейс практического применения этого математического аппарата, к теории относительности.
О формализме матриц Паули и геометрической алгебры в нерелятивистской квантовой механике - статья расшифровывающая смысл формализма квантовой механики, устраняющая смысловой разрыв между геометрией и свойствами ее элементов с формулами высокой физики.
Кватернионы — не только то, что мы о них думали - статья про то как на плоскости можно напрямую проассоциировать скаляр и бивектор с обычными векторами, чтобы использовать для математического описания плоскости двойной базис. Про развитие той идеи вы прочитали здесь.
Функция гиперкомплексного переменного и UVWT базис Клиффорда-Паули - о том как представить функцию от любого элемента Клиффорда, напрямую без применения разложений в ряды от матриц.
Комментарии (7)

lgorSL
04.11.2025 10:20Я не согласен, что вместо векторов, кватернионов и т.п. в 3д графике стоит использовать один мультивектор.
В мультвекторе 8 элементов (а если добавить ещё четвёртое измерение для перемещений - все 16), и переможение двух мультиветкоров - это куча операций. (Кажется, порядка 16^2)
У меня получилось, что лучше наоборот навыделять подклассов, которые нужны в реальной жизни, как минимум такой список: точки, векторы, обобщённые точки, линии, плоскости, идеальные плоскости, кватернионы, трансляторы, моторы, псевдоскаляр (и можно ещё больше сделать, но количество реализаций для бинарных операций растёт как N^2 и особо не разгуляешься)И вот эти подклассы получаются простыми (вектор - только 3 числа, обобщённая точка - только 4, линия - 6, идеальная плоскость - 3), бинарные операции тоже радикально упрощаются и система типов языка программирования начинает помогать. А геометрическая основа в виде мультиветкора помогает в том, что все эти классы согласованы друг с другом и ведут себя как мультиветкоры, у которых часть полей нули.
Например, sandwich продукт транслятора и вектора упрощается до трёх сложений и трёх умножений на 0.5
Если явно написать типы и сказать что а б с это точки, то более-менее очевидно что а ^ б это линия и а ^ б ^ с это плоскость. Если вместо этого использовать просто "мультивектор", для всего ,то все эти предположения приходится держать в уме и вдобавок из-за ошибок округления в цепочках вычислений могут вылазить не-нулевые маленькие значения там, где должен быть ноль.
Либо, как вариант, надо брать мультивектор, но в качестве полей подставлять не числа, а символьные выражения, и потом для результата делать "упрощения", что тоже не просто.

Exlt8 Автор
04.11.2025 10:20Тут история про геометрический смысл, думаю следующим шагом поискать смысл физический. Когда он найдется для всего этого многообразия, тогда и обсудим. Пока что рановато делать какие то выводы

qw1
04.11.2025 10:20Суть мультивектора в замкнутости операций.
Как в 3d-графике, универсальная матрица трансляции позволяет скомбинировать множество преобразований, пользуясь ассоциативностью умножения, и все расчёты свести к одному умножению на итоговую матрицу.
Если бы для каждого преобразования (вращение, перенос, проекция) были бы свои типы, было бы невозможно комбинировать преобразования.
Например, при рендеринге машины, не требуется крутить каждую точку колеса при его повороте, прибавлять смещение подвески и смещение координаты самой машины, а потом ещё проецировать на плоскость зрения камеры, с учётом направления взгляда и позиции наблюдателя. Всё аккумулируется в одной матрице, и все точки колеса просто умножаем на неё.

lgorSL
04.11.2025 10:20Всё прекрасно комбинируется.
Если я перемножаю кватернион и кватернион - получается кватернион.
Если перемножу кватернион и транслятор - будет мотор.
Если перемножу кватернион с мультивектором - будет мультивектор.Аналогично, когда мотор двигает плоскость, он даёт новую плоскость, а когда на линию - новую линию, на точку - даёт точку.
Если всё упростить до "мультивектор умножается на мультивектор", вся эта информация потеряется и пользоваться становится неудобно и непрактично - вместо перемножения двух кватернионов из 4 чисел каждый получается геометрическое произведение двух мультивектором из 16 чисел, причём большая часть нули и это всё избыточно.
Вот например как у меня получилось: https://github.com/Kright/ScalaGameMath/blob/master/cpp/pga3d/Motor.h#L91
В 3д графике нет необходимости умножать мультивектор на мультивектор.
Там будет мотор (8 компонент), собранный как комбинация всех трансформаций, который будет двигать точки в модели (3 или 4 компоненты).Вычислительно это проще на порядок, чем считать sandwich product мультивектора и мультивектора.
Вот тут можно сравнить длину выражений для sandwich product для мультивектора, и, например, для мотора и точки:
https://github.com/Kright/ScalaGameMath/blob/master/cpp/pga3d/opsSandwich.h#L20В случае транслятора и точки вообще тривиально:
constexpr Point Translator::sandwich(const Point& b) const noexcept { return {.x = (b.x - 2.0 * wx), .y = (b.y - 2.0 * wy), .z = (b.z - 2.0 * wz)}; }Это выражение получится, если взять мультивектор с нулями и упростить.
Условно, я в любом месте могу написать
motor.toMultivector().sandwich(point.toMultivector())и результат будет эквивалентен выражениюmotor.sandwich(point).toMultivector(), но второе считать намного быстрее.
          
 
qw1
Вот это интересный факт, которого не хватило мне в прошлой статье и я безуспешно пытался найти его в комментах. Он же и объясняет "8-мерность" этой алгебры.
UPD Хотя, оно там есть. Почему-то не пришло понимание.
Exlt8 Автор
Мы где то около года это объяснение искали, и вот только что нашли. Сопоставить 8 математических измерений с 3-я физическими, та еще задачка оказалась
akardapolov
Случайно не в этой лаборатория ВШЭ? Или это параллельная активность?