Řešení úlohy 4

Zadání: Úloha č. 4: Inteligentní objekt VRML (se skriptem)

Rozšiřte své předchozí prototypy o takové interaktivní prvky, které budou vyžadovat obsloužení skriptem. Každý objekt by měl mít obslouženu alespoň jednu interaktivní akci skriptem. V rámci jednoho týmu musejí skripty vykonávat principiálně odlišné akce. Vyberte si z následujících:

  1. Přepínač geometrie, barvy či jiné vlastnosti (např. vícepolohové tlačítko, šoupátko či točítko)
  2. Logický člen povolující určitou interakci po provedení jiné, předchozí akce
  3. Generátor speciálního druhu pohybu
  4. ... prvek s jinými vlastnostmi schválený po konzultaci s přednášejícím
Veškerá data k úloze budou umístěna v tradičním tvaru v adresáři 4.
Z WWW stránky by měl návštěvník získat následující informace a soubory:

Řešení:

uloha.wrl ping-pong.wrl vse.zip

Testy stolu...

Řešení úlohy

Popis scény

Prototypy

Panel pro změnu barvy

Tento prototyp, umožňuje ovládání barvy objektu. Jednotlivé barevné složky se mohou měnit pomocí scrollbarů (potahovacích lištiček), a to buď tažením nebo nebo klikáním na šipky. Při změně posílá panel eventOut color_changed. Ostatní parametry panelu jsou zřemé a nepotřebují dalšího popisu.

 PROTO ColorPanel [
  field SFFloat ambient_intensity   # vlastnosti vzhledu 
  field SFColor emissive_color      # 
  field SFFloat shininess           # 
  field SFColor specular_color      # 
  field SFFloat transparency        # 
  field SFNode texture              # 
  field SFFloat bar_length          # 
  field SFColor init_color          # 
  eventOut SFColor color_changed    # Výsledná barva 
] "color_panel.wrl#ColorPanel"

Informace o scrollbaru

Noha stolu

Prototyp (tvarově) velmi jednoduché nohy. Poloha nohy se ovláda pomocí změn poloh kycel a pata. Poloha kolena se dopocita, aby byla prislusne vzdálena od kyčle i paty, a to tak, aby ležela v rovině určene kyčlí, patou a směrem 1 0 0. Tato podmínka má obvykle dvě řešení. Vybere se to, kde nová poloha kolena je blíže predchozí hodnotě. V případě, že kyčel a pata jsou vzdáleny nadmíru, je koleno umístěno do prostřed, holeň a stehno jsou nepatně protáhnuty a zúženy.

 PROTO Noha_chodi [
  exposedField  SFVec3f kycel   0  1 0 # poloha kycle nohy 
  exposedField  SFVec3f koleno  0  0 0 # kolena 
  exposedField SFVec3f  pata    0  0 0 # a paty 

  exposedField SFNode  material NULL   # povrch nohy 
  exposedField SFNode  texture  NULL   # textura nohy 
]

Stůl v pohybu

Stůl vhodný pro animace. Využívá výše popsaných nohou. Stolem lze pohybovat pomocí noha0 ... noha3. Taktéž jde měnit poloha středu desky a její rotace. Z výhodou lze použít eventIn set_nohy. Pomocí tohoto pole vektorú lze měnit polohu všech nohou a střčdu desky zaroveň (střed je na poslendí pozici).

PROTO Stul_chodi [
  exposedField SFVec3f center 0 1 0       # poloha stredu desky 
  exposedField SFRotation  rotation 0 1 0 0  # rotace desky 

  exposedField SFVec3f noha0  1 0  1     # polohy noh 
  exposedField SFVec3f noha1  1 0 -1      
  exposedField SFVec3f noha2 -1 0  1      
  exposedField SFVec3f noha3 -1 0 -1      

  eventIn      MFVec3f set_nohy          # změna noh a center najdenou

  exposedField SFNode material Matro     # materiál a textura 
  exposedField SFNode texture Textr       
]

Prototypy pro animaci stolu

Tyto prototypy mají naprosto shodný intervace. Do atributu tvar se priradí instance prototypu Stul_chodi. Začátek animace se napojí na startTime. Rychlost animace se da ovlinit pomocí period. Po skoncení animace prototyp vyšle eventOut finishTime, čehož se da použít k napojení na jiný animační prototyp.

PROTO Hrab [         # hrabne pravou přední nohou
PROTO Scvrk [        # nohy pokrcčí do středu a zase vrátí na původní místo
PROTO Cumsemtam [    # rozhlédne se
PROTO Krok [         # uděla krok 
  field SFNode        tvar   NULL  # stul 
  exposedField SFTime period 1     # delka animace 
  eventIn SFTime      startTime    # zacatek 
  eventOut SFTime     finishTime   # po skonceni se posle tento ev.
]

Pinkaci stul

Tento prototyp je učren k pinkání. V čase Fire se míček Ball odpoutá ze své pozice a začne skákat. Pakliže uživatel pohybuje správně stolem, tak že v době dopadu je stůl pod míčkem, míček skáče dál. V opačném případě spadne na zem.

 PROTO Ping[
  field	SFVec2f		BatMin	-1 -1 # rozmery pálky 
  field	SFVec2f		BatMax	 1  1  
  field	MFNode		Ball           #tvar míčku 
  field	SFFloat		BallHeight 1   # jak vysoko je starovní pozice míčku 
  field	SFTime		HopTime	3     # délka jednoho skoku 
  eventIn SFVec3f	BatPosition    # ploha palky 
  eventIn SFTime	Fire           # cas startu 
]