Preskoči na sadržaj
FORTRONIQ
IzbornikDigitalni sadržajiVirtualna stvarnost3. Razvoj okruženja virtualne stvarnosti3.3 Hardverski segmenti u sceni: kamera, kontroleri i ruke

MODUL 3 · RAZVOJ OKRUŽENJA VIRTUALNE STVARNOSTI

Nastavna jedinica 3.3

Hardverski segmenti u sceni: kamera, kontroleri i ruke

Korisnik u sceni postoji kroz tri praćena dijela: glavu i dvije ruke. Ova jedinica pokazuje kako se u razvojnom okruženju slažu kamera na visini očiju, komponente kontrolera pokreta, ulazne akcije i modeli ruku koji se savijaju prema pritisnutim tipkama.

Moći ću:
  • složiti hijerarhiju VR pijuna s ishodištem, kamerom i dva kontrolera pokreta
  • postaviti ishodište praćenja tako da visinu očiju daje uređaj
  • razlikovati pozu hvata i pozu ciljanja kontrolera
  • definirati ulazne akcije i kontekst mapiranja za dva kontrolera
  • povezati modele ruku s vrijednostima okidača i hvatišta preko stanja i miješanja poza
  • objasniti razlike između rada s kontrolerima i praćenja ruku
  • izračunati vrijeme izglađivanja animacije prstiju i pomak ruke po okviru

VR pijun i njegova hijerarhija

U VR aplikaciji korisnik je predstavljen jednim objektom koji se u okruženju s nacrtima (npr. Unreal Engine) zove pijun (engl. pawn), a u okruženju s C# skriptama (npr. Unity) najčešće XR rig ili ishodište XR-a. Taj objekt nosi sve što je praćeno: glavu kao kameru i ruke kao kontrolere pokreta. Predložak VR projekta iz jedinice 3.1 donosi gotov pijun; ovdje se objašnjava kako je složen, da ga možete prilagoditi laboratoriju VR-1.

Ključ je hijerarhija (engl. hierarchy): položaji djece zadaju se u odnosu na roditelja. Na vrhu je korijen pijuna, ispod njega ishodište VR prostora koje odgovara sredini stvarnog prostora za igru na podu. Kamera i kontroleri su djeca tog ishodišta i pokretač im svaki okvir upisuje položaj i orijentaciju u odnosu na njega. Kad se pijun teleportira (jedinica 3.5), pomiče se korijen, a glava i ruke ostaju na istom mjestu u odnosu na tijelo korisnika.

BP_VRPijun Ishodište (pod) Kamera Kontroler L Kontroler D SK_Ruka_L, točka hvata zraka, sfera hvata SK_Ruka_D, točka hvata, zraka pod visina očiju daje praćenje ishodište
Slika 3.3.1 — Hijerarhija VR pijuna. Kamera i kontroleri su djeca ishodišta na podu; njihove položaje svaki okvir upisuje pokretač.

Uz kontroler se u hijerarhiji nalaze model ruke (skeletna mreža), točka hvata (engl. attach point) na koju se pričvršćuje uhvaćeni predmet, mala sfera za otkrivanje predmeta u dohvatu i zraka za daljinsko ciljanje. Sve se to pomiče zajedno s kontrolerom jer je njegovo dijete.

Kamera na visini očiju

Kod praćenja sa šest stupnjeva slobode (6DoF) kameru ne postavljate vi, nego uređaj. Pokretač zna gdje je pod (uređaj A iz kalibracije prostora pri postavljanju baznih stanica, uređaj B iz slika svojih kamera) i daje položaj glave iznad njega. Zato se ishodište praćenja (engl. tracking origin) postavlja na razinu poda, a kamera u pijunu stoji na visini nula u odnosu na ishodište. Visinu očiju tada daje stvarna visina korisnika: viša osoba vidi stol odozgo, niža bliže.

Druga mogućnost je ishodište na razini očiju, gdje se u trenutku pokretanja trenutačni položaj glave proglasi nulom. To odgovara sjedećim aplikacijama, ali za laboratorij u kojem korisnik stoji uz stol visine 750 mm i spušta ruke do njegove plohe razina poda je ispravan izbor. U okruženjima se ta postavka zove različito (npr. razina praćenja pod ili oči, vrsta prostora); funkcija je uvijek ista.

Pažnja

Najčešća greška: kameri se ručno doda pomak od, recimo, 1,7 m „da bude na visini očiju", a ishodište je već na podu. Korisnik tada gleda s 3,4 m i stol mu se čini kao igračka. Druga greška je pomicanje ili okretanje kamere kodom bez pokreta glave — to je najbrži put do kinetoze (jedinica 2.3).

Ostale postavke kamere: bliža ravnina odsijecanja (engl. near clip plane) treba biti mala, nekoliko centimetara, jer korisnik prinosi dijelove robota blizu lica da ih pogleda; prevelika vrijednost „odreže" predmet ispred očiju. Vidno polje kamere ne mijenjate — njega određuju optika i pokretač. Za inačicu bez naočala kamera se postavlja na stalnu visinu, npr. 1,6 m, i okreće mišem; tu je ručna visina opravdana jer nema praćenja.

Kontroleri pokreta i njihove poze

Komponenta kontrolera pokreta (engl. motion controller component) je komponenta kojoj se zada izvor (lijevi ili desni kontroler, u nekim okruženjima i ruka ili drugi praćeni uređaj). Svaki okvir od pokretača dobije pozu — položaj i orijentaciju — i primijeni je na sebe i svoju djecu. Pokretač poze daje predviđene za trenutak kad će slika stići na zaslon, što je dio borbe protiv kašnjenja od pokreta do fotona.

OpenXR za svaki kontroler daje dvije glavne poze:

  • poza hvata (engl. grip pose) — u sredini šake koja drži kontroler; na nju se postavlja model ruke i točka hvata;
  • poza ciljanja (engl. aim pose) — ishodište i smjer zrake, obično od vrha kontrolera prema naprijed; iz nje kreće zraka za točke interesa i luk teleporta.

Ako se zraka crta iz poze hvata, pokazuje ukoso prema dolje i korisnik ne pogađa ono što gleda. Ako se ruka stavi na pozu ciljanja, model „visi" ispred šake. Zato se u okruženju izaberu dvije komponente ili dva izvora za istu ruku, ili se pomak između njih zada ručno; kako se točno odabire, ovisi o inačici.

Model kontrolera se može prikazati kao stvarni uređaj (pokretač ga ponekad može dati sam) ili se zamijeniti modelom ruke. Za VR-1, gdje se dijelovi uzimaju rukom, bolja je ruka; model kontrolera korisno je prikazati u uvodnom dijelu, dok korisnik uči gdje su tipke.

Ulazne akcije i kontekst mapiranja

Logika ne treba znati koja je fizička tipka pritisnuta, nego što korisnik želi učiniti. Zato se definiraju ulazne akcije (engl. input actions) — „Uhvati lijevo", „Odaberi", „Teleport" — a zasebno se odredi koja ih tipka pokreće. Skup tih vezanja zove se u okruženju s nacrtima kontekst mapiranja ulaza (engl. input mapping context); u okruženju s C# skriptama to je datoteka s akcijama i vezanjima za XR uređaje. OpenXR isto načelo ima u samom standardu: aplikacija predlaže vezanja za pojedini profil interakcije, a pokretač ih može prilagoditi.

Akcija (VR-1)Vrsta vrijednostiPrimjer vezanjaNamjena
IA_Uhvati_L / _Ddecimalna 0–1hvatište (bočna tipka)hvatanje dijela, savijanje prstiju
IA_Okidac_L / _Ddecimalna 0–1okidač pod kažiprstomodabir točke interesa, savijanje kažiprsta
IA_Teleport2D ospalčana palica lijevo, naprijedluk teleporta (jedinica 3.5)
IA_Okret2D ospalčana palica desno, lijevo i desnookretanje u koracima od 30°
IA_Izborniklogičkatipka izbornika lijevopauza, ispočetka
IA_DodirPalcalogičkadodir palca na palici ili tipkiispružen ili spušten palac na modelu ruke

Kontekst mapiranja može se mijenjati tijekom rada: dok korisnik drži dio, palica može služiti za okretanje dijela umjesto za teleport. Tada se doda drugi kontekst s višim prioritetom i ukloni kad se dio pusti. Tako logika hvatanja i kretanja ostaje odvojena.

Zapamtite

Decimalne akcije (okidač, hvatište) daju vrijednost od 0 do 1. Za odluku „uhvaćeno ili ne" koristite dva praga s razmakom, npr. uhvati iznad 0,6 i pusti ispod 0,4 (histereza). S jednim pragom predmet treperi između uhvaćenog i puštenog kad je prst točno na pragu.

Modeli ruku i stanja ruke

Model ruke je skeletna mreža (engl. skeletal mesh): mreža trokuta vezana na kostur od zapešća, šake i po tri članka svakog prsta. Prsti se ne animiraju ručno za svaki okvir, nego se unaprijed pripreme nekoliko poza (otvorena šaka, savijen kažiprst, šaka, ispružen kažiprst) i miješaju se prema vrijednostima s kontrolera.

Uobičajeno je dvodimenzionalno miješanje (engl. blend space): jedna os je vrijednost okidača i upravlja kažiprstom, druga je vrijednost hvatišta i upravlja ostalim prstima. U kutovima su četiri poze, a između njih okruženje interpolira. Palac se spušta ili podiže prema tome dodiruje li korisnik palicu ili tipku.

otvorena kažiprst savijen pokazivanje šaka okidač 0,3 hvatište 0,8 okidač 0 → 1 01 hvatište 0 → 1 trenutačna poza = mješavina četiri poze iz kutova
Slika 3.3.2 — Miješanje poza ruke: okidač savija kažiprst, hvatište ostale prste. Točka pokazuje trenutačne vrijednosti s kontrolera.

Nad miješanjem se često dodaju stanja ruke (engl. state machine): slobodna ruka koja prati tipke, ruka koja drži predmet i ima prilagođenu pozu za taj predmet (npr. prsti oko kotača Ø65 mm), te ruka koja pokazuje zrakom. Prijelaz iz stanja u stanje pokreće logika hvatanja iz jedinice 3.4.

Animacija prema tipkama

Vrijednosti okidača i hvatišta stižu svaki okvir, ali mogu malo skakati. Ako se izravno prenesu na prste, ruka podrhtava. Zato se vrijednost za animaciju izglađuje: u svakom okviru pomakne se samo dio puta prema novoj vrijednosti.

a = 1 − e−k · Δt  ·  vnovo = v + a · (cilj − v)

Ovdje je k konstanta izglađivanja u 1/s, a Δt vrijeme okvira. Oblik s eksponencijalnom funkcijom daje isto ponašanje pri 72, 90 i 120 Hz, dok stalan udio po okviru (npr. uvijek 0,2) daje brže prste na većoj frekvenciji.

Postupak u okruženju s nacrtima: u nacrtu pijuna vrijednosti akcija okidača i hvatišta spremite u varijable; u animacijskom nacrtu ruke (engl. animation blueprint) svaki okvir pročitajte te varijable, izgladite ih i predajte miješanju poza. Lijeva ruka je obično zrcalna kopija desne s istim nacrtom i drugim izvorom. U okruženju s C# skriptama ista se logika piše kao skripta koja čita vrijednosti akcija i postavlja parametre animatora ruke.

Pažnja

Izglađuje se samo animacija prstiju. Poza ruke i glave nikad se ne izglađuje u aplikaciji: svako izglađivanje poze dodaje kašnjenje i ruka „kasni" za stvarnom rukom (računski odjeljak).

Praćenje ruku bez kontrolera

Uređaj B iz slika svojih kamera može pratiti ruke bez kontrolera. OpenXR za to ima proširenje koje za svaku ruku daje položaje 26 zglobova (dlan, zapešće i zglobovi prstiju). Tada se model ruke ne animira miješanjem poza, nego se kosti izravno postave u izmjerene položaje.

Umjesto tipki koriste se geste: prstohvat (engl. pinch) — dodir vrha palca i kažiprsta — za odabir, šaka za hvatanje, dodir prstom (engl. poke) za gumbe na panelu. Prstohvat se prepoznaje po udaljenosti vrhova dvaju prstiju i ponovno treba histerezu.

KontroleriPraćenje ruku
Preciznost i stabilnostvisoka, i izvan vidnog poljamanja; gubi se kad ruka izađe iz vidnog polja kamera ili je zaklonjena
Povratna informacijatipke, vibracijanema opipa; potrebni vidljivi i zvučni znakovi
Prirodnosttreba naučiti tipkeprirodni pokreti, brz početak rada
Za VR-1zadani načinizborno, uz veće kolizijske oblike malih dijelova

Dobra praksa je da aplikacija podržava prijelaz: kad korisnik odloži kontrolere, pijun prebaci izvor na praćene ruke, a logika hvatanja i točaka interesa ostaje ista jer čeka akcije „uhvati" i „odaberi", ne konkretnu tipku.

Računski prikaz: izglađivanje prstiju i pomak ruke

Kalkulator računa koliki se udio puta prijeđe u jednom okviru, koliko okvira i milisekundi treba da animacija prstiju dosegne zadani postotak nove vrijednosti te koliko se ruka pomakne u jednom okviru pri zadanoj brzini.

n = ⌈ ln(1 − p) / ln(1 − a) ⌉  ·  t = n · 1000 / f  ·  sokvir = vruke · 1000 / f

Izglađivanje animacije prstijuRačunski prikaz

Računa udio puta po okviru, broj okvira i vrijeme do zadanog postotka nove vrijednosti te pomak ruke u jednom okviru.

Udio puta u jednom okviru—
Broj okvira do cilja—
Vrijeme do cilja—
Pomak ruke u jednom okviru—

Uz k = 20 1/s i 90 Hz u svakom se okviru prijeđe oko 20 % preostalog puta, a 95 % nove vrijednosti dosegne se za 14 okvira, oko 156 ms. Za prste to je prirodno i uklanja podrhtavanje. Pri brzini ruke od 1 m/s ruka se u jednom okviru pomakne 11,1 mm. Kad bi se isto izglađivanje primijenilo na pozu ruke, model bi pri stalnoj brzini od 1 m/s zaostajao za stvarnom rukom oko 45 mm (približno v / k = 1 / 20 m = 50 mm) — zato poze ostaju neizglađene, a kašnjenje se smanjuje predviđanjem u pokretaču.

Ključni pojmovi

PojamZnačenje
pijun (engl. pawn, XR rig)objekt koji u sceni predstavlja korisnika s glavom i rukama
ishodište praćenja (engl. tracking origin)referentna točka praćenja, za stajanje na razini poda
komponenta kontrolera pokreta (engl. motion controller component)komponenta koja svaki okvir preuzima pozu kontrolera od pokretača
poza hvata (engl. grip pose)položaj i orijentacija sredine šake koja drži kontroler
poza ciljanja (engl. aim pose)ishodište i smjer zrake za ciljanje
ulazna akcija (engl. input action)namjera korisnika neovisna o fizičkoj tipki
kontekst mapiranja (engl. input mapping context)skup vezanja akcija na tipke koji se može uključiti i isključiti
skeletna mreža (engl. skeletal mesh)mreža vezana na kostur, npr. model ruke s prstima
miješanje poza (engl. blend space)interpolacija između unaprijed pripremljenih poza prema ulaznim vrijednostima

Provjeri se

Kratka provjera prije prelaska na sljedeću jedinicu. Odgovor se potvrđuje klikom, a obrazloženje se prikazuje odmah.

Pitanje 1 od 4

Ishodište praćenja je na razini poda, a kameri je ručno dodan pomak od 1,7 m po visini. Što korisnik vidi?

Uređaj već daje visinu glave iznad poda; dodatni pomak zbraja se s njom i korisnik gleda s dvostruke visine.

Pitanje 2 od 4

Iz koje poze kontrolera treba crtati zraku za odabir točaka interesa?

Poza ciljanja daje ishodište i smjer zrake od vrha kontrolera prema naprijed; poza hvata je u sredini šake i usmjerena ukoso.

Pitanje 3 od 4

Zašto se ulazne akcije definiraju odvojeno od fizičkih tipki?

Logika čeka akciju poput Uhvati, a kontekst mapiranja određuje koja je tipka pokreće; isto vrijedi i za prijelaz na praćenje ruku.

Pitanje 4 od 4

Pri 90 Hz i brzini ruke 1,0 m/s koliko se ruka pomakne u jednom okviru?

Vrijeme okvira je 1/90 s; 1,0 m/s · 1/90 s = 0,0111 m = 11,1 mm.

Odgovoreno 0 od 4.

Vježbe uz jedinicu

Gradivo ove jedinice priprema za sljedeće vježbe: