Preskoči na sadržaj
FORTRONIQ
IzbornikDigitalni sadržajiVirtualna stvarnostVježbeV12 Točke interesa: miš, pogled, kontroler i geste

VJEŽBA V12 · MODUL 3 · RAZVOJ OKRUŽENJA VIRTUALNE STVARNOSTI

Vježba V12 · 2 sata

Točke interesa: miš, pogled, kontroler i geste

Na šest dijelova robota MR-1 postavljaju se točke interesa koje se ističu, pokazuju natpis i otvaraju panel s objašnjenjem. Logika se piše jednom, u C# komponenti, a miš, pogled, kontroler i geste samo su različiti ulazi koji je pozivaju.

Moći ću:
  • izraditi komponentu točke interesa s metodama HoverEnter, HoverExit i Select
  • povezati ulaz mišem zrakom iz kamere i ispitati sve točke bez naočala
  • spojiti ulaze iz paketa za XR interakciju na istu komponentu bez promjene njezine logike
  • prevesti skripte i ispraviti pogreške u vlastitoj inačici okruženja
  • izračunati kutnu veličinu mete i vrijeme odabira pogledom

O vježbi

Vježba V12Trajanje: 2 sataModul 3

Prije vježbe proći gradivo: 3.4 Interakcija: hvatanje, puštanje i točke interesa.

Pitanja i zadaci na ovoj stranici su bez odgovora. Rješenje s postupkom otvara se gumbom Prikaži rješenje ispod svakog pitanja, a upute za nastavnika nalaze se na dnu stranice.

Zadatak

U laboratoriju VR-1 korisnik uz robot MR-1 doznaje što koji dio radi. Na 6 točaka interesa (engl. point of interest, POI) — motor, kotač, baterija, upravljačka pločica, senzor udaljenosti i prekidač — pokazivač ističe dio i prikazuje natpis, a odabir otvara ili zatvara panel s objašnjenjem.

Točka je kolizijska sfera polumjera 0,03 m (promjer 60 mm, kao u jedinici 3.4). Korisnik je gleda s oko 1,0 m, a zrakom kontrolera doseže je do 3 m. Odabir pogledom izvodi se zadržavanjem pogleda 1,2 s. Odabir objavljuje događaj s oznakom točke (npr. POI_motor) za kasniju vezu sa simulacijom robota. Vježba se izvodi u okruženju s C# skriptama (npr. Unity s paketom za XR interakciju).

Oprema i pribor

  • računalo s razvojnim okruženjem s C# skriptama (npr. Unity) i uređivačem koda
  • model MR-1 iz M1 (glTF ili FBX) u kojem su točke interesa prazni objekti s imenima POI_…, postavljeni u programu za slobodno modeliranje (npr. Blender)
  • za drugi dio: dodatak OpenXR, paket za XR interakciju i naočale s kontrolerima; bez naočala simulator uređaja

Pravila koja se primjenjuju

Jedna logika, više ulaza — točka interesa ne zna tko ju je pozvao; miš, pogled, kontroler i geste samo pozivaju iste tri metode. Kolizija je obavezna — zraka pogađa samo kolizijske oblike, pa točka bez njega ne postoji za ulaz. Najprije miš, zatim XR — logika se ispita na računalu, bez naočala, a tek onda se dodaju XR ulazi. Vrijeme, ne okviri — trajanje zadržavanja pogleda mjeri se u sekundama. Čitljivost — panel je okrenut prema korisniku, na udaljenosti ugodnoj za čitanje.

Pažnja

Skriptu koja se oslanja na paket za XR interakciju dodajte tek kad je paket instaliran. Inače se projekt ne može prevesti, a tada ne radi ni skripta za miš. Nazivi komponenti i prostora imena mijenjaju se po inačici paketa: primjere provjerite u svojoj inačici.

Crtež

Miš Pogled Kontroler Geste TockaInteresa HoverEnter() HoverExit() Select() jedna logika Isticanje Natpis Panel Simulacija ulazi samo pozivaju događaj Odabrana
Slika V12.1 — četiri ulaza pozivaju iste tri metode; komponenta ističe dio, prikazuje natpis, otvara panel i objavljuje događaj za simulaciju.

Postupak

  1. U programu za slobodno modeliranje postavite šest praznih objekata POI_motor, POI_kotac, POI_baterija, POI_plocica, POI_senzor i POI_prekidac i izvezite model. U sceni dolaze kao prazni objekti na točnim položajima.
  2. Na svaku točku dodajte kolizijsku sferu polumjera 0,03 m, mali natpis i panel na platnu u prostoru scene (engl. world space).
  3. Napišite komponentu prema primjeru niže, prevedite projekt i ispravite pogreške koje javi konzola. Zapišite svaku pogrešku i ispravak.
  4. Stavite komponentu na svih šest točaka, povežite natpis i panel te upišite oznaku.
  5. Na kameru stavite pokazivač mišem i ispitajte svih šest točaka: isticanje, natpis, otvaranje i zatvaranje panela.
  6. Pretplatite se na događaj Odabrana i ispišite oznaku odabrane točke u konzolu (pretplata u OnEnable, odjava u OnDisable).
  7. Tek sada instalirajte paket za XR interakciju i XR rig. Na svaku točku dodajte jednostavan interaktivni objekt iz paketa i kratki most koji njegove događaje lebdenja (engl. hover) i odabira (engl. select) prosljeđuje metodama komponente. Ispitajte zraku kontrolera, pogled sa zadržavanjem i, ako uređaj prati ruke, prstohvat (engl. pinch).
  8. Ispunite zapis: 6 točaka × 4 ulaza = 24 provjere, prolaz ili pad.

Primjer komponente (nije ispitan; provjerite ga u svojoj inačici):

using UnityEngine;
using UnityEngine.Events;

public class TockaInteresa : MonoBehaviour
{
    public string oznaka = "POI_motor";
    public GameObject natpis, panel;
    public Color bojaIsticanja = Color.yellow;
    public UnityEvent priOdabiru;
    public static event System.Action<TockaInteresa> Odabrana;

    Renderer[] dijelovi; Color[] izvorne;
    int brojUlaza;   // više ulaza može biti na točki

    void Awake() {
        dijelovi = GetComponentsInChildren<Renderer>();
        izvorne = new Color[dijelovi.Length];
        for (int i = 0; i < dijelovi.Length; i++)
            izvorne[i] = dijelovi[i].material.color;
        if (natpis) natpis.SetActive(false);
        if (panel) panel.SetActive(false);
    }
    public void HoverEnter() {
        if (++brojUlaza == 1) Istakni(true);
    }
    public void HoverExit() {
        brojUlaza = Mathf.Max(0, brojUlaza - 1);
        if (brojUlaza == 0) Istakni(false);
    }
    public void Select() {
        if (panel) panel.SetActive(!panel.activeSelf);
        priOdabiru?.Invoke();
        Odabrana?.Invoke(this);
    }
    void Istakni(bool da) {
        for (int i = 0; i < dijelovi.Length; i++)
            dijelovi[i].material.color = da ? bojaIsticanja : izvorne[i];
        if (natpis) natpis.SetActive(da);
    }
}

Ulaz mišem, u vlastitoj datoteci MisPokazivac.cs (također primjer za provjeru u vlastitoj inačici; ovdje se koristi stari sustav ulaza, a s novim sustavom ulaza miš se čita drugačije):

using UnityEngine;

public class MisPokazivac : MonoBehaviour
{
    public Camera kamera;
    TockaInteresa trenutna;

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

Pitanja i zadaci

1. Zašto komponenta točke interesa ne smije znati koji ju je ulaz pozvao?

Prikaži rješenje

Logika se piše i ispravlja jednom, a novi ulaz ili uređaj samo poziva postojeće metode; isti projekt radi s mišem i u naočalama.

2. Mišem pokazujete na motor, a u isto vrijeme na njega pokazuje i zraka kontrolera. Kontroler se pomakne. Što bi se dogodilo bez brojača brojUlaza?

Prikaži rješenje

Izlazak kontrolera pozvao bi HoverExit i ugasio isticanje i natpis, iako je miš i dalje na točki. S brojačem isticanje nestaje tek kad točku napuste svi ulazi.

3. Računski. Kolizijska sfera polumjera 0,03 m gleda se s 1,0 m. Kolika je njezina kutna veličina i koliko piksela zauzima na uređaju A (2448 piksela na 116°)?

Prikaži rješenje

α = 2 · arctg(r/d) = 2 · arctg(0,03) = 3,44°. Gustoća: 2448/116 ≈ 21,1 piksela po stupnju. Veličina na zaslonu: 3,44 · 21,1 ≈ 73 piksela.

4. Računski. Koliki mora biti polumjer sfere da na 3 m ima istu kutnu veličinu?

Prikaži rješenje

r = d · tg(α/2) = 3 · 0,03 = 0,09 m. Kolizija smije biti veća od vidljivog označivača; na 3 m k tome treba računati i s podrhtavanjem zrake (jedinica 3.4).

5. Računski. Zadržavanje pogleda izvedeno je brojanjem okvira za 1,2 s pri 90 sl/s. Koliko okvira treba i koliko stvarno traje odabir ako aplikacija padne na 72 sl/s?

Prikaži rješenje

1,2 · 90 = 108 okvira. Pri 72 sl/s: 108/72 = 1,5 s, 25 % dulje. Zato se zbraja proteklo vrijeme okvira, a ne broj okvira.

6. Pronađi pogrešku. Točka POI_motor leži unutar kolizijskog oblika poklopca i mišem se ne može odabrati. Zašto i kako to riješiti?

Prikaži rješenje

Zraka prvo pogodi poklopac, koji nema komponentu točke interesa. Rješenje: točke u vlastiti sloj i maska sloja u zraci.

7. Zašto se najprije radi s mišem, a tek onda s XR ulazima?

Prikaži rješenje

Pogreške logike odvajaju se od pogrešaka uređaja i praćenja, ispitivanje je brže, a polaznici rade i kad uređaja nema dovoljno.

8. Zašto se pretplata na statički događaj Odabrana mora odjaviti u OnDisable?

Prikaži rješenje

Statički događaj živi dulje od objekta: bez odjave drži referencu na uništeni objekt, poziv javlja pogrešku, a poruka simulaciji može otići dvaput.

Za nastavnika

Otvori upute za nastavnika

Priprema

Pripremite model sa šest objekata POI_…, projekt bez XR paketa i projekt s paketima. Prevedite primjere u inačici polaznika i zabilježite prilagodbe.

Tijek sata

  1. 10 min — slika V12.1 i demonstracija mišem.
  2. 30 min — koraci 1–4, prevođenje i ispravljanje.
  3. 15 min — koraci 5–6, ispitivanje mišem.
  4. 25 min — korak 7 u naočalama ili simulatoru.
  5. 10 min — zapis 24 provjere i pitanja 3–5.

Očekivani rezultati

Šest točaka radi mišem i barem dvama XR ulazima bez promjene komponente; zapis s popisom pogrešaka pri prevođenju i ispravaka.

Česte pogreške

  • točka bez kolizijskog oblika
  • skripta mosta dodana prije instalacije paketa, projekt se ne prevodi
  • isticanje boje ne radi jer sjenčar materijala drži boju u drugom svojstvu materijala
  • natpis ili panel nisu povezani, pa se javlja pogreška prazne reference

Vrednovanje

KriterijBodovi
Komponenta prevedena, pogreške zapisane i ispravljene5
Šest točaka radi mišem4
XR ulazi pozivaju istu komponentu5
Događaj Odabrana s ispisom oznake2
Zapis 24 provjere2
Odgovori na pitanja2
Ukupno20