Що таке криві Безьє та як їх використовувати при створенні ігор
Ми продовжуємо серію текстів «Математика в геймдеві» — цикл про математичні концепції, які розробники використовують при створенні ігор. У минулих публікаціях ми писали про діаграми Вороного, інтерполяцію та кватерніони. Цього ж разу розповімо про криві Безьє.
Без них майже неможливо уявити роботу систем автоматизованого проєктування чи програми комп’ютерної графіки — завдяки простоті і зручності побудови криві стали чи не обов’язковим інструментом для моделювання гладких ліній. У геймдеві криві Безьє використовуються для створення візуальних ефектів, керування траєкторією рухів та ще багато для чого.
Нижче — невеличкий екскурс в історію кривих Безьє. Якщо вам цікаво прочитати саме про прикладний аспект цього об’єкту, радимо перейти одразу до розділу «Криві Безьє та геймдев».
Крива історії: автомобілі, NDA та українські поліноми
У соціології наукового знання існує такий собі закон Стіглера, який стверджує, що «жодне наукове відкриття не було названо на честь першовідкривача». У 1980 році професор статистики університету Чикаго Стівен Стіглер описав це правило і воно само по собі не є виключенням — першовідкривачем закону був американський соціолог Роберт Мертон. Виключенням, звісно, не є і криві Безьє.
Назвали їх так на честь французького інженера П’єра Безьє. У
Зокрема, одним з головних завдань Безьє було моделювання автомобільних кузовів у тривимірному просторі. Щоб розв’язувати проблему інженер дивився на поверхні, як на перетворення кривих і дійшов важливого практичного висновку — кресляр не має бути ще й обчислювачем і самі розрахунки потрібно виводити з креслення, а не навпаки. Озброївшись цією концепцією Безьє у 1962 році дійшов до геніальної системи кривих, які можна було задавати параметрично. Тобто через контрольні точки, яких може бути 2,3,4 та навіть більше.




П’єру належав патент на криві та поверхні Безьє, у 1972 році він отримав за них премію Несіма Хабіфа, а з 2007 року асоціація параметричного проєктування Solid Modeling (SMA) вручає Премію Безьє за параметричне, геометричне чи фізичне моделювання. Але сам Безьє не був першовідкривачем цього математичного об’єкта.
Це зробив інший французький фізик та математик Поль де Кастельжо. Він працював на автомобільну компанію Citroën і у 1959 році, незалежно від Безьє, використав полілінійні поліноми для розрахунку кривих та знайшов рекурсивний алгоритм для визначення їх форм. Фактично, він випередив колегу на три роки, але на заваді до світової слави стало NDA — Citroën до 1985 року не дозволяли Кастельжо публікувати свої дослідження. Сам Безьє розповідав, що знав про роботу колеги, але протягом багатьох років під час презентації своїх досліджень посилався на міфічного професора Дюранта. Він також не раз стверджував, що права на цю роботу мають бути передані Кастельжо.
У 2012 та сама SMA відновила справедливість — одноголосно віддала премію Безьє Полю де Кастельжо, сподіваючись, що той отримає заслужене, хоч і невчасне визнання. Та навіть самого Кастельжо не можна повною мірою назвати винахідником цих кривих, оскільки його алгоритм є хоч і сталим, але все ж «одним з» методів обчислення багаточленів Бернштейна.
Сергія Бернштейна зазвичай вважають російським, або ж радянським математиком. Хоча існують всі підстави вважати його українським вченим — народився в Одесі, понад двадцять років викладав у Харкові, був директором Українського інституту математичних наук. Свою першу докторську він захистив у 1904 році в Сорбонні (Париж), але після повернення мав захищатися знов — російська імперія тоді не визнавала європейські дипломи.
Свій другий ступінь Бернштейн захистив у 1913 році у Харківському університеті. Працюючи над конструктивним доказом апроксимаційної теореми Веєрштрасса математик використав поліноми Бернштейна, за що і отримав нагороду від Бельгійської наукової академії. Якщо підсумовувати, то криві Безьє проходять крізь роботу самого Безьє, алгоритм Кастельжо, надбання Бернштейна та ще далі. Насправді цими сходами можна спускатися дуже довго і, як заведено, дістатися аж до Вавилону. Тому саме час поговорити про застосування цих надважливих кривих у геймдеві.
Криві Безьє та геймдев
Як зазначає Unity developer Роман Романіченко, використання кривих або їх основного підвиду сплайнів в геймдеві надзвичайно корисно, оскільки є надзвичайно зручним інструментом для розв’язання багатьох проблем.
«Одразу б хотів розставити точки над „і“, а в нашому випадку над кривою — в будь-якому ігровому решії70-80% часу при роботі з кривими, ви будете працювати саме з їх підвидом — сплайнами. Одразу питання — яка між ними різниця? Якщо не вдаватися в „важкі“ терміни по прикладу „апроксимації“ то крива — це набір зв’язаних між собою координатних точок в просторі (2D або 3D) для умовного переміщення між якими застосовується інтерполяція. Своєю чергою сплайн є набором специфічно з’єднаних сегментів, які є простішими кривими», — додає він.
1Про види кривих
Крива у своєму «ядрі» — математичний об’єкт, який може бути описаний різними способами, в тому числі інтерполяцією. За весь час було виділено багато видів кривих, які підходять для тієї чи іншої області, в якій вони використовуються. В ігрових рушіях Роман пропонує виділити наступні, найпоширеніші по виду інтерполяції:
Лінійна інтерполяція кривої — характерна «різким» або прямим переходом між сегментами кривої.

Catmull Rom інтерполяція кривої — характерна плавним переходом між сегментами кривої. Вперше була використана для плавного переходу анімації персонажів в анімаційних фільмах компанії Pixar.

Bezier інтерполяція кривої — насправді універсальна крива, оскільки дозволяє здійснювати контроль над тим, як поводить себе сегмент кривої при вході або виході з контрольної точки сегмента за допомогою спеціальних «ручок», тим самим забезпечуючи широкий спектр варіації кривої, починаючи навіть від створення прямої лінії.

B-spline (або базисна сплайн-інтерполяція) — також плавна крива, в якій кожна контрольна точка має свій ваговий знак. В залежності від сили ваги вони впливають на побудову всієї кривої.

2Про застосування кривих
«Найефективніше використання кривих в геймдев-розробці звісно можна відчути при роботі з анімацією. Їх так і називають — „анімаційні криві“. Саме тут видно всю міць та красу використання кривих. Потрібно в кінці анімації додати різкості — зміни в кінці анімації криву; потрібно зробити більш плавний перехід на 20 секунді кадру — зміни криву. Завдяки кривим аніматор наочно бачить, як саме введе себе об’єкт анімації в конкретний момент, що дає йому змогу легко нею маніпулювати», — пояснює Романіченко.
Іншою особливою «нішею» використання кривих є Level Design. Завдяки кривим програмісти можуть розробити потужні інструменти, які не тільки полегшують роботу дизайнеру, а й в рази прискорюють його роботу. Щоб далеко не ходити, візьмем реалізацію дороги на Unity. Без застосування кривих складно уявити, який великий шмат роботи мав би проробити дизайнер для створення самої звичайної дороги — вирівняти місцевість, розфарбувати її, розставити необхідні бічні елементи вздовж дороги (каміння, трава, знаки тощо). А головне — якщо через якийсь час треба щось буде змінити... Тут почнеться біль для дизайнера. Ось як це приблизно виглядає без використання кривих:
Правильно створені інструменти на основі кривих вирішують ці проблеми:
«Якщо ви коли-небудь користувалися візуальним програмуванням, то легко помітите, що для з’єднання вузлів або вузлів графу нам, як розробникам, надано надзвичайно зручну систему, яка, до речі, використовує криві лінії. Чому? Тому що це зручно і зрозуміло для сприйняття. Завдяки такій системі навіть людина, яка не володіє навичками програмування, легко може побудувати необхідну їй логіку», — також додає Роман.
3Про систему Unity Spline
З випуском версії рушія Unity версії 2022.3 LTS пакет Unity Spline перейшов з категорії експериментальних в категорію для виробництва. Наприклад, художники тепер мають можливість анімувати камери, персонажів, частинки та будь-які інші речі. Окрім того, тепер легше створювати огорожі, стіни, доріжки та інші деталі, що потребують розміщення багатьох об’єктів уздовж кривої дороги або будь-чого іншого. Також легше стало будувати та змінювати труби, електропроводку тощо. Своєю чергою розробники інструментів та функцій можуть використовувати Splines, як основу для власних рішень (для себе, Asset Store тощо).

Підсумовуючи, Романіченко зазначає, що криві та сплайни є важливими інструментами в геймдеві та комп’ютерній графіці по ряду причині використовуються, зокрема, для:
- візуальних ефектів: криві дозволяють створювати плавні анімації об’єктів та переходи між кадрами, використовуються для реалістичних рухів персонажів, анімаційних ефектів та інших візуальних елементів;
- керування траєкторіями руху: криві дозволяють визначати траєкторії руху об’єктів (автомобілі, літальні апарати, камери, потяги тощо); за допомогою сплайнів можна легко задати плавні шляхи руху та контролювати їх параметри;
- гнучкість та модифікованість: зміна кривих та сплайнів дозволяє швидко змінювати форму, кривизну та поведінку об’єктів; це дає розробникам гнучкість у реалізації нових ідей, експериментах та швидкій модифікації вже існуючих елементів гри;
- контроль анімації: криві можуть використовуватись для контролю параметрів анімації, таких як швидкість, часові інтервали, масштабування тощо — це дозволяє досягти більшої точності та контролю над анімаційними ефектами.
«Загалом, криві та сплайни є потужними інструментами, що допомагають створювати візуально привабливі, реалістичні та динамічні ігрові світи, а як правильно використовувати їх — залежить тільки від розробника», — наголошує Роман.
Засновниця Unity Tech Learn Arcueid D’athemon додає, що криві Безьє дозволяють описувати плавну зміну значення (Vector3, Color, float тощо) відносно до зміни іншого значення і зазвичай це float у проміжку від 0 до 1. За словами розробниці, прикладом кривої Безьє можна назвати AnimationCurve, яка дозволяє передаючи в функцію Evaluate() значення осі Х і отримувати значення по осі Y.
private void Update() { var time = Mathf.PingPong(Time.time, 1); var speedModificator = _curve.Evaluate(time) transform.Rotate(Vector3.up * _speed * speedModificator * Time.deltaTime, Space.Self); }
«Цей клас дозволяє зручно маніпулювати процедурними анімаціями (DoTween, чи зробленими через Coroutine), робити плавний набір обертів у мотора автівки, чи кастомне прискорення при падінні. Тривимірні криві Безьє дуже зручні для заздалегідь запланованого руху об’єкта. Наприклад, доволі відомі PathCreator та Dreamteck Splines. Завдяки підходу з використанням кривих Безьє, розробники можуть зробити рух камери по чітко запланованому та нелінійному шляху», — резюмує Arcueid D’athemon.
Резюмуючи нашу тему, Unity developer Максим Глуховський зазначає — криві Безьє можна розглядати, як інтерполяцію через багато точок, дві з яких це початкова і кінцева, а інші — керуючі. Частіше за все об’єкт використовується для побудови плавних маршрутів або ж відображення реалістичної поведінки гнучких матеріалів (канату чи підвісного моста). Детальніше про криві можна дізнатися з його відео нижче.
Також Глуховський згадує поверхні Безьє, які є різновидом математичного сплайна. Як і у випадку з кривими, поверхня Безьє визначається набором контрольних точок. Та попри значну подібність до інтерполяції, основна відмінність полягає в тому, що поверхня, в загальному випадку, не проходить через центральні контрольні точки. Вона скоріше «розтягується» відносно них так, ніби кожна точка є центром тяжіння. Поверхні Безьє візуально впізнавані й математично зручні для багатьох застосувань, але це вже тема для наступного матеріалу.
А ви використовуєте у своїй роботі криві Безьє? Яким чином? Можливо, існують більш неочевидні варіанти їх застосування? Діліться в коментарях! Окрім того, якщо ви користуєтеся іншими математичними об’єктами чи концепціями для створення ігор — можете пройти наше невеличке опитування про математику в розробці ігор.
Підписуйтеся на Telegram-канал @gamedev_dou, щоб не пропустити найважливіші статті і новини.
3 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів