VJEŽBA V8 · MODUL 3 · RAZVOJ OKRUŽENJA VIRTUALNE STVARNOSTI
Vježba V8 · 2 sata
Prva programska logika: događaji, varijable, ispis
Prva programska logika laboratorija VR-1 u nacrtu: događaj pri pokretanju, varijable, ispis na zaslon i grananje koje prati koliko je dijelova robota skupljeno. Isti tok izveden je i kao kratki primjer u okruženju s C# skriptama.
- izraditi nacrt s događajem pri pokretanju i događajem ulazne akcije
- definirati varijable odgovarajućih tipova i mijenjati im vrijednost
- ispisati poruku na zaslon i u zapisnik te razlikovati razvojni ispis od sučelja
- upotrijebiti grananje za odluku o stanju sklopa
- izračunati napredak u postocima i izbjeći pogrešku cjelobrojnog dijeljenja
O vježbi
Prije vježbe proći gradivo: 3.2 Programska logika: nacrti, događaji i varijable.
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 projektu VR1_Laboratorij izradite nacrt BP_Brojac i postavite ga u scenu. Pri pokretanju ispisuje „Laboratorij VR-1 spreman", postavlja BrojDijelova = 12 (cijeli broj), Skupljeno = 0 i RobotSklopljen = laž (logička vrijednost). Svaki put kad se aktivira ulazna akcija DioSkupljen (za ispitivanje tipka na tipkovnici, zatim tipka kontrolera), brojač se povećava za 1 i ispisuje napredak u postocima.
Grananje odlučuje: kad je skupljeno 12 dijelova, ispisuje se „Robot sklopljen" i postavlja RobotSklopljen = istina; inače se ispisuje koliko je dijelova preostalo. Predaje se snimka nacrta i snimka ispisa za 7 i za 12 dijelova.
Oprema i pribor
- projekt VR1_Laboratorij iz vježbe V07
- računalo s razvojnim okruženjem s nacrtima (npr. Unreal Engine); naočale samo za završnu provjeru
- po želji okruženje s C# skriptama (npr. Unity) za usporedbu
Pravila koja se primjenjuju
Logika VR aplikacije pokreće se događajima: pokretanjem, ulaznom akcijom, sudarom, istekom mjerača vremena. Događaj koji se izvodi u svakom okviru troši dio budžeta od 11,1 ms, pa se u njega stavlja samo ono što se zaista mijenja svaki okvir. Varijabla ima tip (cijeli broj, realni broj, logička vrijednost, tekst) i pripada objektu; dvije kopije istog nacrta imaju svaka svoje vrijednosti.
Ispis na zaslon je razvojni alat: u mnogim okruženjima ne prikazuje se u završnoj izgradnji, a u naočalama je često izvan vidnog polja. Korisniku se poruke prikazuju prostornim sučeljem, npr. pločom uz stol.
Pažnja
Dijeljenje dvaju cijelih brojeva u mnogim jezicima daje cijeli broj: 7 / 12 = 0. Prije dijeljenja pretvorite brojnik u realni broj.
Crtež
Postupak
- Nacrt. U mapi Nacrti izradite novi nacrt vrste objekta u sceni (engl. actor) i nazovite ga BP_Brojac. Postavite ga u scenu L_Laboratorij.
- Varijable. Dodajte BrojDijelova (cijeli broj, 12), Skupljeno (cijeli broj, 0) i RobotSklopljen (logička, laž).
- Pokretanje. Na događaj pri pokretanju spojite postavljanje Skupljeno = 0 i ispis „Laboratorij VR-1 spreman". Uključite ispis i na zaslon i u zapisnik.
- Ulazna akcija. Definirajte akciju DioSkupljen i vežite je na tipku tipkovnice i tipku kontrolera. Objektu dopustite primanje ulaza (naziv postavke ovisi o inačici). Koristite događaj pritiska, ne držanja.
- Brojanje i napredak. Na akciju povećajte Skupljeno za 1, pretvorite ga u realni broj, podijelite s BrojDijelova, pomnožite sa 100 i ispišite s jednom decimalom.
- Grananje. Uvjet Skupljeno ≥ BrojDijelova. Istina: RobotSklopljen = istina i ispis „Robot sklopljen". Laž: ispis „Preostalo:" s razlikom BrojDijelova − Skupljeno.
- Provjera. Pokrenite scenu, pritisnite tipku 7 pa 12 puta i snimite ispis. Na kraju provjerite ispis u naočalama i u zapisniku.
Isti tok u okruženju s C# skriptama (primjer za razumijevanje; provjerite ga u svojoj inačici, a metodu DioSkupljen pozovite iz ulazne akcije):
using UnityEngine;
public class Brojac : MonoBehaviour
{
public int brojDijelova = 12;
int skupljeno = 0;
bool robotSklopljen = false;
void Start() { skupljeno = 0; Debug.Log("Laboratorij VR-1 spreman"); }
public void DioSkupljen() {
if (robotSklopljen) return; // nakon sklapanja se više ne broji
skupljeno++;
float napredak = 100f * skupljeno / brojDijelova; // 100f: dijeljenje u realnim brojevima
Debug.Log("Napredak: " + napredak.ToString("F1") + " %");
if (skupljeno >= brojDijelova) { robotSklopljen = true; Debug.Log("Robot sklopljen"); }
else Debug.Log("Preostalo: " + (brojDijelova - skupljeno));
}
}
Inačica bez naočala. Cijela vježba izvodi se u prozoru okruženja s tipkovnicom; naočale trebaju samo za korak 7.
Pitanja i zadaci
1. Objasnite razliku između događaja, funkcije i varijable na primjeru BP_Brojac. Što na slici V8.1 prikazuje puna, a što iscrtkana crta?
Prikaži rješenje
Događaj je početak toka koji pokreće okruženje (pokretanje) ili korisnik (DioSkupljen). Funkcija je imenovani slijed koraka koji se poziva s više mjesta, npr. „IzracunajNapredak". Varijabla čuva stanje objekta, npr. Skupljeno. Puna crta je izvršni tok, redoslijed koraka; iscrtkana je tok podataka, vrijednost koja ulazi u uvjet.
2. Računski. Ispis „Laboratorij VR-1 spreman" greškom je spojen na događaj koji se izvodi svaki okvir, pri 90 sl/s, a poruka ostaje na zaslonu 2 s. Koliko je poruka istodobno na zaslonu i koliko se ispisa izvede u 5 minuta?
Prikaži rješenje
Istodobno: 90 · 2 = 180 poruka. U 5 minuta: 90 · 60 · 5 = 27 000 ispisa. Zaslon je nečitljiv, a zapisnik raste i troši vrijeme okvira. Inicijalizacija ide na događaj pri pokretanju, koji se izvodi jednom.
3. Računski. Nakon 7 skupljenih dijelova ispisuje se napredak 0 %. Objasnite zašto i izračunajte ispravnu vrijednost.
Prikaži rješenje
Dijeljeni su cijeli brojevi: 7 / 12 = 0 (ostatak se odbacuje), pa je 0 · 100 = 0. Ispravno: 7,0 / 12 · 100 = 58,3 %. Alternativa je najprije množenje 7 · 100 = 700 pa 700 / 12 = 58 (cjelobrojno, bez decimale).
4. Računski. Vrijeme od pokretanja mjeri se brojenjem okvira uz pretpostavku 90 sl/s. Nakon 450 okvira ispisuje se „5 s". Koliko je stvarno prošlo na uređaju B prije optimizacije, pri 72 sl/s? Kako mjeriti ispravno?
Prikaži rješenje
Stvarno 450 / 72 = 6,25 s, a ispis kaže 5 s: ispis zaostaje 1,25 s, odnosno pokazuje 20 % manje od stvarnog vremena. Ispravno je zbrajati trajanje svakog okvira (engl. delta time) ili koristiti mjerač vremena okruženja, koji ne ovise o broju sličica.
5. Pronađi pogrešku. Uvjet grananja je Skupljeno = 12, a akcija je vezana na događaj držanja tipke. Što se događa i kako ispraviti?
Prikaži rješenje
Dok se tipka drži, akcija se izvodi svaki okvir: već pola sekunde držanja pri 90 sl/s doda oko 45 „dijelova". Uvjet Skupljeno = 12 ispunjen je samo u jednom okviru, pa se „Robot sklopljen" ispiše jednom usred niza poruka, a brojač raste dalje i „Preostalo" postaje negativno. Jedno držanje tipke tako „sklopi" robot, a to nije ono što se broji. Ispravak: događaj pritiska (jednom po pritisku) i uvjet Skupljeno ≥ 12, uz zaštitu da se nakon sklapanja više ne broji.
6. U sceni su greškom dvije kopije BP_Brojac. Što će pokazivati ispis nakon 12 pritisaka?
Prikaži rješenje
Svaka kopija ima svoje varijable i obje primaju ulaz, pa se svaka poruka pojavljuje dvaput i obje prijavljuju „Robot sklopljen". Stanje sklopa mora postojati na jednom mjestu, npr. u jednom upravitelju scene.
7. U prozoru okruženja ispis se vidi, a u naočalama ne. Zašto i kako poruku prikazati korisniku VR-1?
Prikaži rješenje
Razvojni ispis crta se u kutu slike ili samo na zrcalnom prozoru, a u naočalama je izvan vidnog polja ili se ne prikazuje. Korisniku se poruka prikazuje prostornim sučeljem: pločom s tekstom 1–2 m ispred korisnika ili uz radni stol.
Za nastavnika
Otvori upute za nastavnika
Priprema
Provjerite da se projekt iz V07 otvara na svim računalima. Pripremite gotov BP_Brojac za skupine koje zaostanu.
Tijek sata
- 10 min: događaji, varijable, izvršni tok i tok podataka (slika V8.1).
- 35 min: koraci 1–5.
- 20 min: grananje i provjera u prozoru.
- 15 min: provjera u naočalama, usporedba s primjerom u C#.
- 10 min: pitanja 2–5.
Očekivani rezultati
Nakon 7 pritisaka ispis 58,3 % i „Preostalo: 5", nakon 12 „Robot sklopljen"; ispis pri pokretanju samo jednom.
Česte pogreške
- cjelobrojno dijeljenje i napredak 0 %
- događaj držanja umjesto pritiska
- objekt ne prima ulaz jer ulaz nije omogućen
Vrednovanje
| Kriterij | Bodovi |
|---|---|
| Varijable ispravnih tipova i početnih vrijednosti | 4 |
| Događaj pri pokretanju i ulazna akcija | 4 |
| Napredak u postocima bez cjelobrojne pogreške | 4 |
| Grananje i oba ishoda | 4 |
| Snimke i odgovori na pitanja | 4 |
| Ukupno | 20 |