Spotlight #65 – Fizyka Sportu, Robotyka i Grafika: Opór Roweru, Ramiona FABRIK i Ray Marching

Równania, które wygrywają etap Tour de France, prowadzą robotyczną dłoń do celu, którego nigdy wcześniej nie widziała, renderują świecącą kulę bez ani jednego trójkąta i zakrzywiają piłkę nożną wokół muru zawodników — cztery symulacje z Fali 98 leżące na styku eleganckiej matematyki i fizycznej intuicji.

I. Aerodynamika roweru — dlaczego prędkość kosztuje tak dużo mocy

🚴

Aerodynamika roweru — CdA, zapotrzebowanie na moc i jazda w peletonie

Reguluj prędkość, pozycję kolarza i wysokość; obserwuj podział mocy aerodynamicznej, tocznej i wspinaczkowej na żywo. Włącz jazdę za liderem i ustaw odstęp do jadącego z przodu.

Kolarstwo to walka z powietrzem. Przy 40 km/h na płaskim terenie około 90% mocy generowanej przez kolarza idzie na przepychanie powietrza. Opór toczenia i tarcie napędu dzielą się pozostałymi 10%. Dlatego zawodowi kolarze obsesyjnie dbają o pozycję ciała, kształt kasku i wysokość skarpetek — nawet niewielkie zmniejszenie powierzchni oporu aerodynamicznego przekłada się bezpośrednio na sekundy zaoszczędzone na kilometr.

Siła oporu aerodynamicznego działająca na kolarza jest proporcjonalna do kwadratu prędkości i do jednego złożonego parametru CdA — iloczynu współczynnika oporu Cd (bezwymiarowy czynnik kształtu) i powierzchni czołowej A (w m²). Moc, będąc iloczynem siły i prędkości, skaluje się wtedy jak sześcian prędkości. Ta sześcienna zależność jest centralnym faktem aerodynamiki kolarskiej: podwojenie prędkości wymaga ośmiokrotnie większej mocy aerodynamicznej.

F_opor = 0.5 * rho * v^2 * CdA
P_aero = F_opor * v = 0.5 * rho * v^3 * CdA
P_toczenie = Crr * m * g * cos(theta) * v   (opor toczenia)
P_wspinaczka = m * g * sin(theta) * v        (grawitacyjna)
P_calkowita = P_aero + P_toczenie + P_wspinaczka

Typowe wartosci CdA (kolarz + rower):
  Pozycja miejska wyprostowana : 0.50 -- 0.60 m^2
  Pozycja szosowa w dolach     : 0.30 -- 0.38 m^2
  Pozycja TT (czasowka)        : 0.18 -- 0.24 m^2
  Rekord godzinny              : ~0.18 m^2

Gestosc powietrza: rho = 1.225 * exp(-wysokosc / 8500)  (kg/m^3)

Symulacja uwzględnia regulację wysokości, ponieważ gęstość powietrza spada wykładniczo wraz z wysokością — na 2000 m (typowa etapowa górska trasa) powietrze jest o około 21% rzadsze niż na poziomie morza, co zmniejsza opór aerodynamiczny o tę samą frakcję i częściowo tłumaczy, dlaczego rekordy często ustanawia się na dużej wysokości.

Jazda za liderem: ukrywanie się w smudze powietrznej

Jazda tuż za innym kolarzem umieszcza Cię w jego turbulentnej strudze — obszarze o obniżonym ciśnieniu, który częściowo chroni Cię przed napływającym powietrzem. Kolarz prowadzący wykonuje większość pracy aerodynamicznej; podążający oszczędza energię. Badania w tunelu aerodynamicznym pokazują, że przy odstępie 2 m za pojedynczym liderem efektywne CdA podążającego jest zmniejszone o około 27%. W peletonie liczącym 50 kolarzy zawodnicy schowani w środku mogą zaoszczędzić 40% lub więcej mocy aerodynamicznej.

CdA_podazajacy(odstep) ~ CdA_solo * (1 - 0.27 * exp(-odstep / 3.5))
  odstep : odleglosc za liderem (m)
  Przy odstepie = 0 (stykajace sie kola): ~35% redukcji
  Przy odstepie = 5 m                   : ~10% redukcji
  Przy odstepie = 10 m                  : ~4% redukcji (pomijalne)

Symulacja pozwala ustawić do czterech kolarzy w rzędzie i obserwować zapotrzebowanie na moc każdego z nich w czasie rzeczywistym, ilustrując dlaczego taktyka zespołowa w kolarstwie jest tak ważna: pomocnicy poświęcają własny wyścig, prowadząc peleton, by osłonić lidera zespołu, który dociera do ostatniego podjazdu ze świeższymi nogami.

II. FABRIK — kinematyka odwrotna bez trygonometrii

🦾

Kinematyka odwrotna — algorytm FABRIK i ograniczenia stawów

Przeciągnij cel; obserwuj, jak łańcuch od 2 do 12 sztywnych ogniw rozwiązuje się w czasie rzeczywistym. Przełącz ograniczenia kątów stawów i omijanie przeszkód. Pokazuje liczbę iteracji zbieżności na klatkę.

Kinematyka odwrotna (IK) to problem znalezienia kątów stawów, które umieszczą efektor końcowy ramienia robotycznego w pożądanej pozycji. To „odwrotność" sprawia trudność: przejście od kątów stawów do pozycji efektora końcowego (kinematyka prosta) to proste złożenie obrotów. Przejście w drugą stronę — od pozycji docelowej do kątów stawów — ma wiele rozwiązań lub brak rozwiązania, i naiwnie wymaga rozwiązania nieliniowego układu równań.

Klasyczne podejście wykorzystuje macierz Jacobiego, by zlinearyzować problem, i rozwiązuje go iteracyjnie metodą tłumionych najmniejszych kwadratów. To działa, ale wymaga odwracania macierzy, co jest kosztowne dla wielu stawów. FABRIK (Forward And Backward Reaching Inverse Kinematics), wprowadzony przez Aristidou i Lasenby w 2011 roku, omija to wszystko dzięki pięknie prostej obserwacji geometrycznej: wcale nie trzeba obliczać kątów — wystarczy przesuwać stawy.

Algorytm

Oznacz pozycje stawów p₀ (korzeń) do pₙ (efektor końcowy), z długościami ogniw d₁ do dₙ. Przejście w przód ciągnie łańcuch w stronę celu; przejście w tył ponownie zakotwicza go w korzeniu.

Przejscie w przod (przyciagniecie efektora do celu):
  p[n] = cel
  for i = n-1 downto 0:
    r = |p[i] - p[i+1]|       (odleglosc miedzy sasiednimi stawami)
    lambda = d[i+1] / r
    p[i] = (1 - lambda) * p[i+1] + lambda * p[i]

Przejscie w tyl (ponowne zakotwiczenie korzenia):
  p[0] = korzen (staly)
  for i = 1 to n:
    r = |p[i] - p[i-1]|
    lambda = d[i] / r
    p[i] = (1 - lambda) * p[i-1] + lambda * p[i]

Powtarzaj do |p[n] - cel| < tolerancja (zazwyczaj 3-10 iteracji)

Ograniczenie kata stawu (dla kazdego stawu):
  ogranicz kat miedzy segmentami p[i-1]->p[i] i p[i]->p[i+1]
  w obrebie stozka o polkacie phi wokol kierunku spoczynkowego

Każde przejście ma złożoność O(n) i jest trywialnie zrównoleglane. Algorytm zbiega niezawodnie dla celów osiągalnych i obsługuje dowolną liczbę ogniw. Gdy cel jest poza zasięgiem łańcucha, FABRIK rozciąga łańcuch w jego stronę wzdłuż linii prostej. Gdy zastosowane są ograniczenia stawów, algorytm przycina każdy kąt stawu na końcu każdego przejścia przed kontynuacją — operacja lokalna, niewymagająca globalnego przeliczenia.

FABRIK jest szeroko stosowany w grach i robotyce właśnie ze względu na swoją prostotę i szybkość. Zarówno Unreal Engine, jak i Unity zawierają solvery IK oparte na FABRIK w swoich systemach animacji. Symulacja dodaje analityczne rozwiązanie dwuogniwowe do porównania oraz tryb omijania przeszkód, który penalizuje konfiguracje stawów przecinające zestaw okrągłych przeszkód.

III. Ray marching — renderowanie bez trójkątów

🎨

Ray marching i pola odległości ze znakiem — shader GLSL

Skomponuj scenę z do czterech prymitywów SDF (kula, sześcian, torus, kapsuła) z mieszaniem smooth-min. Dostrój cieniowanie Phonga, miękkie cienie i ambient occlusion. Działa całkowicie w shaderze fragmentów.

Rasteryzacja — proces rzutowania trójkątów na ekran — to sposób, w jaki powstaje praktycznie każdy obraz 3D w czasie rzeczywistym. Istnieje jednak inne podejście: dla każdego piksela wystrzel promień z kamery i znajdź, gdzie trafia w geometrię sceny. To podstawa ray tracingu i jego bliskiego kuzyna, ray marchingu.

Ray marching zastępuje jawną geometrię funkcją odległości ze znakiem (SDF): funkcją, która przyjmuje punkt w przestrzeni i zwraca odległość ze znakiem do najbliższej powierzchni (ujemna wewnątrz, dodatnia na zewnątrz, zero na powierzchni). By kroczyć promieniem, zacznij od kamery i wykonuj kroki wzdłuż kierunku promienia. Przy każdym kroku odpytaj SDF o odległość do najbliższej powierzchni — wiesz, że możesz bezpiecznie przesunąć się o tyle, nie trafiając w nic. Jeśli odległość spadnie poniżej progu, trafiłeś w powierzchnię. Jeśli skumulowana odległość przekroczy maksimum, promień chybia.

SDF kuli:    d = |p - srodek| - promien
SDF szescianu: q = |p - srodek| - polrozmiar
              d = |max(q, 0)| + min(max(q.x, q.y, q.z), 0)
SDF torusa:   q = (|p.xz| - R, p.y)
              d = |q| - r

Suma wygladzona (smooth-min):
  smin(a, b, k) = -log(exp(-k*a) + exp(-k*b)) / k   (wykladnicza)
  lub:
  h = clamp(0.5 + 0.5*(b-a)/k, 0.0, 1.0)           (wielomianowa)
  smin(a, b, k) = mix(b, a, h) - k*h*(1-h)

Estymacja normalnej (roznice centralne):
  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)
  ))

Cieniowanie Phonga:
  I = k_a * I_a + k_d * I_d * max(dot(n, L), 0) + k_s * I_s * max(dot(r, v), 0)^alpha

Funkcja smooth-min to sekretny składnik, który sprawia, że SDF-y dają się komponować w ciekawy sposób. Zamiast twardej sumy (branie minimum dwóch SDF-ów, co tworzy ostry szew), smooth-min łączy dwie powierzchnie na obszarze kontrolowanym parametrem k. Niskie k daje ostrą sumę; wysokie k daje gładkie, bryłowate połączenie, jakby oba kształty były z gliny i zostały ściśnięte razem.

Estymacja normalnej metodą różnic centralnych oznacza, że nigdy nie trzeba wyprowadzać gradientu analitycznie — sam SDF mówi Ci o orientacji powierzchni. Dlatego nawet egzotyczne, ręcznie zbudowane SDF-y automatycznie otrzymują poprawne cieniowanie, miękkie cienie i ambient occlusion za darmo, po prostu poprzez odpytywanie tego samego SDF-u z pobliskich punktów.

Symulacja działa w całości w shaderze fragmentów GLSL — jedno wywołanie shadera na piksel, wszystko równolegle na GPU. Dodanie nowego prymitywu lub operatora mieszania wymaga zaledwie kilku linii GLSL i natychmiast pojawia się w renderze bez rekompilacji głównego kodu JavaScript. To właśnie sprawia, że ray marching SDF jest tak potężnym medium twórczym: opis sceny i renderer to jedno i to samo.

IV. Kopnięcie piłki nożnej — efekt Magnusa i zakrzywianie się piłki

Kopnięcie piłki nożnej i efekt Magnusa — trajektoria wirującej piłki

Ustaw oś wirowania, prędkość obrotową, prędkość wystrzału i kąt wzniesienia. Symuluj trajektorię w 3D wraz z murem obrońców w odległości 9,15 m. Pokazuje podział sił i porównanie trajektorii z przypadkiem bez rotacji.

Gdy piłka wiruje podczas lotu, efekt Magnusa pcha ją na bok — prostopadle zarówno do prędkości, jak i osi wirowania. Piłka nożna uderzona z rotacją boczną zakrzywia się wokół muru obronnego; rotacja przednia zabija odbicie piłki przy lądowaniu; rotacja tylna pozwala piłce zwodniczo unosić się, zanim gwałtownie opadnie. Każde zakrzywione uderzenie z rzutu wolnego i „bananowy" strzał to żywa demonstracja efektu Magnusa.

Siła Magnusa powstaje, ponieważ rotacja przeciąga warstwę graniczną powietrza wokół piłki, przyspieszając ją po jednej stronie i spowalniając po drugiej. Zgodnie z zasadą Bernoulliego (a dokładniej, z zasadą zachowania pędu w odchylonym przepływie powietrza), strona poruszająca się szybciej ma niższe ciśnienie, a różnica ciśnień tworzy siłę netto prostopadłą do wektora prędkości. Wielkość zależy od prędkości obrotowej ω, promienia piłki r i prędkości v.

F_Magnus = C_L * rho * pi * r^2 * |v x omega| / |omega|
  C_L    : wspolczynnik nosnosci (~0.25 dla pilki noznej przy typowych predkosciach obrotowych)
  rho    : gestosc powietrza (1.225 kg/m^3 na poziomie morza)
  r      : promien pilki (0.11 m dla pilki rozmiaru 5)
  v      : wektor predkosci (m/s)
  omega  : wektor predkosci katowej (rad/s)

Kierunek: F_Magnus jest rownolegly do (omega x v)

Sila oporu (dla porownania):
  F_opor = 0.5 * C_D * rho * A * v^2
  C_D    : wspolczynnik oporu (~0.25 dla gladkiej kuli, ~0.4 dla pilki noznej)
  A      : powierzchnia przekroju = pi * r^2

Rownania ruchu (calkowanie Eulera):
  a = (F_opor + F_Magnus + F_grawitacji) / m
  v += a * dt
  x += v * dt

Symulacja całkuje trzy siły — opór, grawitację i Magnusa — metodą Eulera o stałym kroku czasowym dt = 1 ms, na tyle małym, że trajektoria jest dokładna z dokładnością do centymetra na dystansie 30 m rzutu wolnego. Mur obrońców w odległości 9,15 m (regulaminowa odległość FIFA) pokazany jest w przekroju, więc widać, jak dobrze uderzona piłka zakrzywia się nad murem i wraca w dół do bramki.

Przy profesjonalnych prędkościach rzutu wolnego (25–30 m/s) i prędkościach obrotowych (8–10 obr/s) siła Magnusa może odchylić piłkę o 3–5 m w bok na dystansie 25 m lotu, dlatego specjaliści od rzutów wolnych spędzają tysiące godzin, ucząc się odtwarzać dokładny punkt kontaktu stopy z piłką i łuk zamachu potrzebny do nadania właściwego wektora rotacji. Symulacja czyni tę wrażliwość widoczną: 10% zmiana prędkości obrotowej daje wyraźnie inną trajektorię.

Efekt „knuckleball" — nieprzewidywalne kołysanie się piłki przy niemal zerowej rotacji — jest przeciwieństwem efektu Magnusa. Bez asymetrii warstwy granicznej, drobne niedoskonałości powierzchni i orientacja szwów sprawiają, że turbulentne oderwanie przepływu losowo przełącza strony, wywołując nieregularne siły boczne, których nawet bramkarz nie może przewidzieć. Symulacja zawiera tryb zerowej rotacji, by to zademonstrować.

← Spotlight #64: Kwanty, Nanotechnologia i AI Wszystkie wpisy →