Traducerea a fost realizată de Pavel A. Chuvanov, participant la proiectul Atotputernic.
Cinematica este procesul de calcul al poziției în spațiu pentru sfârșitul structurii interconectate la unghiurile de rotație date ale tuturor îmbinărilor. Acest lucru este ușor de realizat dacă există o singură soluție. Cinematica inversă face contrariul. Pentru un anumit punct final, unghiurile de rotație necesare ale balamalelor sunt calculate astfel încât acest punct final să poată fi atins. În acest caz, pot apărea dificultăți dacă există multe sau infinit de multe soluții.
Acest proces este extrem de util în robotică. De exemplu, ați vrut brațul robotului să se întindă și să ia obiectul. Dacă programul cunoaște locația obiectului în raport cu articulația umerilor, atunci este suficient să se calculeze unghiurile de rotație a balamalelor pentru a ajunge la obiect. De asemenea, cinematica inversă este utilă în jocurile 3D. Luați, de exemplu, un dragon cu un gât foarte lung. Balaurul ar trebui să îndoaie realist gâtul și să arunce jucătorul în picioare pe podea. Sau jucătorul dorea să ridice un obiect de pe podea sau să apese un buton. Utilizatorul va vedea pe ecran modul în care jucătorul se va întinde și atinge obiectul, în loc să-și fluture doar mâna undeva în apropierea obiectului (cum ar fi în Alone In The Dark).
Am scris un demo mic sub DOS care ilustrează mecanismul de cinematică inversă. Imaginea de ecran arată cum șarpele încearcă să atingă un mic cub rotativ. Puteți muta ținta folosind tastatura. În demo, pentru a șarpe influența gravitației și are puțină elasticitate, astfel că va fi posibil să se miște și să găsească după gol, încercând să obțină o poziție mai confortabilă. Modelul de șarpe este situat în fișierul tail.cfg. Îl puteți rezolva pentru a crea un alt obiect.
Există multe cazuri în care structura asociată nu este capabilă să atingă obiectivul. De exemplu, nu puteți atinge o mână a încheieturii mâinii cu aceeași cotă cu cotul. Sau obțineți-l de la sol la vârful unui copac înalt.
Dacă există două soluții, atunci trebuie să existe o tehnică de alegere a soluțiilor care corespund mai mult stadiului actual al structurii.
Când se folosesc mai mult de două balamale, se întâmplă adesea că există multe soluții la problemă. Cu toate acestea, unele soluții sunt mai bune decât altele. Dacă structura dvs. reprezintă, de exemplu, mâna, atunci unele decizii sunt mai convenabile, altele sunt foarte nenaturale. Deseori există o soluție optimă.
Am ajuns la metoda cinematică inversă după o anumită gândire, încercare și eroare. Nu există nicio îndoială că există multe algoritmi pentru rezolvarea problemelor de cinematică inversă, dar aici voi descrie doar una.
Acest algoritm nu găsește imediat o soluție. Aceasta nu este o simplă funcție în care specificați destinația și obțineți colțuri. Acesta este un algoritm iterativ care face algoritmul mai realist în programe, în special în jocurile în care doriți să faceți obiectele să se miște neted.
Soluția se datorează aplicării virtuale a forței la capătul lanțului și glisarea capătului lanțului în poziția finală. Forța acționează asupra fiecărei articulații și mișcă structura puțin mai aproape de punctul final. Deci, chiar dacă nu există nici o soluție, lanțul va aborda punctul final cât mai aproape posibil. Deoarece balamalele sunt calculate separat, le puteți da proprietăți diferite, cum ar fi rigiditatea, elasticitatea etc. Fiecare dintre balamale poate avea, de asemenea, o poziție optimă pe care algoritmul va încerca să o atingă cât mai aproape posibil.
Inima cinematică în 2D
Să începem cu o balama. În acest caz, se poate roti în jurul valorii de o singură axă (direcția acelor de ceasornic ca un rezultat pozitiv pentru a alege). Vectorul R acționează în unghi drept față de os. Vectorul de forță F acționează de la punctul final în direcția țintei. Unghiul dintre R și F este a. Acum totul este destul de simplu. Viteza cu care trebuie să se rotească balama, este proporțională cu produsul scalar (produs dot) a vectorilor R și F. Menținerea punctul de vedere că produsul scalar a doi vectori este un număr pozitiv, și, desigur, îmbinarea trebuie să se rotească în direcția pozitivă, astfel încât aproape de țintă . Dacă unghiul dintre R și F este drept, articulația este rotită astfel încât osul să fie cât mai aproape posibil de țintă și, prin urmare, balamaua să nu mai se rotească. În acest moment, produsul scalar al două vectori va da zero.
Ei bine, aici suntem. Cazul este mai greu. De acum, totul va fi un fel de caz în parte. Când aveți mai mult de un os, trebuie doar să repetați algoritmul de mai sus pentru fiecare balama pe rând.
Să începem cu balama cea mai apropiată de obiectiv:
1. Calculați vectorul de forță (de la punctul final la ținta)
2. Calculăm produsul scalar al vectorului de forță și vectorul perpendicular pe os.
3. Înmulțiți produsul scalar cu un număr mic (de exemplu, 0,01)
4. Adăugați-l în colțul balamalei.
Faceți asta pentru toate balamalele în mod consecvent.
Inima cinematică în 3D
În spațiul tridimensional, calculele nu vor fi mult mai complicate. Există trei axe posibile în jurul cărora balama se poate roti. Am încercat să aplice metoda de mai sus în spațiul tridimensional, dar rezultatele nu erau foarte bune. Nu înțelegeam de ce. Cu toate acestea, această matematică funcționează cu siguranță. Există ceva care necesită un număr mare de modificări în setări, astfel încât totul să funcționeze, bineînțeles, în mod corect.
Păi, mergem mai departe.
Axa balamalei este perpendiculară pe os
În primul rând, să încercăm exemplul de mai sus, dar de data asta în 3D. Acesta este un sistem cu două balamale și vom lua mai întâi prima balama.
Dăm nume vectorilor
a - Vector de-a lungul axei balamale.
b - Vector de-a lungul osului.
r este vectorul perpendicular pe a și b.
f - vector de forță (care acționează de la punctul final până la țintă).
Dacă vectorul de forță este paralel cu a, balamaua nu se va roti. Dacă este paralel cu b, atunci trageți pur și simplu osul, balama nu se va roti. Înarmat cu postulat de date a, am decis că cuplul ar trebui să fie proporțională cu sinusul unghiului dintre o și f și sinusul unghiului dintre b ca f.
În cazul în care punctul final a ajuns la o țintă punct, nu doriți să mutați structura, dar, în cazul în care punctul final departe de țintă, pe care doriți să se deplaseze rapid structura. În consecință, cuplul trebuie să fie proporțional cu lungimea vectorului de forță.
Există un singur lucru care nu poate fi înțeles din cele de mai sus - direcția în care balama ar trebui să se rotească. Lăsați articulația să se rotească în direcția pozitivă dacă vectorul de forță este direcționat de-a lungul r și în direcția opusă dacă vectorul de forță este îndreptat față de r.
Punandu-le impreuna, primim:
= simbolul (sin, f) * SinVect (b, f) * semn (CosVect (r, f)) * Sensibilitate
În această formulă, SinVect și CosVect returnează sinusul și cosinusul unghiului dintre vectori, respectiv. Mag returnează lungimea vectorului și semnul returnează semnul numărului. Sensibilitatea este doar o constantă scalară mică.
Acum puteți trece la următoarea balama din structură. Se calculează noile valori ale vectorilor a, b, f, și se calculează balamalei de cuplu 2. Se calculează cuplul pentru toate articulațiile în structura și se adaugă la unghiul fiecărei balamale în cuplul. Punctul final ar trebui să fie acum mai aproape de țintă. În mod continuu repetarea procesului, vom fi în măsură să aducă punctul final al structurii la țintă cât mai aproape sau chiar atinge ținta.
Axa balamalei este îndreptată de-a lungul osului
Să aruncăm o privire la cazul mai dificil. Dar nu este nimic nou aici. Aici vedeți o structură asemănătoare formată din patru balamale. Totuși, balama numărul doi se poate roti în jurul axei osului său. Este ca și cum îți îndoiți încheietura mâinii. Și, bineînțeles, această balama este cea mai importantă. Ca și în cazul precedent, vectorul a va trece de-a lungul axei articulației, dar în acest caz este de-a lungul osului. Vectorul b se deplasează de la balamale la punctul final. Vectorul r este perpendicular pe ambele.
Pentru a atinge obiectivul, balamaua 2 ar trebui să se rotească la 90 de grade (vezi imaginea din dreapta).
Și se încheie cu faptul că vectorul b este diferit pentru balamalele a căror axă de rotație este paralelă cu osul.
Acum că ați stăpânit baza cinematică inversă, este totuși sarcina de a ajusta sistemul pentru a-și determina comportamentul în situații diferite. După cum am spus mai înainte, există multe soluții diferite. Unele sunt mai bune, unele mai rele. Ele diferă în modul în care arată, cantitatea de mișcare petrecută sau comoditatea.
Un șarpe adevărat pe animație reală este rar confundat de unul singur. Tind să formeze curbe destul de netede. Șarpele în demo este realizat din perechi de balamale ale axei, care sunt perpendiculare între ele. Scopul inițial scris nu era prea realist. Așa că am adăugat un pic de elasticitate în balamale. Din acest motiv, balamalele rezistă îndoirii. Cu cat le apleci mai mult, cu atat mai rezista. Efectul este astfel încât îndoirea se extinde peste balamale.
Să aruncăm o privire la dinozaur. El este foarte gras în corp, dar devine mai subțire și mai flexibil în gât. Această proprietate poate fi simulată de o structură legată, articulațiile acesteia fiind tot mai elastice până la capăt.
Preferințele membrelor se află într-o poziție convenabilă. Acest lucru se poate face prin adăugarea unui balast nou la balamale. Cu toate acestea, în acest caz ar fi mai bine să aveți un anumit număr de poziții pentru fiecare balama în care nu există rezistență. Această serie poate fi considerată convenabilă. După ce balama lasă o poziție confortabilă, va rezista mai mult și mai puternic până când refuză complet să se rotească.
De asemenea, poate fi de dorit să se mențină cât mai jos posibil. Oamenii rareori își țin mâinile pe greutate mai mult decât este necesar. Prin urmare, poziția este selectată pe baza energiei minime necesare pentru a menține poziția.