Preskoči na sadržaj
FORTRONIQ
IzbornikDigitalni sadržajiVirtualna stvarnost3. Razvoj okruženja virtualne stvarnosti3.4 Interakcija: hvatanje, puštanje i točke interesa

MODUL 3 · RAZVOJ OKRUŽENJA VIRTUALNE STVARNOSTI

Nastavna jedinica 3.4

Interakcija: hvatanje, puštanje i točke interesa

Interakcija je razlog zašto je laboratorij VR-1 u virtualnoj stvarnosti, a ne na zaslonu: dijelovi robota uzimaju se rukom, prebacuju iz ruke u ruku i postavljaju na mjesto, a točke interesa otkrivaju što koji dio radi. Jedinica pokazuje tok hvatanja i puštanja te načelo jedne logike točke interesa za sve ulaze — od miša do dodira prstom.

Moći ću:
  • razlikovati izravnu i daljinsku interakciju te ulogu onoga tko djeluje i predmeta na koji se djeluje
  • izvesti tok hvatanja i puštanja s histerezom, pričvršćivanjem i predajom brzine
  • rasporediti funkcije na okidač, hvatište i dodirnu podlogu kontrolera
  • ostvariti prebacivanje predmeta iz ruke u ruku bez pada i postavljanje na ciljno mjesto
  • izraditi točku interesa s jednom logikom za lebdenje i odabir koju pozivaju različiti ulazi
  • povezati odabir točke interesa s porukom prema simulaciji robota
  • izračunati kutnu veličinu mete i pomak zrake zbog podrhtavanja ruke

Tko djeluje i na što

Svaka interakcija ima dvije strane. Na jednoj je ono što djeluje (engl. interactor): ruka, zraka iz kontrolera, pogled, vrh prsta, pokazivač miša. Na drugoj je predmet na koji se djeluje (engl. interactable): kotač koji se može uhvatiti, gumb na panelu, točka interesa na motoru. Razdvajanje tih dviju strana je temelj urednog projekta: kotač ne mora znati kojom ga je rukom korisnik uhvatio, a ruka ne mora znati je li u njoj kotač ili baterija.

U laboratoriju VR-1 koriste se dvije vrste interakcije:

  • izravna (engl. direct, near) — predmet u dohvatu ruke, do 0,8 m od korisnika, uzima se rukom kao u stvarnosti;
  • daljinska (engl. distance, ray) — zraka iz kontrolera doseže do 3 m; služi za točke interesa, panele i dijelove koji su pali na drugi kraj stola.

Obje vrste koriste iste akcije iz jedinice 3.3 (Uhvati, Odaberi), samo je način pronalaženja predmeta drukčiji: za izravnu se traži preklapanje male sfere na ruci s kolizijskim oblikom predmeta, a za daljinsku presjek zrake s kolizijskim oblikom (engl. line trace, raycast). Bez kolizijskog oblika predmet se ne može ni uhvatiti ni odabrati — to je prva stvar koju treba provjeriti kad „ništa ne reagira".

U okruženju s nacrtima (npr. Unreal Engine) predložak VR projekta obično donosi komponentu za hvatanje koja se dodaje predmetu i logiku u pijunu koja traži najbliži takav predmet. U okruženju s C# skriptama (npr. Unity s paketom za XR interakciju) postoje gotove komponente za obje strane: na ruke se stavljaju komponente za izravnu interakciju i zraku, a na predmet komponenta predmeta koji se može uhvatiti. Nazivi i mogućnosti tih komponenti razlikuju se po inačici.

Tok hvatanja i puštanja

Hvatanje izgleda jednostavno, ali ima nekoliko koraka koji se moraju dogoditi točno ovim redom. Slika 3.4.1 prikazuje tok za jedan dio robota.

Preklapanjesfera hvata Najbližidio u dosegu Hvat > 0,6?pritisak Pričvrstibez fizike Hvat < 0,4?puštanje Blizu cilja?15 mm, 10° Na ciljDio postavljen Otpustifizika, brzina da da da ne ne: čekaj ne: drži druga ruka uhvati = prebacivanje
Slika 3.4.1 — Tok hvatanja i puštanja dijela robota. Pragovi 0,6 i 0,4 daju histerezu, a tolerancija cilja uzeta je iz jedinice 3.2.
  1. Otkrivanje. Sfera na ruci (u primjeru VR-1 polumjera 12 cm, kao u vježbi V11) prijavljuje sve predmete s kojima se preklapa. Ako ih je više, bira se najbliži središtu sfere. Dobra praksa je istaknuti predmet koji bi bio uhvaćen, da korisnik zna što će uzeti.
  2. Hvatanje. Kad vrijednost hvatišta prijeđe 0,6, predmet se pričvrsti na točku hvata ruke, a njegova se fizika isključi da ga gravitacija i sudari ne otimaju iz ruke. Pritom se bira način: predmet zadrži položaj u kojem je uhvaćen (prirodnije za velike dijelove poput šasije) ili se priljubi na unaprijed zadanu točku hvata (bolje za alate i dijelove s jasnim hvatištem).
  3. Držanje. Predmet se svaki okvir kreće s rukom. Kratka vibracija kontrolera pri hvatanju potvrđuje da je predmet uhvaćen.
  4. Puštanje. Kad hvatište padne ispod 0,4, predmet se odvoji. Ako je blizu ciljnog mjesta na šasiji, postavlja se na cilj i objavljuje se događaj „Dio postavljen" (jedinica 3.2). Inače se uključi fizika i predmetu se preda brzina ruke, izračunata kao prosjek zadnjih nekoliko okvira, da ga korisnik može i baciti.

Pažnja

Kad se predmet pusti s isključenom predajom brzine, „zaleđuje" se u zraku ili pada okomito, što korisnik doživljava kao grešku. Kad se preda brzina samo zadnjeg okvira, bacanje je nepredvidljivo jer je zadnji okvir često trzaj pri otvaranju šake. Prosjek nekoliko okvira je stabilniji.

Okidač, hvatište i dodirna podloga

Kontroleri imaju slične tipke, ali ne i isti raspored. Zato se funkcije dodjeljuju ulaznim akcijama, a akcije tipkama. Za VR-1 dogovoren je raspored koji prati prirodni pokret ruke:

Element kontroleraPokretFunkcija u VR-1
hvatište (engl. grip)stiskanje srednjeg, prstenjaka i malog prstauhvati i drži dio; pusti otvaranjem šake
okidač (engl. trigger)savijanje kažiprstaodabir točke interesa ili gumba na panelu; u ruci s alatom njegovo djelovanje
dodirna podloga ili palčana palica (engl. touchpad, thumbstick)palacteleport i okretanje (jedinica 3.5); dok se drži dio, okretanje dijela
tipke uz palacpritisak palcemprikaz ili skrivanje panela, vraćanje dijela na početno mjesto

Kod kontrolera s dodirnom podlogom umjesto palice, podloga se dijeli na područja (npr. gornji dio za teleport, lijevi i desni za okret) ili se razlikuje dodir od pritiska. Takvo vezanje obavlja se u kontekstu mapiranja za taj profil interakcije, a logika hvatanja ostaje nepromijenjena.

Dobra praksa: istu funkciju ne stavljati na dva elementa i ne mijenjati značenje tipke bez vidljivog znaka. Ako okidač u jednom trenutku odabire, a u drugom baca, korisnik će griješiti.

Prebacivanje iz ruke u ruku i postavljanje na cilj

Pri sklapanju robota korisnik često drži šasiju lijevom rukom, a desnom stavlja motor. Ponekad želi i predati dio iz jedne ruke u drugu. Pravilo koje to omogućuje je jednostavno: svaki predmet ima najviše jednog vlasnika. Predmet pamti koja ga ruka drži. Kad ga druga ruka uhvati, predmet najprije obavijesti prvu ruku da ga je izgubila, a zatim se pričvrsti na drugu. Između tih dvaju koraka fizika se ne uključuje, pa predmet ne padne.

Alternativa je dvoručno hvatanje, kod kojeg obje ruke drže isti predmet i zajedno određuju njegov položaj i orijentaciju. Za dijelove robota MR-1 (najveći je šasija 220 × 180 mm) to nije potrebno; za duge predmete poput cijevi ili letve jest.

Postavljanje na cilj (engl. snap, socket) je završni korak sklapanja. Na šasiji su nevidljiva ciljna mjesta za motore, kotače, bateriju i ostale dijelove. Kad korisnik pusti dio unutar tolerancije, dio se glatko privuče na točan položaj, a na mjestu cilja se prije toga može prikazati prozirna „sjena" dijela kao vodilica. Ako je redoslijed važan (npr. poklopac tek nakon pločice), ciljno mjesto poklopca aktivira se tek kad je pločica postavljena.

Primjer iz ispitivanja VR-1

Jedan od dvaju palih testnih slučajeva bio je hvatanje prekidača ispod ruba stola. Tipični uzroci takve greške, koje treba provjeriti redom: kolizijski oblik stola veći je od vidljive ploče pa sfera hvata ili zraka najprije pogađa stol; kolizijski oblik malog dijela premalen je za pouzdano otkrivanje; pri odabiru najbližeg statični objekt ima jednaku prednost kao dio. Odgovarajuća rješenja su kolizijski oblik stola prilagođen stvarnoj ploči, kolizijski oblik za hvatanje malih dijelova veći od njihove vidljive mreže i prednost dijelova pred statičnim objektima.

Točke interesa: jedna logika, više ulaza

Točka interesa (engl. point of interest, POI) je mjesto na modelu koje reagira na pozornost korisnika: kad je pokazivač iznad nje, istakne se i prikaže natpis; kad je odabrana, otvori se panel s objašnjenjem, pusti animacija ili se pošalje naredba. VR-1 ima šest točaka interesa: motor, kotač, bateriju, upravljačku pločicu, senzor udaljenosti i prekidač.

Ključno načelo: točka interesa ne zna ništa o ulazu. Ona je jedna komponenta s tri javne funkcije — HoverEnter (pokazivač je ušao), HoverExit (pokazivač je izašao) i Select (odabir). Miš, pogled, zraka kontrolera, zraka iz ruke i dodir prstom samo su različiti ulazi koji na pogođenoj točki pozivaju te iste tri funkcije.

Miš Pogled Kontroler Zraka iz ruke Dodir prstom Točka interesa HoverEnter()HoverExit()Select() brojač lebdenja Isticanje Natpis Panel Simulator ulazi: zamjenjivi jedna logika izlazi
Slika 3.4.2 — Točka interesa kao jedna komponenta: svi ulazi pozivaju iste tri funkcije, a točka sama odlučuje što istaknuti, prikazati ili poslati.

Nekoliko pravila čini logiku otpornom:

  • brojač lebdenja — više ulaza može istodobno biti na istoj točki (obje ruke, zraka i pogled). Točka broji ulaske i izlaske i gasi isticanje tek kad brojač padne na nulu;
  • jedan otvoren panel — odabir nove točke zatvara panel prethodne;
  • panel okrenut korisniku — natpis i panel svaki se okvir okreću prema kameri, ali samo oko okomite osi, da se tekst ne naginje;
  • globalna obavijest — pri odabiru točka objavi događaj sa svojom oznakom (npr. POI_motor) na koji se može prijaviti bilo tko, pa i most prema simulaciji robota.

Oznake točaka interesa dobro je postaviti već u programu za slobodno modeliranje (npr. Blender) kao prazne objekte s jasnim imenima (POI_motor, POI_senzor). Pri izvozu u glTF ili FBX oni dolaze u razvojno okruženje kao prazni objekti na točnim položajima, pa se komponenta točke interesa samo doda na njih, uz kolizijski oblik.

Ulazi: najprije miš, zatim XR

Preporučeni redoslijed rada je: najprije inačica za računalo s mišem, dok logika točaka interesa ne radi besprijekorno, a tek onda XR ulazi. Tako se logika razvija i ispituje bez naočala, više polaznika može raditi istodobno, a kad se doda XR, jedina nova stvar je ulaz — ne i logika. Ulaz mišem je zraka iz kamere kroz položaj pokazivača na zaslonu; ona pogodi kolizijski oblik, a skripta na pogođenom objektu pozove funkcije točke interesa.

Primjer u C# skriptama: jezgra točke interesa i ulaz mišem. Kratki vlastiti primjer za razumijevanje, nije ispitan; provjerite ga u vlastitoj inačici okruženja. Položaj miša ovdje se čita starijim sustavom ulaza; u novijem sustavu ulaza čita se drugačije. Svaka klasa ide u vlastitu datoteku istog imena (TockaInteresa.cs, MisPokazivac.cs).

using UnityEngine;

public class TockaInteresa : MonoBehaviour
{
    public string oznaka = "POI_motor";
    public GameObject natpis, panel;
    public static event System.Action<TockaInteresa> Odabrana;
    int lebdenja = 0;

    public void HoverEnter() { if (++lebdenja == 1 && natpis) natpis.SetActive(true); }
    public void HoverExit()  { lebdenja = Mathf.Max(0, lebdenja - 1);
                               if (lebdenja == 0 && natpis) natpis.SetActive(false); }
    public void Select()     { if (panel) panel.SetActive(!panel.activeSelf); Odabrana?.Invoke(this); }
}

// --- MisPokazivac.cs (također počinje s using UnityEngine;) ---
public class MisPokazivac : MonoBehaviour
{
    public Camera kamera;
    TockaInteresa trenutna;

    void Update()
    {
        TockaInteresa pogodak = null;
        Ray zraka = kamera.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(zraka, out RaycastHit hit, 10f))
            pogodak = hit.collider.GetComponentInParent<TockaInteresa>();
        if (pogodak != trenutna)
        {
            if (trenutna) trenutna.HoverExit();
            trenutna = pogodak;
            if (trenutna) trenutna.HoverEnter();
        }
        if (trenutna && Input.GetMouseButtonDown(0)) trenutna.Select();
    }
}

Za XR se ne mijenja jezgra. U paketu za XR interakciju postoji jednostavan interaktivni objekt koji objavljuje događaje ulaska lebdenja, izlaska lebdenja i početka odabira; oni se u inspektoru ili kratkom skriptom-mostom spoje na HoverEnter, HoverExit i Select. Nakon toga točku okidaju zraka kontrolera s okidačem, zraka iz ruke s prstohvatom, dodir prstom i pogled. Kod pogleda odabir se radi zadržavanjem pogleda (engl. dwell), obično oko jedne sekunde uz vidljiv kružni pokazatelj, ili pogledom uz gestu. Točno trajanje odredite probom s korisnicima.

U okruženju s nacrtima isto se postiže sučeljem (jedinica 3.2), npr. BPI_TockaInteresa s tri funkcije. Svaki ulaz — trag zrake iz kamere za miš, iz poze ciljanja za kontroler, iz sredine kamere za pogled — na pogođenom objektu provjeri ostvaruje li sučelje i pozove njegovu funkciju.

Veza sa simulacijom robota. Kad je točka odabrana, globalni događaj nosi njezinu oznaku. Mala komponenta-most prijavi se na taj događaj i pošalje poruku programu za simulaciju robota (npr. „POI_motor" ili „kreni na točku 3"), a simulator vraća kutove zglobova ili stanje po kojem se model u sceni pomakne. Most se izvodi u jedinici 3.6; ovdje je važno samo da ga točka interesa ne treba poznavati.

Računski prikaz: veličina mete i podrhtavanje zrake

Zraka iz ruke nikad nije potpuno mirna. Mali kutni nemir ruke na većoj udaljenosti postaje velik pomak točke na meti. Kutna veličina mete promjera D na udaljenosti L i pomak točke zrake zbog kutnog podrhtavanja φ računaju se ovako:

α = 2 · arctg(D / 2L)  ·  npx = α · PPD  ·  s = L · tg φ

Kutna veličina mete i podrhtavanje zrakeRačunski prikaz

Računa koliko je velika meta u stupnjevima i pikselima te koliko se točka zrake pomiče na meti zbog kutnog podrhtavanja ruke.

Kutna veličina mete—
Promjer mete na zaslonu—
Pomak točke zrake na meti—
Omjer polumjera mete i pomaka—

Za kolizijski oblik točke interesa promjera 60 mm na granici dosega zrake od 3 m meta zauzima 1,15°, odnosno oko 24 piksela na uređaju A (21 piksel po stupnju). Uz pretpostavljeno podrhtavanje od 0,5° točka zrake se pomiče oko 26 mm — gotovo koliko i polumjer mete od 30 mm, pa korisnik „promašuje" metu koju jasno vidi. Na 1,5 m isti oblik ima dvostruku rezervu, a na 0,8 m više od četverostruke. Zaključak za VR-1: kolizijski oblici točaka interesa smiju biti veći od vidljivog dijela, a za daleke mete zraku treba blago izgladiti ili meti dati „magnetizam". Vrijednost podrhtavanja od 0,5° je pretpostavka za primjer; stvarnu izmjerite na svojim korisnicima.

Ključni pojmovi

PojamZnačenje
onaj koji djeluje (engl. interactor)ruka, zraka, pogled ili pokazivač koji traži predmet i djeluje na njega
predmet interakcije (engl. interactable)objekt koji se može uhvatiti, odabrati ili pritisnuti
hvatište (engl. grip)bočna tipka kontrolera koja se stišće ostalim prstima; zadana tipka za hvatanje
okidač (engl. trigger)tipka pod kažiprstom; zadana tipka za odabir
histereza (engl. hysteresis)dva različita praga za uključenje i isključenje koji sprečavaju treperenje
postavljanje na cilj (engl. snap, socket)privlačenje puštenog dijela na točan položaj u sklopu unutar tolerancije
točka interesa (engl. point of interest, POI)mjesto na modelu koje na lebdenje i odabir prikazuje informaciju ili pokreće radnju
lebdenje (engl. hover)stanje kad je pokazivač, zraka ili pogled na predmetu, prije odabira
zadržavanje pogleda (engl. dwell)odabir pogledom koji se aktivira nakon zadanog vremena gledanja u metu

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

Zašto se za hvatanje koriste dva praga hvatišta, npr. 0,6 za hvatanje i 0,4 za puštanje?

Histereza: kad vrijednost oscilira oko jednog praga, stanje bi se mijenjalo u svakom okviru; razmak između pragova to sprečava.

Pitanje 2 od 4

Druga ruka uhvati dio koji drži prva ruka. Što je ispravno ponašanje?

Svaki predmet ima najviše jednog vlasnika; predaja se radi bez uključivanja fizike pa predmet ne padne.

Pitanje 3 od 4

Što je temeljno načelo točke interesa u VR-1?

Logika je jedna; miš, pogled, kontroler, zraka iz ruke i dodir prstom samo su ulazi koji pozivaju iste funkcije.

Pitanje 4 od 4

Meta promjera 60 mm je na 3 m, a zraka podrhtava 0,5°. Koliki je približni pomak točke zrake na meti?

s = L · tg φ = 3000 mm · tg 0,5° ≈ 3000 · 0,00873 ≈ 26 mm, gotovo koliko i polumjer mete od 30 mm.

Odgovoreno 0 od 4.

Vježbe uz jedinicu

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