Virtuální realita - úloha č. 4 - Inteligentní svět
Horska draha je pri vstupe do sceny necinna. Nemozno nastupit do pripravenych vozikov, nemozno hybat rychlostnou pakou. Po spusteni atrakcie hlavnym tlacitkom sa voziky zacnu samocinne pohybovat. Ak je atrakcia v chode, je mozne nastupit do vozika. Avatar sa vsak musi nachadzat v blizkosti vozika, a na semafore musi svietit zelene svetlo, v opacnom pripade sa nastupenie nezdari. Je mozne nastupit do oboch pripravenych vozikov.
Nastupenim do vozika sa nam naskytuje moznost menit rychlost vozika a aj celej atrakcie pripravenou pakou. Pohybom smerom nahor plynule spomalujeme atrakciu, a pohybom paky smerom nadol atrakciu naopak zrychlujeme. Spomalenie je mozne na 1/4 povodnej rychlosti, zrychlenie az na 4, nasobok povodnej rychlosti. Pocas jazdy v atrakcii nemozno z vozika vystupit. Tato moznost sa naskytne az po prejdeni celej drahy, a opetovnom zastaveni pri semafore kdes sa po objaveni zelenej farby kliknutim vozik mozeme pokusit vystupit.
V prototypoch naplnajucich tieto funkcne poziadavky je pouzitych niekolko jednoduchych skriptov. Napriklad skript meniaci jas a velkost hlavneho vypinaca:
DEF obsluhaSvetla Script {
field SFBool stavSvetla TRUE
field SFNode svetlo USE svetlo
eventIn SFTime zmena
eventIn SFFloat jas
directOutput TRUE
url "javascript:
function zmena(){
stavSvetla = stavSvetla ? FALSE : TRUE
}
function jas(value){
if(stavSvetla){
svetlo.intensity = 1-value
}
else
svetlo.intensity = value
}
"
}
DEF obsluhaZmenyVelkosti Script {
field SFBool rastie FALSE
field SFNode krabicka USE krabicka
eventIn SFTime zmena
eventIn SFFloat velkost
directOutput TRUE
url "javascript:
function zmena(){
rastie = rastie ? FALSE : TRUE
}
function velkost(value){
if(rastie){
krabicka.scale[0] = krabicka.scale[1] = 1+value
}
else
krabicka.scale[0] = krabicka.scale[1] = 2-value
}
"
}
]
ROUTE CasovacUputavky.fraction_changed TO IFarby.set_fraction
ROUTE IFarby.value_changed TO farbaKrabicky.diffuseColor
ROUTE CasovacUputavky.cycleTime TO obsluhaSvetla.zmena
ROUTE CasovacUputavky.fraction_changed TO obsluhaSvetla.jas
ROUTE CasovacUputavky.cycleTime TO obsluhaZmenyVelkosti.zmena
ROUTE CasovacUputavky.fraction_changed TO obsluhaZmenyVelkosti.velkost
Vacsina skriptov sa vsak nachcadza v subore scene.wlr. V tomto subore su v skriptoch popisane vsetky dolezite vztahy medzi klucovimi objektami. Skritp "prerozdelenieSignalu" ma na starosti odhalit mozne falosne signaly pochadzajuce od hlavneho vypinaca, a na tie spravne v pravidelnych reagovat zmenou aktivneho vlaku. Aktivny vlak potom nadalej dosatava informacie o pohybe po ploche, a ako jediny ma tak moznost sa pohybovat po drahe. Zvysne dva vlaky dostavaju informaciu o posune na povodne miesto vlaku ktory nachadzal pred nimi. Skript prerozdelenie signalu vyzera nasledovne:
DEF prerozdelenieSignalu Script {
field MFNode vlaky [USE vlacik1, USE vlacik2, USE vlacik3]
field SFInt32 aktivnyVlak 2
field SFBool pravySignal TRUE
eventIn SFBool set_active
eventIn SFVec3f set_value
eventIn SFTime set_newTrain
eventIn SFVec3f set_2to1
eventIn SFVec3f set_3to2
eventOut SFBool zmena
eventOut SFTime cycleTime_changed
directOutput TRUE
url "javascript:
function set_value(value){
vlaky[aktivnyVlak].translation = value;
}
function set_newTrain(cas){
if(pravySignal){
aktivnyVlak = (aktivnyVlak+1)%3;
zmena = true;
cycleTime_changed = cas;
}
else{
pravySignal = true;
}
}
function set_2to1(value){
vlaky[(aktivnyVlak+1)%3].translation = value;
}
function set_3to2(value){
vlaky[(aktivnyVlak+2)%3].translation = value;
}
function set_active(active){
if(!active)
pravySignal = false;
}
"
}
skripty zachovanie hlavneho casu a zachCAsPos - co znamena zachovanie casu posunu sluzia na uchovanie informacie o polohe vozidiel pre pripad stlacenia hlavneho vypinaca tak, aby ich bolo mozne opetovne navratit na povodne miesta.Klucove funkcie tychto skriptov su tieto:
function set_startStop(value,time){
if(value){
if(prvy){
pociatok = time;
prvy = false;
start_changed = pociatok;
}
else{
pociatok = time - (stopped - pociatok);
start_changed = pociatok;
stop_changed = -1;
}
}
else{
stopped = time;
stop_changed = stopped;
}
}
function set_active(active,time){
if(active){
if(pociatok == 0){
pociatok = time;
startTime_changed = pociatok;
}
else{
pociatok = time - (stopped - pociatok);
stopTime_changed = -1;
startTime_changed = pociatok;
}
active_changed = true;
}
else{
stopped = time;
pravySignal = false;
active_changed = false;
stopTime_changed = stopped;
}
}
Skripty a objekty na scene su previazane nasledujucim sposobom:
#============================ovladanie hlavnej trasy============================ #============================ovladanie hlavnej trasy============================ ROUTE zachovanieHlavnehoCasu.start_changed TO hlavnyPohybovyTS.set_startTime ROUTE zachovanieHlavnehoCasu.stop_changed TO hlavnyPohybovyTS.stopTime ROUTE hlavnyPohybovyTS.fraction_changed TO hlavnyPohybovyPI.set_fraction ROUTE hlavnyPohybovyPI.value_changed TO prerozdelenieSignalu.set_value #=============================================================================== #================================riadenie vyberu vlakov========================= ROUTE hlavnyPohybovyTS.cycleTime TO prerozdelenieSignalu.set_newTrain ROUTE hlavnyPohybovyTS.isActive TO prerozdelenieSignalu.set_active #=============================================================================== #=========================ovladanie posunu z 2. na 1. poziciu=================== ROUTE hlavnyPohybovyTS.isActive TO zachCasPos.set_active ROUTE hlavnyPohybovyTS.cycleTime TO zachCasPos.set_cycleTime ROUTE zachCasPos.startTime_changed TO posun2to1TS.startTime ROUTE posun2to1TS.fraction_changed TO posun2to1PI.set_fraction ROUTE posun2to1PI.value_changed TO prerozdelenieSignalu.set_2to1 ROUTE zachCasPos.stopTime_changed TO posun2to1TS.stopTime #=============================================================================== #=========================obladanie posunu z 3. na 2. poziciu=================== ROUTE zachCasPos.startTime_changed TO posun3to2TS.startTime ROUTE posun3to2TS.fraction_changed TO posun3to2PI.set_fraction ROUTE posun3to2PI.value_changed TO prerozdelenieSignalu.set_3to2 ROUTE zachCasPos.stopTime_changed TO posun3to2TS.stopTime #=============================================================================== #==================================prepojenie na semafor======================== ROUTE zachCasPos.active_changed TO semafor.set_activeFromZach ROUTE posun2to1TS.isActive TO semafor.set_activeFromPos ROUTE semafor.zelena_changed TO obsluhaTouchSignalu.set_positionCheck ROUTE trainProxySenzor.isActive TO obsluhaTouchSignalu.set_proxyCheck ROUTE obsluhaTouchSignalu.circum_changed TO obsluhaSemaforSignalu.set_zelena ROUTE prerozdelenieSignalu.zmena TO obsluhaSemaforSignalu.zmena #=============================================================================== #==================================usadenie avatara do vlaku==================== ROUTE vlacik1TuchSen.isActive TO obsluhaNastupovania.set_touch1 ROUTE vlacik2TuchSen.isActive TO obsluhaNastupovania.set_touch2 ROUTE vlacik3TuchSen.isActive TO obsluhaNastupovania.set_touch3 #=============================================================================== #=====================================speed multiplier========================== ROUTE obsluhaNastupovania.inside_changed TO paka.set_active ROUTE paka.multiplier_changed TO speedMultiplier.set_multiplier #===============================================================================
Kolotoč umí pracovat ve dvou hlavních režimech - automatickém a manuálním.
V automatickém režimu se kolotoč začne otáčet a ramena se samy plynule pohybují nahoru a dolů. Automatický režim se zapne/vypne levým tlačítkem na ovládacím panelu kolotoče. Pravé blikající tlačítko slouží pro pauznutí veškerého pohybu a deaktivaci senzorů.
Pro manuální ovládání je potřeba nejdříve nasednout do labutě. Nasednutí se provádí kliknutím na labuť, a to pouze není-li zapnut automatický režim. Z labutě lze pak vystoupit opětovným kliknutím na tělo labutě. Labuť, v níž právě sedí avatar, disponuje panelem se dvěma ovládacími prvky. Pomocí tlačítka je možno zapnout otáčení kolotoče. Páka slouží k ručnímu ovládání výšky aktivního ramene. Ostatní ramena se během otáčení zvedají a klesají automaticky. Během sezení v labuti se může avatar pouze otáčet (koukat kolem sebe), jiné pohyby nejsou umožněny. Po vysednutí skočí avatar na pozici předchozího viewpointu.