Spotlight #65 – Спортивна фізика, робототехніка та графіка: опір велосипеда, руки FABRIK і рей-марчинг

Рівняння, що вирішують етап Тур де Франс, скеровують руку робота до цілі, яку вона ніколи не бачила, рендерять сяючу сферу без жодного трикутника і закручують футбольний м'яч навколо стінки — чотири симуляції хвилі 98, що живуть на перетині елегантної математики та фізичної інтуїції.

I. Аеродинаміка велосипеда — чому швидкість коштує так дорого

🚴

Аеродинаміка велосипеда — CdA, потужність і драфтинг

Регулюйте швидкість, положення велосипедиста та висоту над рівнем моря; спостерігайте, як аеродинамічна, вагова (кочення) та підйомна потужність розподіляються в реальному часі. Увімкніть драфтинг і встановіть відстань до лідера.

Велоспорт — це боротьба з повітрям. На швидкості 40 км/год на рівній ділянці близько 90% потужності велосипедиста йде на подолання опору повітря. Опір кочення й тертя трансмісії ділять між собою решту 10%. Саме тому професійні велосипедисти так одержимі положенням тіла, формою шолома та висотою шкарпеток — крихітні зменшення площі аеродинамічного опору напряму перетворюються на секунди, зекономлені на кожному кілометрі.

Аеродинамічна сила опору, що діє на велосипедиста, пропорційна квадрату швидкості й одному складеному параметру CₜA — добутку коефіцієнта опору Cₜ (безрозмірний форм-фактор) і лобової площі A (у м²). Потужність, будучи добутком сили на швидкість, тоді масштабується як куб швидкості. Це кубічне співвідношення — центральний факт велосипедної аеродинаміки: подвоєння швидкості вимагає у вісім разів більшої аеродинамічної потужності.

F_опору = 0.5 * rho * v^2 * CdA
P_аеро = F_опору * v = 0.5 * rho * v^3 * CdA
P_кочення = Crr * m * g * cos(theta) * v   (опір кочення)
P_підйом = m * g * sin(theta) * v          (гравітаційна складова)
P_загальна = P_аеро + P_кочення + P_підйом

Типові значення CdA (велосипедист + велосипед):
  Пряма посадка (містом)      : 0.50 -- 0.60 м^2
  Посадка на опущеному кермі  : 0.30 -- 0.38 м^2
  Розділкова позиція (TT)     : 0.18 -- 0.24 м^2
  Рекорд години                : ~0.18 м^2

Густина повітря: rho = 1.225 * exp(-висота / 8500)  (кг/м^3)

Симуляція включає регулювання висоти над рівнем моря, оскільки густина повітря експоненційно спадає з висотою — на 2000 м (типово для гірського етапу) повітря приблизно на 21% розрідженіше, ніж на рівні моря, що зменшує аеродинамічний опір на ту саму частку і частково пояснює, чому рекорди часто встановлюють саме на висоті.

Драфтинг: як сховатись у слідовому потоці

Їзда близько за іншим велосипедистом поміщає вас у його слід — область турбулентного повітря зниженого тиску, що частково захищає вас від зустрічного потоку. Лідер виконує більшу частину аеродинамічної роботи; той, хто їде позаду, економить енергію. Дослідження в аеродинамічній трубі показують, що на відстані 2 м позаду одного лідера ефективний CdA того, хто їде слідом, зменшується приблизно на 27%. У пелотоні з 50 велосипедистів ті, хто «похований» у середині, можуть заощадити 40% і більше своєї аеродинамічної потужності.

CdA_позаду(відстань) ~ CdA_соло * (1 - 0.27 * exp(-відстань / 3.5))
  відстань : дистанція позаду лідера (м)
  При відстані = 0 (торкання коліс): ~35% зменшення
  При відстані = 5 м                : ~10% зменшення
  При відстані = 10 м               : ~4% зменшення (незначно)

Симуляція дозволяє розташувати до чотирьох велосипедистів у лінію й спостерігати, як потрібна потужність кожного з них змінюється в реальному часі, ілюструючи, чому командна тактика у велоспорті настільки важлива: помічники (домештики) жертвують власною гонкою, ведучи групу, щоб прикрити лідера команди, який прибуває на фінальний підйом зі свіжішими ногами.

II. FABRIK — обернена кінематика без тригонометрії

🦾

Обернена кінематика — алгоритм FABRIK і обмеження суглобів

Перетягуйте ціль; спостерігайте, як ланцюг із 2–12 жорстких ланок розв'язується в реальному часі. Перемикайте обмеження кутів суглобів і уникнення перешкод. Показує кількість ітерацій збіжності на кадр.

Обернена кінематика (IK) — це задача пошуку кутів суглобів, які розміщують кінцевий ефектор роботизованої руки в бажаній позиції. «Обернена» — це те, що робить задачу складною: перехід від кутів суглобів до позиції кінцевого ефектора (пряма кінематика) — проста композиція обертань. Рух у зворотному напрямку — від цільової позиції до кутів суглобів — має кілька розв'язків або жодного, і наївно вимагає розв'язання нелінійної системи рівнянь.

Класичний підхід використовує матрицю Якобі для лінеаризації задачі й розв'язує її ітеративно методом демпфованих найменших квадратів. Це працює, але вимагає обернення матриці, що дорого для великої кількості суглобів. FABRIK (Forward And Backward Reaching Inverse Kinematics — «пряме й зворотне досягнення в оберненій кінематиці»), запропонований Арістідоу та Лейсенбі у 2011 році, обходить усе це за допомогою напрочуд простого геометричного спостереження: кути обчислювати взагалі не потрібно — достатньо просто рухати суглоби.

Алгоритм

Позначимо позиції суглобів p₀ (корінь) до pₙ (кінцевий ефектор), з довжинами ланок d₁ до dₙ. Прямий прохід тягне ланцюг до цілі; зворотний прохід повторно закріплює його до кореня.

Прямий прохід (тягнемо кінцевий ефектор до цілі):
  p[n] = ціль
  для i = n-1 до 0:
    r = |p[i] - p[i+1]|       (відстань між сусідніми суглобами)
    lambda = d[i+1] / r
    p[i] = (1 - lambda) * p[i+1] + lambda * p[i]

Зворотний прохід (повторне закріплення кореня):
  p[0] = корінь (фіксований)
  для i = 1 до n:
    r = |p[i] - p[i-1]|
    lambda = d[i] / r
    p[i] = (1 - lambda) * p[i-1] + lambda * p[i]

Повторювати, доки |p[n] - ціль| < допуск (зазвичай 3-10 ітерацій)

Обмеження кута суглоба (для кожного суглоба):
  обмежити кут між сегментами p[i-1]->p[i] і p[i]->p[i+1]
  у межах конуса з половинним кутом phi навколо напрямку спокою

Кожен прохід має складність O(n) і тривіально розпаралелюється. Алгоритм надійно збігається для досяжних цілей і обробляє будь-яку кількість ланок. Коли ціль знаходиться поза межами досяжності ланцюга, FABRIK витягує ланцюг у прямій лінії до неї. Коли застосовуються обмеження суглобів, алгоритм обмежує кожен кут суглоба наприкінці кожного проходу перед тим, як продовжити — локальна операція, що не вимагає глобального перерахунку.

FABRIK широко використовується в іграх і робототехніці саме завдяки своїй простоті та швидкості. І Unreal Engine, і Unity включають розв'язувачі IK на основі FABRIK у своїх системах анімації. Симуляція додає аналітичний розв'язок для дволанкового випадку для порівняння та режим уникнення перешкод, який штрафує конфігурації суглобів, що перетинають набір кругових перешкод.

III. Рей-марчинг — рендеринг без трикутників

🎨

Рей-марчинг і функції знакової відстані — GLSL-шейдер

Складіть сцену з до чотирьох SDF-примітивів (сфера, куб, тор, капсула) зі згладженим об'єднанням (smooth-min). Налаштуйте затінення за Фонгом, м'які тіні та навколишнє затінення (ambient occlusion). Працює повністю у фрагментному шейдері.

Растеризація — процес проєктування трикутників на екран — це те, як створюється практично кожне зображення 3D у реальному часі. Але є й інший підхід: для кожного пікселя пускати промінь із камери і знаходити, де він перетинає геометрію сцени. Це основа трасування променів та його близького родича — рей-марчингу.

Рей-марчинг замінює явну геометрію функцією знакової відстані (SDF): функцією, яка бере точку в просторі й повертає знакову відстань до найближчої поверхні (від'ємну всередині, додатну зовні, нуль на поверхні). Щоб «промарширувати» промінь, починаємо з камери й робимо кроки вздовж напрямку променя. На кожному кроці запитуємо SDF, щоб знайти відстань до найближчої поверхні — ми знаємо, що можемо безпечно зробити крок такої довжини, нічого не зачепивши. Якщо відстань опускається нижче порогу, ми влучили в поверхню. Якщо накопичена відстань перевищує максимум, промінь проходить повз.

SDF сфери:   d = |p - центр| - радіус
SDF куба:    q = |p - центр| - половина_розміру
             d = |max(q, 0)| + min(max(q.x, q.y, q.z), 0)
SDF тора:    q = (|p.xz| - R, p.y)
             d = |q| - r

Згладжене об'єднання (smooth-min):
  smin(a, b, k) = -log(exp(-k*a) + exp(-k*b)) / k   (експоненційний варіант)
  або:
  h = clamp(0.5 + 0.5*(b-a)/k, 0.0, 1.0)           (поліноміальний варіант)
  smin(a, b, k) = mix(b, a, h) - k*h*(1-h)

Оцінка нормалі (центральні різниці):
  n = normalize(vec3(
    SDF(p + eps.xyy) - SDF(p - eps.xyy),
    SDF(p + eps.yxy) - SDF(p - eps.yxy),
    SDF(p + eps.yyx) - SDF(p - eps.yyx)
  ))

Затінення за Фонгом:
  I = k_a * I_a + k_d * I_d * max(dot(n, L), 0) + k_s * I_s * max(dot(r, v), 0)^alpha

Функція smooth-min — секретний інгредієнт, що робить SDF-и композиційно цікавими. Замість жорсткого об'єднання (взяти мінімум двох SDF, що створює гострий шов), smooth-min змішує дві поверхні в області, контрольованій параметром k. Низьке k дає різке об'єднання; високе k дає плавне, немов ліплене злиття, ніби обидві форми зроблені з глини й притиснуті одна до одної.

Оцінка нормалі центральними різницями означає, що вам ніколи не потрібно аналітично виводити градієнт — сама SDF повідомляє орієнтацію поверхні. Саме тому навіть екзотичні, ручної роботи SDF-и автоматично отримують коректне затінення, м'які тіні й навколишнє затінення безкоштовно, просто через опитування тієї ж SDF з сусідніх точок.

Симуляція працює повністю у фрагментному GLSL-шейдері — один виклик шейдера на піксель, усе паралельно на GPU. Додавання нового примітива чи оператора змішування вимагає лише кількох рядків GLSL і одразу з'являється в рендері без перекомпіляції основного JavaScript. Саме це робить рей-марчинг на SDF таким потужним творчим середовищем: опис сцени і рендерер — це одне й те саме.

IV. Футбольний удар — ефект Магнуса та закручені м'ячі

Футбольний удар та ефект Магнуса — траєкторія м'яча, що обертається

Встановіть вісь обертання, швидкість обертання, швидкість вильоту та кут підйому. Симулюйте траєкторію в 3D, включно зі стінкою захисників на відстані 9.15 м. Показує розкладання сил і порівняння траєкторії з випадком без обертання.

Коли м'яч обертається під час польоту, ефект Магнуса штовхає його вбік — перпендикулярно і до швидкості, і до осі обертання. Футбольний м'яч, ударений із боковим обертанням, огинає стінку захисників; верхнє обертання (топспін) гасить відскок м'яча при приземленні; нижнє обертання (бекспін) дозволяє м'ячу оманливо «пливти», перш ніж різко впасти. Кожен закручений штрафний удар і «бананний» удар — це жива демонстрація ефекту Магнуса.

Сила Магнуса виникає тому, що обертання тягне за собою прикордонний шар повітря навколо м'яча, прискорюючи його з одного боку та сповільнюючи з іншого. За принципом Бернуллі (або, точніше, за законом збереження імпульсу у відхиленому повітряному потоці), сторона з вищою швидкістю руху має нижчий тиск, і різниця тисків створює чисту силу, перпендикулярну до вектора швидкості. Величина сили залежить від швидкості обертання ω, радіуса м'яча r та швидкості v.

F_Магнуса = C_L * rho * pi * r^2 * |v x omega| / |omega|
  C_L    : коефіцієнт підйомної сили (~0.25 для футбольного м'яча за ігрових швидкостей обертання)
  rho    : густина повітря (1.225 кг/м^3 на рівні моря)
  r      : радіус м'яча (0.11 м для м'яча розміру 5)
  v      : вектор швидкості (м/с)
  omega  : вектор кутової швидкості (рад/с)

Напрямок: F_Магнуса паралельний до (omega x v)

Сила опору (для довідки):
  F_опору = 0.5 * C_D * rho * A * v^2
  C_D    : коефіцієнт опору (~0.25 для гладкої сфери, ~0.4 для футбольного м'яча)
  A      : площа поперечного перерізу = pi * r^2

Рівняння руху (метод Ейлера):
  a = (F_опору + F_Магнуса + F_гравітації) / m
  v += a * dt
  x += v * dt

Симуляція інтегрує три сили — опір, гравітацію та Магнуса — за допомогою методу Ейлера з фіксованим кроком часу dt = 1 мс, достатньо малим, щоб траєкторія була точною до сантиметра на дистанції штрафного удару в 30 м. Стінка захисників на відстані 9.15 м (регламентна дистанція ФІФА) показана в перерізі, щоб можна було побачити, як добре пробитий м'яч огинає стінку зверху й знову опускається у ворота.

На професійних швидкостях штрафних ударів (25–30 м/с) і швидкостях обертання (8–10 об/с) сила Магнуса може відхилити м'яч на 3–5 м убік за 25 м польоту, тому спеціалісти зі штрафних ударів витрачають тисячі годин, навчаючись відтворювати точну точку контакту ноги з м'ячем і дугу маху, потрібні для надання правильного вектора обертання. Симуляція робить цю чутливість наочною: зміна швидкості обертання на 10% дає помітно іншу траєкторію.

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

← Spotlight #64: Квант, нанотехнології та ШІ Усі дописи →