Virtuální realita - úloha č. 4 - Inteligentní svět

Inteligentní chování modelů

Autodrom

Horská dráha

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
		#===============================================================================

							
	

Labuťový kolotoč

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.

Zpet na stránku úlohy.