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ć.