Стоит открыть исходники любого современного игрового движка – неважно, это C++-рендер, сделанный на коленке, или какая-нибудь гигантская экосистема вроде Unity или Unreal Engine – вы первым делом натыкаетесь на одни и те же знакомые сущности. Все вокруг живет в Vector3: координаты, направления движения, точки столкновений. Каждая частица указывает, куда она смотрит, с помощью Quaternion. А если требуется что-то покруче – переносить и одновременно крутить объект, то Matrix4x4. Это уже как стандарт де-факто: кто пробовал крутить объекты руками, тот точно переписывал код с этими структурами. Ещё конечно же отдельно существуют лучи, плоскости, сферы, bounding boxes, а между ними тянутся километры функций вроде dot(), cross(), normalize(), lookAt(), inverse(), project() и бесконечных преобразований типов.
Привыкаешь к этому быстро. Нам кажется совершенно естественным тасовать эти типы между собой – уж слишком давно так делается по всей индустрии. Но стоит лишь чуток задуматься, и начинает прорезаться легкий когнитивный диссонанс: выходит, вся наша графика построена на наборах несовместимых между собой математических запчастей. Для одного действия нам нужен один тип данных, для второго – другой, а пересчитать простое столкновение луча со сферой или плоскостью без пятого велосипеда никак не получается. Вроде бы всё работает и даже неплохо работает… Но ощущение конструктора из костылей не отпускает.
И самое интересное заключается в том, что так было не обязательно.
И тут интересно вспомнить XIX век. Тогда математики как раз ломали головы над тем, чтобы придумать нормальный универсальный язык для описания пространства – не мелочиться кучей частных формул на каждый случай жизни. William Rowan Hamilton придумывает кватернионы: компактный инструмент для вращений в пространстве, который становится сегодня основой всей компьютерной анимации (даже те же Unity и Unreal ими внутри манипулируют).

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

Параллельно Hermann Grassmann выносит мозг коллегам идеей: почему бы алгебре не оперировать сразу плоскостями и объемами целиком? Ну действительно: мы привыкли складывать числа и векторы, а как быть с более сложными сущностями? Дальше подключается William Kingdon Clifford, собирает всё это в одну систему – получает Геометрическую Алгебру.
По сути, Клиффорд пытался создать универсальную операционную систему для геометрии.Но индустрия пошла другим путем.
Когда физикам и инженерам понадобилась удобная математика для электромагнетизма и механики, Josiah Willard Gibbs и Oliver Heaviside взяли идеи Клиффорда и разрезали их на части. Из цельной алгебры были извлечены только самые прикладные куски – скалярное и векторное произведения. Так появился привычный нам vector calculus, который сегодня преподают во всех технических вузах и используют почти все графические API.
Фактически современная графика работает не на полной геометрической теории, а на ее урезанной инженерной версии. Проблема этой урезанности особенно хорошо видна на векторном произведении. Все знают формулу:

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

На первый взгляд формула выглядит странно. Слева произведение двух векторов, справа сумма каких-то совершенно разных объектов. Но именно здесь скрывается главная идея Геометрической Алгебры.
Первая часть привычное скалярное произведение. Число. Ничего нового. А вот
– это внешнее произведение Грассмана. И его результатом является не вектор, а новый геометрический объект – бивектор.
Бивектор очень трудно понять, если смотреть на него через призму привычной линейной алгебры. Нас с детства учили, что результат взаимодействия двух векторов – это либо число, либо еще один вектор. Но Грассман предложил мыслить иначе. Если два вектора натягивают параллелограмм, то естественным результатом их комбинации должна быть сама ориентированная площадь этого параллелограмма. Не стрелочка, торчащая перпендикулярно плоскости. А сама плоскость.
Бивектор хранит площадь и ориентацию обхода. По сути, это элемент поверхности. Вот тут у многих мир переворачивается: оказывается наше привычное векторное произведение («дай-ка найду нормаль к плоскости») – это такой засекреченный хак ради удобства старой учебной математики! Мы подсознательно заменяем настоящую плоскость перпендикулярным ей вектором просто потому, что так проще считать по старинке. Но Геометрическая Алгебра говорит: зачем вообще выбрасывать информацию о самой плоскости?

В итоге из этой идеи рождается целая лестница геометрических объектов: есть значение (число), есть направление (вектор), есть площадь (бивектор), есть объем (тривектор) – все это элементы единой структуры под капотом! У людей технических такое вызывает лёгкое недоверие («подожди… какой еще вектор-площадь?») – словно кто-то предлагает напрямую сложить яблоки с квадратными метрами. Но идея-то именно в этом: собрать всю геометрию пространства под одной крышей, чтобы перестать тащить за собой гору несовместимых матрешек.
А затем появляется самая странная и одновременно самая мощная концепция – мультивектор. А дальше начинается магия серьёзной математики. Стоит расширить наше 3D-пространство до пятимерного (!) за счет двух спец-направлений – одно станет отвечать за начало координат вселенной, другое символизирует бесконечность во всех смыслах слова. Получаем Conformal Geometric Algebra (CGA): звучит максимально экзотично и сначала похоже на сугубо теоретические упражнения… Но вот что удивительно: CGA позволяет описывать сферы, окружности и прочие объекты как такие же элементы своей алгебры так же естественно, как вы оперируете обычными точками или прямыми.
Выглядит всё это так будто из учебника магии для программиста. На практике же происходит нечто почти магическое: все геометрические объекты начинают описываться одинаково.Точка становится мультивектором. Сфера становится мультивектором. Плоскость тоже становится мультивектором. Причем в CGA плоскость фактически является сферой бесконечного радиуса. Это уже не отдельный тип сущности, а частный случай более общего объекта.
Для программиста это звучит почти еретически. Представьте движок, в котором Plane, Sphere, Ray и Lineперестают быть независимыми структурами и становятся вариациями одной и той же геометрической сущности. Но самое важное начинается дальше.
Сегодня практически любой физический движок содержит десятки специализированных функций:
IntersectRaySphere() IntersectRayPlane() IntersectSphereSphere() IntersectCapsuleTriangle()
Каждая написана отдельно. У каждой свои edge cases. В каждой свои проверки на epsilon, вырожденные случаи и численные артефакты.
В CGA идея совершенно другая: пересечение – это не набор специальных алгоритмов, а базовая операция самой алгебры. Вместо огромного набора формул появляются универсальные операции вроде внешнего произведения или операции Meet. Геометрия начинает выглядеть не как коллекция инженерных костылей, а как цельная система преобразований. Еще более радикально это проявляется в трансформациях.
Современная графика использует целый зоопарк представлений. Повороты кодируются кватернионами. Переносы – матрицами. Масштабирование – другими матрицами. Для анимации часто добавляются dual quaternions. Внутри движка постоянно происходит конвертация между разными представлениями одной и той же геометрии.
В CGA все это заменяется единым объектом – ротором. Любое преобразование записывается одинаково:

И неважно, что именно делает RR. Если он кодирует вращение – объект повернется. Если перенос – объект сдвинется. Если масштаб – масштабируется. Формула остается одной и той же.
Для человека, который годами писал графический код, это выглядит почти незаконно. Особенно впечатляет то, как меняется сам стиль программирования. Например, в библиотеке clifford код начинает напоминать скорее школьную геометрию, чем традиционный graphics programming:
from clifford.g3c import * # Создаем две точки в конформном пространстве point1 = up(eo + 1*e1) point2 = up(eo + 5*e1) # Линия - это просто внешнее произведение двух точек и бесконечности line = point1 ^ point2 ^ einf # Сфера с центром в point1 и радиусом r r = 2.0 sphere = point1 - 0.5 * (r**2) * einf # Ищем пересечение линии и сферы. ОДНА СТРОЧКА! intersection = line.meet(sphere)
В этом фрагменте почти шокирует отсутствие привычных вещей. Нет матриц. Нет ручной тригонометрии. Нет вызовов cos() и sin(). Нет километров условий вроде if(dot < 0). Код начинает выражать не алгоритм вычисления, а саму геометрическую идею. Именно поэтому многие люди, впервые столкнувшиеся с GA, испытывают странное чувство. Возникает ощущение, будто вся современная 3D-графика десятилетиями решала геометрические задачи окольным путем.
Но тогда возникает очевидный вопрос: если Геометрическая Алгебра настолько красива, почему индустрия до сих пор массово не перешла на нее?
Потому что у этой красоты есть цена. Главная проблема – производительность. В конформной алгебре мультивектор в 5D содержит коэффициента. Для сравнения: обычный
Vector3 хранит всего три числа. То есть даже простая точка внезапно становится огромной структурой данных. Для CPU-кэша и особенно для GPU это настоящая катастрофа.
Современные видеокарты десятилетиями оптимизировались под операции над четырехкомпонентными векторами и матрицами 4×4. Под них существуют SIMD-инструкции, специализированные блоки вычислений, драйверы и шейдерные пайплайны. Вся индустрия буквально выращена вокруг матричной математики. GA пока остается чужаком на этом празднике жизни.
Есть и другая проблема – психологическая. Геометрическая Алгебра требует полностью перестроить мышление. Разработчик должен отказаться от привычной модели вектор + матрица + кватернион и начать воспринимать геометрию как единую алгебраическую систему. Это не просто новая библиотека. Это почти смена языка мышления.
И все же GA постепенно просачивается в области, где математическая устойчивость важнее, чем каждый такт процессора. В робототехнике она позволяет решать задачи обратной кинематики без многих классических сингулярностей. В компьютерном зрении упрощает работу с проекциями и геометрией камер. В физических симуляциях делает системы ограничений гораздо более естественными.
Самое интересное, что индустрия может прийти к Геометрической Алгебре не через университеты, а через компиляторы. Уже появляются генераторы кода, которые умеют анализировать мультивекторы на этапе сборки, выкидывать нулевые коэффициенты и превращать красивые абстрактные формулы в очень эффективные SIMD-инструкции. То есть разработчик пишет чистую геометрию, а компилятор превращает ее в быстрый машинный код.
И тогда возникает неприятная мысль. Возможно, вся современная архитектура 3D-движков с матрицами, кватернионами и бесконечными специализированными пересечениями – является не вершиной эволюции, а историческим компромиссом, который случайно закрепился на сто лет.
Возможно, правильная математика для графики была придумана еще в XIX веке. И мы только начинаем к ней возвращаться.
Всем спасибо за внимание!
Может быть интересно:

Новости, обзоры продуктов и конкурсы от команды Timeweb.Cloud — в нашем Telegram-канале ↩
Комментарии (19)

artptr86
17.06.2026 14:30Современная архитектура 3D-движков так или иначе остаётся только упрощённой моделью реальности. Ради производительности мы триангулируем поверхности, используем текстуры, применяем эффекты вроде бамп-маппинга, Screen Space Shadows и прочих фокусов. Но, к сожалению, движок с вокселями высокого разрешения и рейтрейсингом, позволяющий создать картинку такого же качества будет потреблять неприлично много ресурсов.

Sixshaman
17.06.2026 14:30Только операции с векторами, матрицами и кватернионами банально быстрее, чем с объектами геометрической алгебры.
Да, красиво. Но за этой красотой много оверхеда, который в случае 3D-движков критичен. Даже Eric Lengyel, автор книг по геометрической алгебре, не рекомендует строить код на её принципах.

domix32
17.06.2026 14:30Только операции с векторами, матрицами и кватернионами банально быстрее, чем с объектами геометрической алгебры.
Да вроде не должно. Что у кватернионов сложение после пары умножений - когда матрицы друг с другом перемножаете, что у геометрической алгебры, просто на компонентах бивектора. В определённых ситуациях можно наверное даже бонус получить из-за чуть меньшей размерности.

Vytian
17.06.2026 14:30Там кроме неочевидного количества параметров на объект, есть куча подводных камней типа точности численного представления. Обычный 3D полон костылей, но их можно вообще в 4битных интах считать иногда, и уж во всяком лучае в single. Аналогичные оптимизации для GA , когда и если их напишут, вероятно , будут выглядеть как другой набор костылей, на этот раз совершенно неинтеллигибельный, пардоньте мой французский.

domix32
17.06.2026 14:30GA не добавляет примерно ничего принципиально нового, оно просто генерализует эту математику на произвольномерное пространство под единым фреймворком. Для 3D там все также прячутся кватернионы выводимые из антикоммутативности внешнего произведения, дот/кросс продакты и вот это вот все. Оно математически приятнее, вычислительно там те же яйца, только сбоку как если б мы голые матрицы вертели друг против друга, только компоновка несколько площе изначально. Поэтому все приколы с понижением точности, нормализацией к единичной окружности и прочее работают ровно также.
Если понимаете английский, то могу предложить посмотреть вот эту серию по GA. Там как раз поясняется связь и прелести клифордовых алгебр.

Bunyaz39
17.06.2026 14:30Проблемы с флоатами есть вообще везде. В классических кватернионах мы хотя бы знаем, где постелить соломку при нормализации

Bunyaz39
17.06.2026 14:30Пока кремний физически спроектирован под перемножение обычных матриц, любая экзотическая альтернатива будет в пролете по скорости

Daddy_Cool
17.06.2026 14:30Очень интересно! Люблю эти вещи, от кватернионов (со школы, спасибо журналу "Квант"), до пятимерной алгебры.
---
Автор, скажите честно, вы использовали ИИ для генерации текста?
Вот эти разбиения мысли на два эмоциональных предложения уже бесят. Весь интернет таким забит.
"Не стрелочка, торчащая перпендикулярно плоскости. А сама плоскость".
"Это не просто новая библиотека. Это почти смена языка мышления".
"Возможно, правильная математика для графики была придумана еще в XIX веке. И мы только начинаем к ней возвращаться".
А комменты прекрасны - абзац из двух предложений, каждое на четыре строки, сразу чувствуешь - человек писал.

Bunyaz39
17.06.2026 14:30Вся индустрия держится на исторических компромиссах. Архитектура х86 тоже кривая как сабля, но попробуй ее сейчас выкорчевать из серверов

Bromles
17.06.2026 14:30Я не знаю, использовался ли этот сайт при написании статьи, или автор просто очень удачно скомпоновал информацию в очень похожем виде
Но проблема кватернионов, роторы и прочее описанное в статье уже очень давно есть на сайте https://marctenbosch.com/quaternions/, причем там еще и интерактивные демонстрации всего этого счастья, которые мышкой покрутить можно

wataru
17.06.2026 14:30# Ищем пересечение линии и сферы. ОДНА СТРОЧКА!intersection =line.meet(sphere)Но пересечение сферы и точки - две точки. В этой алгебре, что ли, можно представить пару точек? Что это за объект?
Я так понял, что раз у нас 5-мерное пространство, то это мультивектор с 32 компонентами, так?
Можно ли его потом пересечь с чем-то еще, чтобы получить одну единственную точку и будет ли эта точка в точности равна точке заданной руками, вроде
up(eo + 1*e1)?

nomhoi
17.06.2026 14:30Ответ ИИ: Да, оптимизацию вычислений в Conformal Geometric Algebra (CGA) на C++ не только можно, но и нужно выполнять, так как “наивная” реализация алгебры Клиффорда (например, с использованием общих матриц 32x32) будет работать медленно из-за огромного количества нулевых элементов.
В CGA мультивектор состоит из 32 базисных элементов, что требует поиска эффективных путей вычисления.
Основные подходы к оптимизации CGA в C++
Отказ от полной алгебры и разреженное хранение (Sparse Multivectors) Большинство операций в CGA затрагивают лишь небольшое подмножество базисных элементов (например, определенные подпространства k-векторов). Использование шаблонов позволяет вычислять только ненулевые коэффициенты и компилировать код, исключая умножения на ноль.
Метапрограммирование шаблонов (Expression Templates) и ленивые вычисления Такие библиотеки, как GATL и Gaalet, используют продвинутое метапрограммирование. Они конструируют выражение во время компиляции, исключая создание временных объектов и объединяя базовые операции в максимально быстрый машинный код.
Предварительная генерация кода (Code Generation) Сложные выражения и формулы можно оптимизировать с помощью программ предварительной компиляции (прекомпиляторов). Например, Gaalop (Geometric Algebra Algorithms Optimizer) принимает алгоритм, записанный на геометрической алгебре, математически упрощает его и генерирует чистый, низкоуровневый C++ код.
Использование SIMD (Векторизация) Для обеспечения высокой пропускной способности многие современные движки используют аппаратную векторизацию (SSE, AVX, NEON). Хотя многие подобные библиотеки узко специализируются на 3D Projective Geometric Algebra (например, Klein), эти же низкоуровневые техники векторной математики применимы и для масштабирования производительности CGA.
Генераторы библиотек Существуют инструменты вроде Garamon, которые способны по заданному файлу конфигурации (метрике пространства) автоматически генерировать максимально оптимизированную под конкретную задачу C++ библиотеку.
Рекомендуемые C++ библиотеки
Для работы с геометрическими алгебрами, включая CGA, можно использовать готовые решения, в которых эти оптимизации уже применены:
Versor — очень популярная C++ библиотека для CGA, которая базируется на предвычисленных таблицах умножения и сильно темплатизирована для достижения высокой скорости во время выполнения.
GAL — высокопроизводительный движок на C++17, оптимизирующий вычисления и убирающий избыточные термины с помощью compile-time преобразований.
GATL — использует ленивые вычисления (lazy evaluation) для оптимизации алгебраических выражений на этапе компиляции.
Если вы планируете реализовывать вычисления самостоятельно, то наиболее эффективным будет путь использования концепций Data-Oriented Programming (ориентация на данные) и написания кода, генерирующего таблицы умножения (Basis Blade Multiplication Tables) прямо на этапе компиляции с помощью constexpr и variadic templates.

HOMPAIN
17.06.2026 14:30Я правильно понял, что вместо матриц, систем координат и примитивов создать объеrт GA, например для тигра. Мы можем его двигать , вращать, анимировать и интерполяция между этими состояниями будет геометрически правильная? Если тигр схватил суслика, как тогда привязать суслика к зубам тигра, у нас же нет локальных систем координат?

Jijiki
17.06.2026 14:30тема интересная.
вот например BVH, всего лишь боксы лежат, наполнили отправили протестировали, а как выглядит одноформульная прокладка например интересно.

Arsch_des_Prasidenten
17.06.2026 14:30Уже появляются генераторы кода, которые умеют анализировать мультивекторы на этапе сборки, выкидывать нулевые коэффициенты и превращать красивые абстрактные формулы в очень эффективные SIMD-инструкции. То есть разработчик пишет чистую геометрию, а компилятор превращает ее в быстрый машинный код.
Выглядит как работа для шаблонов, а не для компилятора

Arsch_des_Prasidenten
17.06.2026 14:30И все же GA постепенно просачивается в области, где математическая устойчивость важнее, чем каждый такт процессора. В робототехнике она позволяет решать задачи обратной кинематики без многих классических сингулярностей.
В робототехнике, вроде, Проективная геометрическая алгебра (Projective Geometric Algebra, PGA)
upd: CGA это элемент всего класса алгебр PGA

Flux82
17.06.2026 14:30Когда физикам и инженерам понадобилась удобная математика для электромагнетизма и механики, Josiah Willard Gibbs и Oliver Heaviside взяли идеи Клиффорда и разрезали их на части.
Ну нет же. Если историю рассказываете, то лучше не искажайте её. Конечно, Гиббс знал Клиффорда. Но идея разделения на векторное и скалярное произведения витала в воздухе. И тот же Гиббс позже будет ссылаться на работы Клиффорда как на пример отхода от кватернионной традиции, а не как на первоисточник идей.
From reading Maxwell’s “Treatise on Electricity and Magnetism”, where Quaternion notations are considerably used, I became convinced that to master those subjects, it was necessary for me to commence by mastering those methods. At the same time I saw, that although the methods were called quaternionic, the idea of the quaternion was quite foreign to the subject. I saw that there were two important functions (or products) called the vector part & the scalar part of the product, but that the union of the two to form what was called the (whole) product did not advance the theory as an instrument of geom. investigation
Из черновика письма от Гиббса Виктору Шлегелю (https://worrydream.com/refs/Crowe_2002_-_History_Of_Vector_Analysis.pdf)
Nail_S
Выглядит интерессно. Одно пугает, к векторам то не сразу привык, посмотрим сколько уйдет на осознание этого аппарата