15.05.2013 Views

Desenvolupament de videojocs Cas pràctic de l'ús d'un motor de ...

Desenvolupament de videojocs Cas pràctic de l'ús d'un motor de ...

Desenvolupament de videojocs Cas pràctic de l'ús d'un motor de ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Desenvolupament</strong> <strong>de</strong> vi<strong>de</strong>ojocs<br />

<strong>Cas</strong> <strong>pràctic</strong> <strong>de</strong> l’ús d’un <strong>motor</strong> <strong>de</strong><br />

vi<strong>de</strong>ojocs pel <strong>de</strong>senvolupament <strong>de</strong><br />

les Obscurances en temps real<br />

<strong>Desenvolupament</strong> <strong>de</strong>l Projecte<br />

per Jordi Catà <strong>Cas</strong>tillo<br />

Enginyeria Informàtica<br />

Escola Politècnica Superior<br />

Universitat <strong>de</strong> Girona<br />

Tutor : Mateu Sbert <strong>Cas</strong>asayas<br />

Departament : Departament d’Informàtica i<br />

Matemàtica Aplicada


Versió <strong>de</strong>l 01/09/2004 16:51:19<br />

3


Minino <strong>de</strong> Cheshire,<br />

¿podrías <strong>de</strong>cirme, por favor, qué camino <strong>de</strong>bo seguir para salir <strong>de</strong> aquí?<br />

Esto <strong>de</strong>pen<strong>de</strong> en gran parte <strong>de</strong>l sitio al que quieras llegar --dijo el Gato.<br />

No me importa mucho el sitio... --dijo Alicia.<br />

Entonces tampoco importa mucho el camino que tomes --dijo el Gato.<br />

... siempre que llegue a alguna parte --añadió Alicia.<br />

¡Oh, siempre llegarás a alguna parte --aseguró el Gato--, si caminas lo suficiente!<br />

Alícia en el país <strong>de</strong> las meravelles<br />

4


TAULA DE CONTINGUTS GENERAL<br />

Taula <strong>de</strong> continguts<br />

1. INTRODUCCIÓ ................................................................................................... 10<br />

1.1. SITUACIÓ DEL PROBLEMA .............................................................................. 10<br />

1.2. OBJECTIUS DEL PROJECTE............................................................................. 12<br />

1.3. ESCTRUCTURACIÓ DELS CONTINGUTS........................................................... 13<br />

2. DESENVOLUPAMENT DE VIDEOJOCS ....................................................... 14<br />

2.1. L’EQUIP DE DESENVOLUPAMENT................................................................... 14<br />

2.2 FASES EN EL DESENVOLUPAMENT D'UN VIDEOJOC, CICLE DE VIDA DEL<br />

PROJECTE I DOCUMENTS ........................................................................................... 24<br />

2.3 INTRODUCCIÓ A LA GESTIÓ I PLANIFICACIÓ DEL DESENVOLUPAMENT ....... 30<br />

2.4 PARTS D’UN VIDEOJOCS................................................................................. 36<br />

2.5 DESENVOLUPAMENT DE VIDEOJOCS.............................................................. 40<br />

3. CAS PRÀCTIC: DESENVOLUPAMENT DE LES OBSCURANCES EN<br />

TEMPS REAL .............................................................................................................. 57<br />

3.1. ANÀLISIS: MODEL D’IL·LUMINACIÓ GLOBAL MITJANÇANT OBSCURANCES . 57<br />

3.2. DISSENY.......................................................................................................... 65<br />

3.3. IMPLEMENTACIÓ ............................................................................................ 80<br />

3.4 RESULTATS I CONCLUSIONS........................................................................... 90<br />

3.5 TREBALLS FUTURS ......................................................................................... 92<br />

ANNEXES ..................................................................................................................... 94<br />

ANNEX 1: HISTÒRIA DELS VIDEOJOCS/CONSOLES .................................................... 94<br />

ANNEX 2: GENERES DE VIDEOJOCS ......................................................................... 102<br />

ANNEX 3: M ERCAT DELS VIDEOJOCS ...................................................................... 106<br />

ANNEX 4: FORMAT D’ESCENES DE CS ..................................................................... 107<br />

ANNEX 5: CLASSES FUNCIONS PRIN CIPALS ............................................................. 111<br />

ANNEX 5: CRECIÓ D’UNA APLICACIÓ EN CRYSTAL SPACE..................................... 121<br />

BIBLIOGRAFIA ........................................................................................................ 128<br />

REFERÈNCIES ...................................................................................................... 128<br />

WEB ......................................................................................................................... 130<br />

AGRAÏMENTS ........................................................................................................... 131<br />

6


TAULA DE CONTINGUTS<br />

Taula <strong>de</strong> continguts<br />

1. INTRODUCCIÓ ................................................................................................... 10<br />

1.1. SITUACIÓ DEL PROBLEMA .............................................................................. 10<br />

1.1.1. Trasfons.................................................................................................. 10<br />

1.1.2. Projecte previ.......................................................................................... 11<br />

1.2. OBJECTIUS DEL PROJECTE............................................................................. 12<br />

1.3. ESCTRUCTURACIÓ DELS CONTINGUTS........................................................... 13<br />

2. DESENVOLUPAMENT DE VIDEOJOCS ....................................................... 14<br />

2.1. L’EQUIP DE DESENVOLUPAMENT................................................................... 14<br />

2.1.1 Producció............................................................................................... 14<br />

Productor extern.................................................................................................. 15<br />

Productor intern.................................................................................................. 15<br />

Assistents i Productors associats ........................................................................ 15<br />

2.1.2 Disseny ................................................................................................... 16<br />

Dissenyador <strong>de</strong>l joc............................................................................................. 17<br />

Dissenyador <strong>de</strong> nivells........................................................................................ 17<br />

L’escriptor........................................................................................................... 17<br />

2.1.3 Programació........................................................................................... 17<br />

Cap <strong>de</strong> programació............................................................................................ 18<br />

Programadors...................................................................................................... 18<br />

2.1.4 Art........................................................................................................... 20<br />

Cap d’artistes ...................................................................................................... 20<br />

Artistes................................................................................................................ 21<br />

2.1.5 Testeig..................................................................................................... 22<br />

Cap <strong>de</strong> testeig...................................................................................................... 22<br />

Testejadors.......................................................................................................... 22<br />

2.1.6 Recursos Externs ................................................................................... 22<br />

2.2 FASES EN EL DESENVOLUPAMENT D'UN VIDEOJOC, CICLE DE VIDA DEL<br />

PROJECTE I DOCUMENTS ........................................................................................... 24<br />

Desenvolupar el Concepte .................................................................................. 24<br />

Proposta <strong>de</strong> projecte............................................................................................ 25<br />

Preproducció ....................................................................................................... 26<br />

<strong>Desenvolupament</strong> ............................................................................................... 28<br />

2.3 INTRODUCCIÓ A LA GESTIÓ I PLANIFICACIÓ DEL DESENVOLUPAMENT ....... 30<br />

2.3.1 Planificació i calendaris........................................................................ 30<br />

Abast ................................................................................................................... 31<br />

Pressions externes............................................................................................... 31<br />

Modificació <strong>de</strong> requeriments .............................................................................. 31<br />

Optimisme <strong>de</strong>ls <strong>de</strong>senvolupadors ....................................................................... 31<br />

El problema irresoluble....................................................................................... 32<br />

2.3.2 Escollint el millor mo<strong>de</strong>l <strong>de</strong> cicle <strong>de</strong> vida per al <strong>de</strong>senvolupament d’un<br />

vi<strong>de</strong>ojoc 32<br />

<strong>Cas</strong>cada............................................................................................................... 32<br />

<strong>Cas</strong>cada modificada ............................................................................................ 33<br />

Prototipatge iteratiu ............................................................................................ 33<br />

2.3.3 Recuperació............................................................................................ 34<br />

Estratègies innefectives ...................................................................................... 34<br />

Estratègies efectives............................................................................................ 35<br />

7


Taula <strong>de</strong> continguts<br />

2.4 PARTS D’UN VIDEOJOCS................................................................................. 36<br />

2.4.1 Sistema d’Entrada.................................................................................. 36<br />

2.4.2 Sistema <strong>de</strong> Visualització........................................................................ 37<br />

2.4.3 Sistema <strong>de</strong> So ........................................................................................ 37<br />

2.4.4 Sistema <strong>de</strong> Xarxa ................................................................................... 38<br />

2.4.5 Sistema d’Actualització.......................................................................... 38<br />

2.4.6 Bucle principal....................................................................................... 38<br />

2.5 DESENVOLUPAMENT DE VIDEOJOCS.............................................................. 40<br />

2.5.1 Llibreries, <strong>motor</strong>s gràfics i <strong>motor</strong>s <strong>de</strong> vi<strong>de</strong>ojocs ................................... 40<br />

2.5.2 Llibreries ................................................................................................ 41<br />

OpenGL .............................................................................................................. 41<br />

OpenAL .............................................................................................................. 41<br />

HawkLib ............................................................................................................. 41<br />

Raknet ................................................................................................................. 42<br />

Devil, Corona...................................................................................................... 42<br />

Cal3D.................................................................................................................. 42<br />

lib3DS ................................................................................................................. 42<br />

SDL (Simple Direct Layer) ................................................................................ 42<br />

Clanlib................................................................................................................. 42<br />

2.5.3 Motor <strong>de</strong> vi<strong>de</strong>ojocs ................................................................................. 42<br />

Crystal Space ...................................................................................................... 44<br />

Ogre .................................................................................................................... 51<br />

Nebula Device 2 ................................................................................................. 52<br />

Open Scene Graph.............................................................................................. 53<br />

Irrlitch ................................................................................................................. 55<br />

3. CAS PRÀCTIC: DESENVOLUPAMENT DE LES OBSCURANCES EN<br />

TEMPS REAL .............................................................................................................. 57<br />

3.1. ANÀLISIS: MODEL D’IL·LUMINACIÓ GLOBAL MITJANÇANT OBSCURANCES . 57<br />

3.1.1. Mo<strong>de</strong>l d’ il·luminació Obscurances sense fonts <strong>de</strong> llum...................... 58<br />

3.1.2. Mo<strong>de</strong>l d’ il·luminació Obscurances amb fonts <strong>de</strong> llum........................ 60<br />

3.1.3. Mo<strong>de</strong>l millorat <strong>de</strong> les obscurances (Color Bleeding) ........................... 61<br />

3.1.4. Calculant les obscurances ..................................................................... 62<br />

3.2. DISSENY.......................................................................................................... 65<br />

3.2.1. Fases en la implementació <strong>de</strong> les Obscurances en temps real ............. 65<br />

3.2.2. Lightmaps............................................................................................... 65<br />

3.2.3. Càrrega i Estructuració <strong>de</strong> l’escena: Voxels........................................ 70<br />

3.2.4. Algorisme per calcular les Obscurances............................................... 71<br />

Voxel origen <strong>de</strong>l raig .......................................................................................... 72<br />

Llançament <strong>de</strong> raigs............................................................................................ 73<br />

Calculant i aplicant les Obscurances al patch origen <strong>de</strong>l raig ............................ 76<br />

Inicialització <strong>de</strong> les estructures per a les Obscurances en temps real................. 77<br />

3.2.5. Exemple pas a pas.................................................................................. 78<br />

3.3. IMPLEMENTACIÓ ............................................................................................ 80<br />

3.3.1 Relació entre classes .............................................................................. 80<br />

3.3.2 Seqüència d’execució bàsica................................................................. 81<br />

3.3.3 Aplicació walktest .................................................................................. 82<br />

3.3.4 Classe csEngine ..................................................................................... 84<br />

3.3.5 Diagrama <strong>de</strong> seqüències: inicialització estructures ............................. 85<br />

Càrrega <strong>de</strong> les da<strong>de</strong>s ........................................................................................... 86<br />

Estructuració <strong>de</strong> l’escena en Voxels ................................................................... 87<br />

3.3.6 Diagrama <strong>de</strong> seqüències: càlcul obscurances ...................................... 88<br />

8


Taula <strong>de</strong> continguts<br />

Aplicar les Obscurances al patch........................................................................ 89<br />

3.4 RESULTATS I CONCLUSIONS........................................................................... 90<br />

3.4.1 Captures <strong>de</strong> pantalla.............................................................................. 90<br />

3.4.2 Resultats................................................................................................. 92<br />

3.4.3 Conclusions............................................................................................ 92<br />

3.5 TREBALLS FUTURS ......................................................................................... 92<br />

ANNEXES ..................................................................................................................... 94<br />

ANNEX 1: HISTÒRIA DELS VIDEOJOCS/CONSOLES .................................................... 94<br />

Els principis ........................................................................................................ 94<br />

Evolució <strong>de</strong> les vi<strong>de</strong>oconsoles (1972-2001)....................................................... 95<br />

La dècada <strong>de</strong>ls clàssics (1978-1988) .................................................................. 99<br />

ANNEX 2: GENERES DE VIDEOJOCS ......................................................................... 102<br />

Aventures.......................................................................................................... 102<br />

Acció ................................................................................................................. 102<br />

RPGs (Role-playing games)............................................................................. 102<br />

Estratègia .......................................................................................................... 103<br />

Simulació .......................................................................................................... 103<br />

Esports .............................................................................................................. 104<br />

Lluita................................................................................................................. 104<br />

Jugar a ser Deu.................................................................................................. 104<br />

Jocs online ........................................................................................................ 105<br />

Educatius........................................................................................................... 105<br />

Puzzles .............................................................................................................. 105<br />

Jocs <strong>de</strong> casualitat............................................................................................... 105<br />

ANNEX 3: M ERCAT DELS VIDEOJOCS ...................................................................... 106<br />

ANNEX 4: FORMAT D’ESCENES DE CS ..................................................................... 107<br />

Definició textures.............................................................................................. 107<br />

Definició materials............................................................................................ 107<br />

Definició Malles ............................................................................................... 108<br />

Definició sectors ............................................................................................... 108<br />

Definició inicial <strong>de</strong> l’escena ............................................................................. 109<br />

Exemple <strong>de</strong> fitxer en format CS ....................................................................... 109<br />

ANNEX 5: CLASSES FUNCIONS PRIN CIPALS ............................................................. 111<br />

Classe raig......................................................................................................... 111<br />

Classe Patch...................................................................................................... 112<br />

Classe PatchList................................................................................................ 113<br />

Classe ObsPoly................................................................................................. 113<br />

Classe ObsPolyList........................................................................................... 115<br />

Classe Voxel..................................................................................................... 116<br />

Classe VoxeList ................................................................................................ 117<br />

Classe Obscurance ............................................................................................ 118<br />

Classe ObsCube ................................................................................................ 119<br />

Classe csEngine ................................................................................................ 120<br />

Classe Walktest................................................................................................. 120<br />

ANNEX 5: CRECIÓ D’UNA APLICACIÓ EN CRYSTAL SPACE..................................... 121<br />

BIBLIOGRAFIA ........................................................................................................ 128<br />

REFERÈNCIES ...................................................................................................... 128<br />

WEB ......................................................................................................................... 130<br />

AGRAÏMENTS ........................................................................................................... 131<br />

9


1. Introducció<br />

Introducció<br />

El present document és la memòria <strong>de</strong>l projecte anomenat “<strong>Desenvolupament</strong> <strong>de</strong><br />

vi<strong>de</strong>ojocs cas <strong>pràctic</strong> <strong>de</strong> l’us d’un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs per <strong>de</strong>senvolupament <strong>de</strong> Real-<br />

Time Obscurances”. En aquesta memòria es recull la presa <strong>de</strong> <strong>de</strong>cicions <strong>de</strong> totes les<br />

fases d’anàlisis, disseny i implementació, així com tot el que implica <strong>de</strong>senvolupar un<br />

vi<strong>de</strong>ojoc. En el manual d’usuari s’explica com compilar, instal·lar i executar el<br />

projecte.<br />

1.1. Situació <strong>de</strong>l problema<br />

1.1.1.Trasfons<br />

Els gràfics per computador han estat una àrea popular en les ciències <strong>de</strong> la computació<br />

en les últimes dèca<strong>de</strong>s. Gran part <strong>de</strong> la recerca en aquest camp s’ha <strong>de</strong>stinat a obtenir<br />

imatges el més realistes possibles [8][9], però generar aquestes imatges tant realistes té<br />

un preu. Ens els seus inicis els algorismes ten<strong>de</strong>ixen a ser computacionalment costosos i<br />

solen ser implementats en hardware gràfic específic que normalment tenen uns elevats<br />

preus, per tant únicament les universitat i empreses que es <strong>de</strong>diquem a temes <strong>de</strong> gràfics<br />

per computador po<strong>de</strong>n assolir. Però tot i haver aquesta limitació inicial <strong>de</strong> que els<br />

ordinadors personals (<strong>de</strong> gamma baixa) assolibles per el públic en general no han tingut<br />

molta potència per a produir imatges realístiques, els vi<strong>de</strong>ojocs han tingut molta<br />

popularitat durant dèca<strong>de</strong>s, com po<strong>de</strong>m veure en l’annex 1.<br />

Els dissenyadors i programadors <strong>de</strong> vi<strong>de</strong>ojocs han hagut <strong>de</strong> ser creatius per a po<strong>de</strong>r<br />

produir entorns immersius amb una alta jugabilitat <strong>de</strong> tal manera que els jugadors no<br />

tinguessin en compte les imatges <strong>de</strong> baixa qualitat produï<strong>de</strong>s pels ordinadors <strong>de</strong> gamma<br />

baixa.<br />

A mesura que ha passat el temps la tecnologia ha anat millorant, la <strong>de</strong>manda per<br />

vi<strong>de</strong>ojocs més realistes i amb interacció en temps reals està en augment. Juntament amb<br />

la millora <strong>de</strong> la tecnologia, la millora <strong>de</strong>ls gràfics, els grups <strong>de</strong> jugadors han evolucionat<br />

d’un nombre petit d’individus a grans segments <strong>de</strong> la població. Un <strong>de</strong>ls vi<strong>de</strong>ojocs més<br />

populars, <strong>de</strong> més èxit, i més venut va ser Myst, creat i produït per Cyan Productions i<br />

publicat per Bro<strong>de</strong>rbund. Aquest joc i d’altres similars van mostrar que era possible<br />

accedir a un nou mercat a través <strong>de</strong>ls vi<strong>de</strong>ojocs. Un mercat que incloïa als consumidors<br />

generals, no únicament els “adictes” als computadors. L’increment <strong>de</strong> la <strong>de</strong>manda <strong>de</strong><br />

vi<strong>de</strong>ojocs i el potencial <strong>de</strong>l mercat ha creat un nou impuls per incrementar la velocitat,<br />

capacitat i potència <strong>de</strong> la tecnologia.<br />

Un resultat <strong>de</strong>l increment <strong>de</strong> la <strong>de</strong>mana ha estat l’evolució <strong>de</strong> les targes gràfiques que<br />

han passat a accelerar per hardware gran quantitat <strong>de</strong> càlculs que anteriorment es feien<br />

per software (CPU). Les targes gràfiques inicials només estaven prepara<strong>de</strong>s per treballar<br />

o bé en 3D (funcionaven únicament a pantalla complerta) o bé 2D (utilitza<strong>de</strong>s<br />

únicament per interfícies estàndards). Les generacions posteriors van ser dissenya<strong>de</strong>s<br />

per treballar tant en 3D com en 2D i podien treballar en mo<strong>de</strong> finestra (no<br />

necessàriament a pantalla complerta). Des <strong>de</strong> que la rasteritzation <strong>de</strong>ls triangles ha estat<br />

10


Introducció<br />

el major coll d’ampolla en els software <strong>de</strong> ren<strong>de</strong>ring, les targes gràfiques van actuar<br />

com a ràpi<strong>de</strong>s rasteritzation <strong>de</strong> triangles. La següent evolució <strong>de</strong> targes gràfiques va ser<br />

dissenyat per po<strong>de</strong>r fer més càlculs per segon, en particular fer transformacions <strong>de</strong><br />

vèrtexs i càlculs d’il·luminació per hardware. En aquest punt es on es comença a parlar<br />

<strong>de</strong> GPU (Graphic Procesing Unit) per tant els ordinadors passen a tenir dos<br />

processadors molt potents, un per als càlculs generals (CPU) i l’altre per les operacions<br />

gràfiques específiques (GPU).<br />

Un altre resultat <strong>de</strong> l’ increment <strong>de</strong> la <strong>de</strong>manda <strong>de</strong>ls vi<strong>de</strong>ojocs ha estat l’evolució <strong>de</strong> les<br />

CPUs per incloure suport a operacions que típicament existeixen en aplicacions 3D:<br />

divisions ràpi<strong>de</strong>s, arrels quadra<strong>de</strong>s inverses (per normalitzar vectors) i paral·lelismes<br />

que aju<strong>de</strong>n a transformar vèrtexs i calcular productes vectorials. Moltes empreses estan<br />

actualment explotant noves vies per utilitzar la tecnologia 3D en aplicacions que no son<br />

vi<strong>de</strong>ojocs com per exemple en Comerç electrònic i plugins per aplicacions empresarials.<br />

Actualment l’imparable avanç tecnològic ens ha portat a les noves generacions <strong>de</strong> targes<br />

gràfiques amb la capacitat <strong>de</strong> po<strong>de</strong>r ser programa<strong>de</strong>s on the fly via vertex i pixel sha<strong>de</strong>rs<br />

establint un gran paral·lelisme entre la CPU i la GPU. Per tant sobre un nou horitzó en<br />

el camp <strong>de</strong>ls gràfics per computador.<br />

Actualment les targes gràfiques suporten <strong>de</strong> l’ordre <strong>de</strong> 100 milions <strong>de</strong> triangles per<br />

segon.<br />

Degut al gran paral·lelisme entre CPU i GPU, la CPU es pot encarregar <strong>de</strong> tasques<br />

específiques com la <strong>de</strong>tecció <strong>de</strong> col·lisions, física, intel·ligència artificial, etc, mentre<br />

que <strong>de</strong> la part gràfica s’encarrega la GPU. No hem d’oblidar que la CPU s’encarrega d’<br />

enviar les da<strong>de</strong>s a la GPU.<br />

A part <strong>de</strong> la gran evolució en el mon <strong>de</strong>ls gràfics/vi<strong>de</strong>ojocs, el seu mon mou més diners<br />

que la indústria <strong>de</strong>l cinema, tal i com comentem en l’annex 3.<br />

1.1.2.Projecte previ<br />

No obstant la gran potència que van adquirint les noves tecnologies, hi ha càlculs que<br />

segueixen sent costosos <strong>de</strong> realitzar. Dins d’aquests càlculs costosos po<strong>de</strong>m trobar els<br />

algoritmes <strong>de</strong> radiositat que simulen la il·luminació difusa d’una escena. El càlcul <strong>de</strong> la<br />

radiositat per un quadre d’una animació pot portar hores i hores <strong>de</strong> preprocesament ja<br />

que molts <strong>de</strong>ls esforços realitzats en el càlcul es <strong>de</strong>stinen a la resolució <strong>de</strong> grans<br />

sistemes d’equacions, consumint molts recursos tant <strong>de</strong> CPU com <strong>de</strong> memòria al haver<br />

<strong>de</strong> calcular les aportacions <strong>de</strong> tots el patchs contra tots els patchs <strong>de</strong>terminats per<br />

obtenir imatges molt realistes on es po<strong>de</strong>n apreciar les reflexions difuses, el color<br />

bleeding entre superfícies, les penombres que apareixen en els límits <strong>de</strong> les ombres,<br />

ombres molt realistes, etc..<br />

El <strong>de</strong>senvolupament <strong>de</strong> les Obscurances sorgeix com a alternativa a la radiositat, ja que<br />

simplifica els càlculs d’aquesta però els resultats finals son <strong>pràctic</strong>ament idèntics.<br />

Po<strong>de</strong>m veure una primera implementació en el projecte fi <strong>de</strong> carrera <strong>de</strong> Margarita<br />

Garcia i Teixidor: “Implementació i millora <strong>de</strong>l mèto<strong>de</strong> d’il·luminació global mitjançant<br />

obscurances” [14]. En el que es proposa una implementació <strong>de</strong> les obscurances dins el<br />

11


Introducció<br />

paquet Ren<strong>de</strong>rPark. En aquest anterior projecte po<strong>de</strong>m veure una comparativa entre el<br />

mèto<strong>de</strong> <strong>de</strong> la radiositat i el nou mèto<strong>de</strong>, aquí exposat, <strong>de</strong> les Obscurances.<br />

1.2. Objectius <strong>de</strong>l projecte<br />

Com hem comentat en els apartats anteriors, els vi<strong>de</strong>ojocs han evolucionat molt <strong>de</strong>s <strong>de</strong><br />

que van sorgir els primers. En les primeres èpoques els vi<strong>de</strong>ojocs eren molt ràpids <strong>de</strong><br />

<strong>de</strong>senvolupar <strong>de</strong>gut a la seva simplicitat (bastava una persona durant unes setmanes per<br />

finalitzar-ne un), mentre que en l’època actual crear un vi<strong>de</strong>ojoc és un projecte ambicios<br />

portat a terme per uns equips pluridisciplinars durant un llarg perío<strong>de</strong> <strong>de</strong> temps (<strong>de</strong> 6<br />

mesos a 2 anys <strong>de</strong> mitja). A més la indústria <strong>de</strong>ls vi<strong>de</strong>ojocs mou més diners que la<br />

indústria <strong>de</strong>l cinema, tal i com po<strong>de</strong>m veure en l’annex 3.<br />

Podriem resumir un vi<strong>de</strong>ojoc com:<br />

? Software innovador.<br />

? Software creatiu.<br />

? De gran complexitat (penseu en jocs <strong>de</strong>l tipus Shenmue, Doom 3 o Quake 3)<br />

? Intervenen multitud d’àrees <strong>de</strong> coneixement.<br />

? És un Mercat en expansio.<br />

L’objectiu <strong>de</strong>l projecte està en conèixer a fons tot el que implica un <strong>de</strong>senvolupament<br />

d’un vi<strong>de</strong>ojoc, <strong>de</strong>s <strong>de</strong> les persones implica<strong>de</strong>s, el cicle <strong>de</strong> vida, llibreries per ajudar al<br />

<strong>de</strong>senvolupament, i per últim està en la implementació <strong>de</strong> la tècnica d’il·luminació<br />

anomenada Obscurances en temps real en un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs.<br />

La implementació <strong>de</strong> les Obscurances ens servirà per realitzar una aproximació <strong>pràctic</strong>a<br />

<strong>de</strong>l funcionament d’un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs.<br />

Fent un resum <strong>de</strong>ls objectius trobem:<br />

• <strong>Desenvolupament</strong> <strong>de</strong> vi<strong>de</strong>ojocs<br />

o Equip <strong>de</strong> treball.<br />

o Cicle <strong>de</strong> vida <strong>de</strong>l <strong>de</strong>senvolupament d’un vi<strong>de</strong>ojoc.<br />

o Parts <strong>de</strong> les que és composa un vi<strong>de</strong>ojoc.<br />

o Llibreries i <strong>motor</strong>s gràfics per ajudar al <strong>de</strong>senvolupament.<br />

• <strong>Cas</strong> <strong>pràctic</strong> d’utilització d’un <strong>motor</strong> gràfics<br />

o Estudi <strong>de</strong> les Obscurances<br />

o Estudi <strong>de</strong>l <strong>motor</strong> Crystal Space<br />

o Implementació <strong>de</strong> les Obscurances en temps real en el Crystal Space.<br />

12


1.3. Esctructuració <strong>de</strong>ls continguts<br />

Els diferents capítols <strong>de</strong> que consta aquest dossier son els següents:<br />

Tema 1: Introducció (aquest capítol).<br />

Introducció<br />

Tema 2: <strong>Desenvolupament</strong> <strong>de</strong> vi<strong>de</strong>ojocs. Expliquem quines son les fases en el<br />

<strong>de</strong>senvolupament d’un vi<strong>de</strong>ojoc així com les persones implica<strong>de</strong>s, les parts que formen<br />

un vi<strong>de</strong>ojoc a més d’explicar diferents llibreries i <strong>motor</strong>s gràfics que s’utilitzen pel<br />

<strong>de</strong>senvolupament.<br />

Tema 3: <strong>Desenvolupament</strong> <strong>de</strong>l projecte, on realitzarem un <strong>de</strong>senvolupament <strong>pràctic</strong>,<br />

el mèto<strong>de</strong> d’il·luminació anomenat Obscurances, utilitzan un <strong>motor</strong> gràfic, s’analitzen<br />

<strong>de</strong>s <strong>de</strong>l punt <strong>de</strong> vista d’anàlisis, disseny i implementació, valoració <strong>de</strong>ls resultats<br />

obtinguts i els treballs futurs.<br />

Annexes: Els annexes recullen tota la informació que hem trobat interessant respecte el<br />

projecte però que no te una importància molt rellevant per al <strong>de</strong>senvolupament <strong>de</strong>l<br />

mateix.<br />

Bibliografia: s’enumeren les fonts <strong>de</strong> referència que hem utilitzat per la realització <strong>de</strong>l<br />

projecte.<br />

13


2. <strong>Desenvolupament</strong> <strong>de</strong> vi<strong>de</strong>ojocs<br />

Projecte<br />

Un vi<strong>de</strong>ojoc és un programari molt complex [4], en el que intervenen gran quantitat <strong>de</strong><br />

recursos, tant materials com humans. El <strong>de</strong>senvolupament d’un vi<strong>de</strong>ojoc mínimament<br />

comercial (amb una certa qualitat d’innovació, jugabilitat, impacte visual i complexitat)<br />

és un procés llarg, habitualment solen tardar d’un a dos anys en finalitzar-se, en el que<br />

cal una bona planificació i gestió <strong>de</strong> tots els recursos disponibles. Podríem dir que un<br />

vi<strong>de</strong>ojoc equival a la producció d’una pel·lícula, però tenint en compte que en la<br />

pel·lícula <strong>de</strong>l vi<strong>de</strong>ojoc el personatge principal serà el jugador.<br />

En aquest apartat analitzarem les persones involucra<strong>de</strong>s en la realització d’un vi<strong>de</strong>ojoc,<br />

com hem comentat anteriorment estem en la categoria d’un vi<strong>de</strong>ojoc mínimament<br />

complex on no hi tenen cabuda vi<strong>de</strong>ojocs <strong>de</strong>l tipus web (flash) o vi<strong>de</strong>ojocs simples que<br />

po<strong>de</strong>n ser realitzats per una persona en poc temps (mesos), parlem dons <strong>de</strong> projectes <strong>de</strong><br />

vi<strong>de</strong>ojocs que serien comparables a grans projectes d’enginyeria <strong>de</strong>l programari. També<br />

parlarem <strong>de</strong>l cicle <strong>de</strong> vida <strong>de</strong> la producció d’un vi<strong>de</strong>ojoc, d’una petita introducció a la<br />

planificació i gestió, i per últim entrarem en <strong>de</strong>tall en l’estructura interna d’un vi<strong>de</strong>ojoc<br />

(els subsistemes que en formen part) i <strong>de</strong> les eines/llibreries/<strong>motor</strong>s per tal <strong>de</strong><br />

<strong>de</strong>senvolupar cada subsistema, passant per una comparativa <strong>de</strong>ls <strong>motor</strong>s <strong>de</strong> vi<strong>de</strong>ojocs<br />

que és po<strong>de</strong>n utilitzar en el <strong>de</strong>senvolupament.<br />

2.1. L’equip <strong>de</strong> <strong>de</strong>senvolupament<br />

Com en qualsevol altre projecte <strong>de</strong> <strong>de</strong>senvolupament, ja sigui projectes <strong>de</strong> construcció,<br />

ja sigui projectes <strong>de</strong> <strong>de</strong>senvolupament <strong>de</strong> software, hi ha diferents persones amb<br />

diferents perfils especialitzats que s’encarreguen <strong>de</strong> petites parts <strong>de</strong>l projecte [3][4][5].<br />

Les diferents persones/equips en les que és divi<strong>de</strong>ix el projecte d’un vi<strong>de</strong>ojoc son:<br />

1. Producció<br />

2. Disseny<br />

3. Programació<br />

4. Artistes<br />

5. Testeig<br />

2.1.1 Producció<br />

El productor és la persona encarregada d’explicar les parts fortes <strong>de</strong>l nostre vi<strong>de</strong>ojoc,<br />

tant al <strong>de</strong>partament <strong>de</strong> ven<strong>de</strong>s, com a marketing. Entén com el joc participa en els<br />

objectius <strong>de</strong> la companyia i pot explicar el per que és bo mantenir la producció en<br />

<strong>de</strong>senvolupament. Algunes empreses l’anomenen director <strong>de</strong> projectes, cap <strong>de</strong> projectes<br />

o director.<br />

14


Projecte<br />

S’encarrega també <strong>de</strong> controlar que les diferents tasques s’acabin en els terminis<br />

previstos, controla els riscos que po<strong>de</strong>n sorgir durant el <strong>de</strong>senvolupament, etc.<br />

Alguns <strong>de</strong>ls riscos que po<strong>de</strong>n sorgir son:<br />

• Què passa si l’entorn <strong>de</strong> <strong>de</strong>senvolupament no arribà en el temps previst ?.<br />

• Què passa si la programació <strong>de</strong> la “intel·ligència artificial” té un cost <strong>de</strong> temps<br />

superior al temps que es va planificar ?<br />

• Què passa si un programador <strong>de</strong>l <strong>motor</strong> gràfic es retarda amb una característica<br />

especial ?.<br />

Les diferents persones en el grup <strong>de</strong> Producció són:<br />

• Productor extern<br />

• Productor intern<br />

• Productor associat o assistent<br />

Productor extern<br />

Treballa per a un publicador i es responsabilitza per a que l’empresa que <strong>de</strong>senvolupa<br />

el joc compleixi els terminis previstos amb les característiques espera<strong>de</strong>s. Una altra<br />

funció <strong>de</strong>l productor extern està en aprovar pagaments, encarregar-se <strong>de</strong> la compra <strong>de</strong><br />

hardware necessari pel <strong>de</strong>senvolupament, en general d’aportar a l’equip <strong>de</strong><br />

<strong>de</strong>senvolupament tot el necessari per que pugin generar el <strong>de</strong>senvolupament.<br />

Productor intern<br />

Gestiona tot l’equip <strong>de</strong> <strong>de</strong>senvolupament directament i notifica <strong>de</strong> l’estat actual a<br />

l’empresa (normalment per a la que treballa l’equip <strong>de</strong> <strong>de</strong>senvolupament) o un<br />

publicador extern.<br />

Gestiona l’equip <strong>de</strong> <strong>de</strong>senvolupament i el representa al mon exterior (incloen els<br />

publicadors, marketing i <strong>de</strong>partament <strong>de</strong> compres). Algunes empreses l’anomenen<br />

director <strong>de</strong> projectes, cap <strong>de</strong> projectes o director.<br />

Assistents i Productors associats<br />

Els objectius d’aquest paper dins la tasca <strong>de</strong> producció varia d’un equip a un altre. Però<br />

les missions que principalment <strong>de</strong>senvolupa son:<br />

• Gestió d’actius. Gestiona les diferents versions <strong>de</strong> documents / fitxers que<br />

apareixen durant el <strong>de</strong>senvolupament. Controla les versions que hi ha en els<br />

diferents servidors <strong>de</strong> l’empresa, etc.<br />

15


Projecte<br />

• Supervisió <strong>de</strong> les compilacions diàries i les copies <strong>de</strong> seguretat. Els assistents<br />

tenen l’objectiu <strong>de</strong> supervisar que cada dia és realitzin copies <strong>de</strong> seguretat <strong>de</strong> tots<br />

els documents / fitxers que s’originen.<br />

• Manteniment <strong>de</strong>l disseny <strong>de</strong> la web. Una manera <strong>pràctic</strong>a i ràpida <strong>de</strong> disposar<br />

<strong>de</strong> tota la informació referents als diferents equips <strong>de</strong> treball, les seves tasques,<br />

els punts on estan dintre d’aquestes tasques, etc, és via una Intranet. En la<br />

intranet els diferents components <strong>de</strong> treball po<strong>de</strong>n veure en quins punts/tasques<br />

estan els altres equips <strong>de</strong> treball d’una manera ràpida. La persona encarregada <strong>de</strong><br />

mantenir aquesta informació “actualitzada” sol ser habitualment el productor<br />

associat.<br />

• Generació <strong>de</strong> “pantalles” <strong>de</strong>l joc i donar suport al productor. Quan un joc és<br />

anunciat al públic, moltes vega<strong>de</strong>s hi ha una forta <strong>de</strong>manda <strong>de</strong> “pantalles” <strong>de</strong>l<br />

joc. És tracta doncs <strong>de</strong> generar “pantalles” interessants, mostrar els “bocetos” <strong>de</strong>l<br />

joc, etc. Intentant sempre mostrar les millors “pantalles” per tal <strong>de</strong> que el públic<br />

consi<strong>de</strong>ri el joc un <strong>de</strong>ls millors jocs <strong>de</strong>senvolupats. Una altra funció <strong>de</strong>ls<br />

productors associats/assistents està en preparar les <strong>de</strong>mos que és posaran a<br />

disposició <strong>de</strong>l públic, <strong>de</strong> les revistes especialitza<strong>de</strong>s, etc.<br />

• Revisió <strong>de</strong> les etapes importants en el <strong>de</strong>senvolupament. Quan una etapa és<br />

consi<strong>de</strong>ra tancada, és feina <strong>de</strong>l productor associat controlar que els diferents<br />

materials superen els requeriments establerts, per tal d’assegurar que la qualitat<br />

final és bona.<br />

• Altres tasques no contempla<strong>de</strong>s. Hi ha infinitat <strong>de</strong> petites tasques que no es<br />

contemplen durant el <strong>de</strong>sevnolupament. Habitualment recau sobre el productor<br />

associat la responsabilitat <strong>de</strong> dur-les a terme. Un exemple seria <strong>de</strong>manar pizzes<br />

per a l’equip <strong>de</strong> <strong>de</strong>senvolupament per a sessions nocturnes <strong>de</strong> treball, preparar<br />

les màquines per a enviar-les a fires <strong>de</strong> vi<strong>de</strong>ojocs, etc.<br />

2.1.2 Disseny<br />

El dissenyador <strong>de</strong>l joc (que a vega<strong>de</strong>s actua com escriptor) s’encarrega <strong>de</strong> crear el<br />

document <strong>de</strong> disseny i l’actualitza a mesura que avança el <strong>de</strong>senvolupament.<br />

Documenta els mecanismes <strong>de</strong> jugabilitat <strong>de</strong>l joc i també avalua noves i<strong>de</strong>es per<br />

<strong>de</strong>terminar si enriqueixen o no al joc.<br />

El dissenyador treballa amb els artistes <strong>de</strong>l storyboard per dissenyar la introducció, les<br />

pel·lícules i curts intermedis. Si actua també com a escriptor, crearà tots els diàlegs <strong>de</strong>l<br />

joc i probablement realitzarà els primers esquemes <strong>de</strong>l manual. Si no actua com<br />

escriptor, llavors dirigirà a un escriptor professional que farà la feina d’escriure els<br />

dialegs, guió, etc.<br />

El dissenyador habitualment dirigeix a l’equip <strong>de</strong> disseny <strong>de</strong> nivells. Crea el flux <strong>de</strong>l joc<br />

i dirigeix l’equip <strong>de</strong> disseny <strong>de</strong> nivells per a que creï les petites unitats que s’afegiran al<br />

flux.<br />

Al mateix temps l’equip <strong>de</strong> disseny col·labora amb el <strong>de</strong>partament <strong>de</strong> programació per<br />

construir la web <strong>de</strong>l vi<strong>de</strong>joc i amb el <strong>de</strong>partament <strong>de</strong> marketing per crear la publicitat,<br />

els fulls informatius <strong>de</strong>l joc, les caixes <strong>de</strong>l joc, etc.<br />

16


Està compost per els següents rols:<br />

• Dissenyador <strong>de</strong>l joc<br />

• Dissenyador <strong>de</strong> nivells<br />

• L’escriptor<br />

Dissenyador <strong>de</strong>l joc<br />

Projecte<br />

El dissenyador <strong>de</strong>l joc és la persona responsable <strong>de</strong> dissenyar un vi<strong>de</strong>ojoc que<br />

entretingui als jugadors. Habitualment, però no sempre, el dissenyador <strong>de</strong>l joc és la<br />

persona que té la i<strong>de</strong>a inicial <strong>de</strong>l que serà el vi<strong>de</strong>ojoc (té la pel·lícula en el seu cap). És la<br />

persona encarregada <strong>de</strong> filtrar les noves i<strong>de</strong>es aporta<strong>de</strong>s per els diferents elements <strong>de</strong><br />

l’equip i ha <strong>de</strong> ser capaç <strong>de</strong> <strong>de</strong>cidir si les noves i<strong>de</strong>es aporten millores o no al joc.<br />

Molts vi<strong>de</strong>ojocs solen incorporar llenguatges <strong>de</strong> script per tal permetre que els<br />

dissenyadors puguin provar les seves i<strong>de</strong>es directament contra el joc i no requereixin <strong>de</strong><br />

coneixement tècnics <strong>de</strong> programació.<br />

Dissenyador <strong>de</strong> nivells<br />

És la persona encarrega <strong>de</strong> dissenyar els diferents nivells <strong>de</strong>l joc, <strong>de</strong> generar els diferents<br />

elements interconnectats <strong>de</strong>l flux <strong>de</strong>l joc.<br />

L’escriptor<br />

Desenvolupa els diferents diàlegs que apareixen durant el joc, ja sigui quan el<br />

personatge principal interactua amb altres personatges o bé quan realitza <strong>de</strong>termina<strong>de</strong>s<br />

accions.<br />

2.1.3 Programació<br />

Els programadors són les persones encarrega<strong>de</strong>s <strong>de</strong> transformar els diferents mo<strong>de</strong>ls,<br />

textures, nivells, guions en la realitat que serà el programa informàtic que entetindrà als<br />

diferents jugadors.<br />

En aquest equip <strong>de</strong>staquem els diferents rols:<br />

• Cap <strong>de</strong> programació<br />

• Programadors<br />

17


Cap <strong>de</strong> programació<br />

Projecte<br />

El cap <strong>de</strong> programació té un paper important en el <strong>de</strong>senvolupament <strong>de</strong>l vi<strong>de</strong>ojoc. Està<br />

present en les primeres etapes <strong>de</strong>l <strong>de</strong>senvolupament juntament amb el productor,<br />

dissenyador i el cap d’artistes.<br />

La primera tasca <strong>de</strong>l cap <strong>de</strong> programació és en inspirar a l'equip <strong>de</strong> programadors <strong>de</strong> que<br />

el vi<strong>de</strong>ojoc és tecnicament factible i mostrant les àrees d'innovació/reptes per l'equip. La<br />

següent tasca està en la plataforma per la que es <strong>de</strong>senvoluparà (pc, xbox, playstation<br />

2,...), d'aquesta manera es crearà un programari que aprofitarà les avantatges <strong>de</strong> cada<br />

plataforma i compensarà les mancances.<br />

Durant la fase <strong>de</strong> preproducció, el cap <strong>de</strong> projectes crea el pla tècnic on s’enumera les<br />

diferents tasques a <strong>de</strong>senvolupar i estima la planificació/terminis, treballadors, etc, que<br />

calen per completar el projecte.<br />

Durant la fase <strong>de</strong> producció gestiona les diferents tasques <strong>de</strong>ls programadors i la seva<br />

planificació i explica l'estat actual <strong>de</strong> les fases <strong>de</strong> <strong>de</strong>senvolupament al productor, si té<br />

temps també programarà algunes parts <strong>de</strong> l'aplicació.<br />

Programadors<br />

Els programadors son les persones encarrega<strong>de</strong>s <strong>de</strong> donar vida als diferents mo<strong>de</strong>ls,<br />

textures, nivells <strong>de</strong>l vi<strong>de</strong>ojoc. Solen treballar conjuntament amb els dissenyadors per tal<br />

d'evitar confusions a la hora d'entendre l’esència <strong>de</strong>l joc.<br />

Hi ha diferents àrees dintre <strong>de</strong> l'equip <strong>de</strong> <strong>de</strong>senvolupament, habitualment els<br />

programadors solen tocar diferents àrees al mateix temps. A continuació mostrem<br />

algunes <strong>de</strong>ls diferents apartats:<br />

• Motor <strong>de</strong> ren<strong>de</strong>ring<br />

• Intel·ligència artificial<br />

• Física<br />

• Eines<br />

• Base <strong>de</strong> da<strong>de</strong>s<br />

• Xarxa i multijugador<br />

• Efectes gràfics<br />

• Efectes <strong>de</strong> só<br />

• Llenguatges d'script<br />

• Lògica <strong>de</strong>l joc<br />

• La interfície d'entrada/sortida<br />

Motor <strong>de</strong> ren<strong>de</strong>ring<br />

Consisteix en tot el <strong>motor</strong> que permet mostrar/visualitzar els diferents elements <strong>de</strong>l joc<br />

(personatges, edificis, ...). Es a dir és la part que “dibuixa” en la pantalla els escenaris,<br />

personatges, etc, i permet que els jugadors pugin veure per la pantalla aquests elements.<br />

18


Intel·ligència artificial<br />

Projecte<br />

El comportament <strong>de</strong>ls personatges que no controla cap jugador estarà guiat per diferents<br />

algorismes <strong>de</strong> IA. La planificació <strong>de</strong> rutes <strong>de</strong>l personatge (per exempe, per on passarà<br />

per anar <strong>de</strong>l punt A al punt B dins el mapa el personatge) per tal <strong>de</strong> que no passi per<br />

zones “prohibi<strong>de</strong>s” com parets, cotxes, etc.<br />

Física<br />

S'encarregarà <strong>de</strong> tot els càlculs matemàtics <strong>de</strong>stinats per exemple a trobar la velocitat <strong>de</strong>l<br />

vehicle, trobar les forces que fan que el vehicle <strong>de</strong>rrapi, a la <strong>de</strong>tecció <strong>de</strong> colisions <strong>de</strong>l<br />

personatge amb l'entorn, etc.<br />

Eines<br />

Per tal <strong>de</strong> facilitar la feina a les persones no programadores, es <strong>de</strong>senvolupen un seguit<br />

d'eines que aju<strong>de</strong>n per exemple a crear les textures <strong>de</strong>ls personatges, els nivells <strong>de</strong>l joc,<br />

per modificar els scripts que controlen el comportament <strong>de</strong>ls personatges, etc.<br />

Base <strong>de</strong> da<strong>de</strong>s<br />

S'encarrega <strong>de</strong> totes les tasques relaciona<strong>de</strong>s a guardar la informació <strong>de</strong>ls estats <strong>de</strong>ls<br />

diferents personatges en un moment <strong>de</strong>terminat. Són comuns en tots els jocs les opcions<br />

<strong>de</strong> guardar la partida per posteriorment recuperar-la.<br />

Xarxa i multijugador<br />

La seva funció és la <strong>de</strong> donar suport al joc simultani entre diferents jugadors a través <strong>de</strong><br />

la xarxa o bé a diferents jugadors jugant al mateix temps en la mateix màquina (cas típic<br />

<strong>de</strong>l joc amb pantalla partida, una part per cada jugador). Tot i que cada cop més s’exten<br />

més la opció <strong>de</strong>l multijagador en xarxa encara a dia d’avui les noves vi<strong>de</strong>oconsoles<br />

permeten l’opció <strong>de</strong> multijugador en la mateixa màquina (cas <strong>de</strong> la GameCub que<br />

permet 4 jugadors i la Xbox que en permet 2).<br />

Efectes gràfics<br />

Durant el joc hi han efectes gràfics que simulen per exemple el foc, els llamps, la pluja,<br />

els reflexes, etc. Tots aquets efectes especials es <strong>de</strong>senvolupen en aquesta part.<br />

19


Efectes <strong>de</strong> só<br />

Projecte<br />

Al igual que en els efectes gràfics, els efectes <strong>de</strong> só simulen efectes, en aquest cas<br />

sonors resultat d'algun event <strong>de</strong>l jugador, alguna acció <strong>de</strong>ls personatges no jugadors,<br />

<strong>de</strong>ls trets d'armes <strong>de</strong> focs, etc.<br />

Llenguatges <strong>de</strong> script<br />

Amb el mateix objectiu que l'apartat d'eines, els llenguatges <strong>de</strong> script són una manera<br />

comoda <strong>de</strong> que persones sense coneixement <strong>de</strong> programació puguin modificar el<br />

comportament per exemple <strong>de</strong>ls enemics <strong>de</strong>l joc, canviar l'aspecte <strong>de</strong>ls personatges, etc.<br />

Lògica <strong>de</strong>l joc<br />

És on es connecta els diferents mòduls (física, so, gràfics, scripts, ren<strong>de</strong>ring, etc) <strong>d'un</strong>a<br />

manera seqüencial per tal <strong>de</strong> donar vida al vi<strong>de</strong>ojoc.<br />

Interfície d'entrada/sortida<br />

Aquesta part té com objectiu comunicar al jugador amb el joc, ja sigui mitjançant el<br />

teclat, el ratolí, el joystick, el pad, etc, en resum té com objectiu <strong>de</strong>senvolupar els<br />

mecanismes per al control per part <strong>de</strong>l jugador <strong>de</strong>l vi<strong>de</strong>ojoc.<br />

2.1.4 Art<br />

L'equip <strong>de</strong>dicats a l'art té com objectiu donar al vi<strong>de</strong>ojoc l'aspecte contemplat en el<br />

disseny <strong>de</strong>l joc. Aquest aspecte pot anar <strong>de</strong>s <strong>de</strong>l disseny <strong>de</strong> les interfícies <strong>de</strong> les pantalles<br />

fins a la representació <strong>de</strong>l mon en la pantalla, passant pels efectes especials, el<br />

mo<strong>de</strong>latge <strong>de</strong>ls personatges, etc.<br />

En aquest equip <strong>de</strong>staquem els diferents rols:<br />

• Cap d'artistes<br />

• Artistes<br />

Cap d’artistes<br />

Aquesta persona dins l'equip <strong>de</strong> <strong>de</strong>senvolupament <strong>de</strong>l joc és el responsable <strong>de</strong> l'aspecte<br />

<strong>de</strong>l joc, hi està a mig camí entre l'equip <strong>de</strong> disseny, l'equip <strong>de</strong> programació, i l'equip <strong>de</strong><br />

gestió. La seva funció està en analitzar el que <strong>de</strong>ssitja el dissenyador, treballar amb el<br />

cap <strong>de</strong> programació per establir el camí <strong>de</strong> producció i <strong>de</strong>terminar l'abast <strong>de</strong> les tasques<br />

20


Projecte<br />

artístiques, com pot ser <strong>de</strong>terminar el nombre <strong>de</strong> treballadors necessaris <strong>d'un</strong> tipus<br />

concret, el temps per realitzar les diferents fases, etc.<br />

Quan treballa amb el dissenyador el seu objectiu està en establir l'aparença/estil <strong>de</strong>l<br />

vi<strong>de</strong>ojoc que s'utilitzarà per les interfices, els menus, els personatges, els entorns, etc.<br />

Tot aquest estil s'afegirà a un document anomentat la guia d'estils, on es recolliran els<br />

recursos visuals que tots els artístess consultaràn quan vulguin crear nous materials /<br />

conceptes <strong>de</strong>l joc.<br />

Quan treballa amb el cap <strong>de</strong> programació, tots dos creen el camí <strong>de</strong> producció intentant<br />

que les eines per generar continguts <strong>de</strong>ls artistes permetin veure els resultats el més<br />

ràpidament possible dintre <strong>de</strong>l joc (ja sigui a partir <strong>de</strong> scripts, eines fetes a mida, etc).<br />

Artistes<br />

Els artístes son les persones encarrega<strong>de</strong>s <strong>de</strong> <strong>de</strong>senvolupar els nous materials,<br />

personatges, interfícies, etc, seguint la guia d'estils.<br />

Dintre d'aquest grup trobem tres tipus <strong>de</strong> <strong>de</strong>dicacions:<br />

• Concepte<br />

• Mo<strong>de</strong>ladors <strong>de</strong> personatges<br />

• Animadors<br />

• Mo<strong>de</strong>ladors <strong>de</strong> fons<br />

• Textures<br />

Conceptes<br />

Els artistes <strong>de</strong> conceptes treballen amb el dissenyador per crear l'aparença <strong>de</strong>l joc via<br />

“esbos” <strong>de</strong>ls personatges, <strong>de</strong> les pantalles, etc.<br />

Mo<strong>de</strong>ladors <strong>de</strong> personatges<br />

Els mo<strong>de</strong>ladors dissenyen i creen els personatges, criatures i objectes utilitzant paquets<br />

3D com po<strong>de</strong>n ser el 3D Studio Max o Maya.<br />

Animadors<br />

Els animadors fan possible que els personatges dissenyats pels mo<strong>de</strong>ladors cobrin vida.<br />

S’encarregen <strong>de</strong> crear els moviments que faran els personatges, criatures, objectes, etc.<br />

Mo<strong>de</strong>ladors <strong>de</strong> fons<br />

Construeixen el mon per el que els personatges es mouran, combinant objectes, textures,<br />

il·luminació, etc.<br />

21


Textures<br />

Projecte<br />

Son els creadors <strong>de</strong> les textures <strong>de</strong>ls diferents personatges que es colocaran sobre els<br />

mo<strong>de</strong>ls, a les imatges <strong>de</strong> fons, etc.<br />

2.1.5 Testeig<br />

Els testers son una part fonamental en tot <strong>de</strong>senvolupament <strong>de</strong>gut a la seva tasca<br />

continua <strong>de</strong> trobar els diferents errors/problemes que po<strong>de</strong>n sorgir en la programació, en<br />

conseqüència <strong>de</strong> <strong>de</strong>scuits <strong>de</strong> l'equip <strong>de</strong> programadors.<br />

Cap <strong>de</strong> testeig<br />

La funció <strong>de</strong>l cap <strong>de</strong> testers està en coordinar l'equip <strong>de</strong> treball que provarà totes les<br />

característiques <strong>de</strong>l vi<strong>de</strong>joc, intentant trobar errors fruit <strong>d'un</strong> <strong>de</strong>scuit per part <strong>de</strong>ls<br />

programadors.<br />

Al començament <strong>de</strong>l projecte, el seu paper es bassa en aportar un feedback cap als<br />

programadors, per tal <strong>de</strong> que arreglin els erros, millorin la jugabilitat, etc.<br />

Quan el vi<strong>de</strong>ojocs es va aproximant a la versió alpha (fase on el vi<strong>de</strong>ojoc és poc jugable<br />

<strong>de</strong> començament a fi), es <strong>de</strong>dica a preparar el pla <strong>de</strong> testeig (pren com a partida el<br />

document <strong>de</strong> disseny), a partir <strong>de</strong>l qual es buscarà falla<strong>de</strong>s en el joc. El cap <strong>de</strong> testers ha<br />

d'estar en sincronia amb el dissenyador i els programadors ja que ha <strong>de</strong> saber en tot<br />

moment l'estat actual <strong>de</strong>l joc.<br />

Testejadors<br />

Els testers són les persones que proven el vi<strong>de</strong>ojoc, i troben les possibles mancances en<br />

jugabilitat, usabilitat, divertiment, requeriments, etc. Els testers proven el joc <strong>de</strong> moltes<br />

maneres diferents, sempre intentant emular la infinitat <strong>de</strong> tipus <strong>de</strong> persones que jugaran<br />

al joc.<br />

2.1.6 Recursos Externs<br />

Hi ha una serie <strong>de</strong> recursos que es solen subcontractar a empreses especialitza<strong>de</strong>s o a<br />

professionals in<strong>de</strong>pen<strong>de</strong>nt per tal <strong>de</strong> dotar al joc <strong>d'un</strong> ambient “cinematogràfic” en el só,<br />

la música, etc.<br />

Alguns recursos externs solen ser:<br />

• Veu <strong>de</strong>ls personatges<br />

• Música<br />

22


• Efectes <strong>de</strong> só<br />

• Ví<strong>de</strong>o<br />

• Manual<br />

• Normativa legal<br />

Projecte<br />

23


Projecte<br />

2.2 Fases en el <strong>de</strong>senvolupament <strong>d'un</strong> vi<strong>de</strong>ojoc,<br />

Cicle <strong>de</strong> Vida <strong>de</strong>l projecte i Documents<br />

Alguns jocs són <strong>de</strong>senvolupats ens sis mesos, d’altres en molts anys [4][5][6]. Però cada<br />

vi<strong>de</strong>ojoc <strong>de</strong>senvolupat passa per una sèrie <strong>de</strong> fases ben <strong>de</strong>fini<strong>de</strong>s que han es<strong>de</strong>vingut<br />

estàndards en la indústria.<br />

A l’igual que en qualsevol projecte <strong>de</strong> enginyeria <strong>de</strong>l programari, el <strong>de</strong>senvolupament<br />

d’un vi<strong>de</strong>ojoc té una sèrie <strong>de</strong> fases. A continuació expliquem el cicle <strong>de</strong> vida.<br />

Desenvolupar el Concepte<br />

Figura 2.2.1: Cicle <strong>de</strong> vida <strong>de</strong>senvolupament vi<strong>de</strong>ojocs<br />

L’objectiu principal d’aquesta fase es la <strong>de</strong>cidir com serà el nostre vi<strong>de</strong>ojoc, es a dir,<br />

<strong>de</strong>terminarem els diferents elements <strong>de</strong> jugabilitat <strong>de</strong>l joc, crearem el concepte artístic<br />

per mostrar com serà el joc i quin aspecte gràfic tindrà, a més <strong>de</strong> <strong>de</strong>terminar la història<br />

que l’envolta, tot es realitza a partir <strong>de</strong> la i<strong>de</strong>a original <strong>de</strong>l joc. El resultat d’aquesta fase<br />

serà un document que servirà per la següent fase <strong>de</strong> proposta <strong>de</strong> projecte que<br />

correspondria a la fase d’estudi <strong>de</strong> requeriment en l’enginyeria <strong>de</strong>l programari.<br />

El grup <strong>de</strong> persones que <strong>de</strong>senvolupen aquesta fase sol ser petit. Està format bàsicament<br />

per un dissenyador, el cap <strong>de</strong> projectes tecnològic, un artista creatiu i un productor.<br />

24


Proposta <strong>de</strong> projecte<br />

Projecte<br />

La proposta <strong>de</strong> projecte és el document que s’utilitza per <strong>de</strong>senvolupar el nostre<br />

vi<strong>de</strong>ojoc. Conté en poques pàgines informació sobre el joc, el per què serà un èxit <strong>de</strong><br />

mercat i com farà diners. El document es dividit en diferents seccions:<br />

• High Concept<br />

• Característiques<br />

• Història<br />

• Mecanismes <strong>de</strong> jugabilitat<br />

El High Concept<br />

El concepte general <strong>de</strong>l joc o High Concept és la i<strong>de</strong>a que <strong>de</strong>fineix el nostre vi<strong>de</strong>ojoc.<br />

Podríem <strong>de</strong>finir-lo com el “ganxo” que fa al nostre joc més excitant i el diferencia <strong>de</strong> la<br />

competència.<br />

Un High Concept fort ens ajuda durant la fase <strong>de</strong> <strong>de</strong>senvolupament perquè és útil per<br />

<strong>de</strong>cidir quines característiques incloure o quines <strong>de</strong>ixar fora <strong>de</strong>l nostre vi<strong>de</strong>ojoc.<br />

Característiques<br />

És la llista <strong>de</strong> característiques <strong>de</strong>l que faran al nostre joc excepcional, és a dir, <strong>de</strong>s <strong>de</strong><br />

quina tecnologia gràfica utilitzarem, per exemple si utilitza els últims algorismes <strong>de</strong><br />

il·luminació realista, l’estil <strong>de</strong>ls gràfics, si utilitza so envolvent dobly per exemple, etc.<br />

Normalment aquesta llista <strong>de</strong> característiques es la que apareixerà en la part posterior <strong>de</strong><br />

la caixa <strong>de</strong>l joc.<br />

La Història<br />

Aquesta part és un resum <strong>de</strong>ls diferents personatges <strong>de</strong>l joc (tant els principals siguin<br />

bonx o dolents, com els secundaris), com guanyaran els bons als dolents. A més inclou<br />

la història que envolta el vi<strong>de</strong>ojoc.<br />

Mecanismes <strong>de</strong> jugabilitat<br />

Descriu el que fan els personatges, com interactiuen i com s’utilitzen dins el joc.<br />

Aquesta part <strong>de</strong>pen <strong>de</strong>l gènere <strong>de</strong>l vi<strong>de</strong>ojoc.<br />

25


Preproducció<br />

Projecte<br />

L’objectiu d’aquesta fase és la <strong>de</strong> completar el disseny <strong>de</strong>l joc, crear els conceptes<br />

artístics, establir la planificació, el pla <strong>de</strong> projecte, i fer prototipus tècnics que <strong>de</strong>mostrin<br />

la factibilitat d’utilitzar les noves tecnologies que nosaltres <strong>de</strong>sitgem fer servir en el<br />

<strong>de</strong>senvolupament <strong>de</strong>l nostre vi<strong>de</strong>ojoc.<br />

Si som uns <strong>de</strong>senvolupadors in<strong>de</strong>pen<strong>de</strong>nts, els nostres publicadors po<strong>de</strong>n utilitzar<br />

aquesta fase com una presa <strong>de</strong> contacte per tal <strong>de</strong> <strong>de</strong>terminar si ens ajustem a les seves<br />

expectatives, per exemple als temps d’entrega.<br />

Els resultats d’aquesta fase són diferents documents i diferents prototipus <strong>de</strong>l producte<br />

final.<br />

Les diferents fases que composen la preproducció són:<br />

• Disseny <strong>de</strong>l vi<strong>de</strong>ojoc<br />

• Compendi artístic<br />

• Camí <strong>de</strong> producció<br />

• Disseny tècnic<br />

• Pla <strong>de</strong> projecte<br />

• Prototipus<br />

Document <strong>de</strong> disseny <strong>de</strong>l vi<strong>de</strong>ojoc<br />

Al final <strong>de</strong> l’etapa <strong>de</strong> preproducció obtindrem un document anomenat document <strong>de</strong><br />

disseny que explica d’una manera <strong>de</strong>tallada com serà, en que consistirà el vi<strong>de</strong>ojoc, es a<br />

dir contindrà les diferents especificacions <strong>de</strong> requeriments a partir <strong>de</strong> les quals<br />

elaborarem el pla tècnic. La combinació d’aquest dos documents ens servirà per crear el<br />

pla <strong>de</strong> projecte.<br />

Durant la fase <strong>de</strong> <strong>de</strong>senvolupament, aquest document <strong>de</strong> disseny ens servirà per<br />

<strong>de</strong>terminar les diferents experiències <strong>de</strong>l jugador dins el joc. Incorporarà diferent<br />

informació <strong>de</strong> la jugabilitat, la interfície d’usuari, la història, els personatges, els<br />

monstres, la intel·ligència artificial, etc, és a dir incorporarà tots els <strong>de</strong>talls que ens<br />

ajudin a entendre el que s’espera <strong>de</strong>l joc.<br />

Compendi artístic<br />

Els artistes durant el cicle <strong>de</strong> preproducció estableixen la imatge <strong>de</strong> com serà visualment<br />

el joc. La i<strong>de</strong>a d’aquesta fase està en establir un estil unificat per a tots els artistes<br />

involucrats a partir d’un compendi d’imatges que ens reflecteixin quin és l’estil visual<br />

<strong>de</strong>l joc, com són els personatges, les escenes, etc.<br />

26


El camí <strong>de</strong> producció<br />

Projecte<br />

S’entén per camí <strong>de</strong> producció els passos necessaris per passar <strong>de</strong> la i<strong>de</strong>a (la persona<br />

que te la i<strong>de</strong>a brillant <strong>de</strong> com serà el vi<strong>de</strong>joc) a la realitat (el programa d’ordinador).<br />

Necessitem trobar la manera més eficient <strong>de</strong> passar <strong>de</strong> les especificacions <strong>de</strong> disseny,<br />

als sketchs <strong>de</strong> conceptes, als mo<strong>de</strong>ls 3D, a les textures pel mo<strong>de</strong>l 3D, a l’animació <strong>de</strong>l<br />

mo<strong>de</strong>l, a aplicar Intel·ligència Artificial al personatge, fins a que tenim el personatge 3D<br />

dins el joc i po<strong>de</strong>m moure’l.<br />

Tots aquest seguit <strong>de</strong> passos requereixen d’una sèrie d’eines, <strong>de</strong>s d’editors <strong>de</strong> textures,<br />

fins a mo<strong>de</strong>ladors 3D. Però tots han <strong>de</strong> compartir una característica entre ells:<br />

compatibilitat. Tots han <strong>de</strong> ser compatibles entre la fase anterior i posterior, d’aquesta<br />

manera facilitem els passos d’importar / exportar entre una eina i la següent.<br />

En la fase <strong>de</strong> preproducció es treballen tots aquest aspectes. Els costos <strong>de</strong> comprar les<br />

eines necessàries o bé construir-les han <strong>de</strong> ser inclosos dins el pla <strong>de</strong> projecte.<br />

Document <strong>de</strong> disseny tècnic<br />

L’objectiu d’aquest document està en transformar el document <strong>de</strong> disseny <strong>de</strong> paraules a<br />

software. Estableix el camí <strong>de</strong> producció, mostra les diferents tasques <strong>de</strong> totes les<br />

persones implica<strong>de</strong>s en el <strong>de</strong>senvolupament i estima els temps per completar cada una<br />

<strong>de</strong> les tasques. Descriu també les eines que s’utilitzaran per construir el vi<strong>de</strong>ojoc,<br />

especificant en <strong>de</strong>tall quines eines són internes, quines es <strong>de</strong>senvoluparan<br />

específicament per aquest joc i quines es compraran. S’inclou també la llista <strong>de</strong>l<br />

hardware necessari a comprar així com els canvis necessaris en la infrastructura <strong>de</strong><br />

l’empresa (velocitat <strong>de</strong> la xarxa, copies <strong>de</strong> seguretat, etc) per tal <strong>de</strong> donar suport al<br />

<strong>de</strong>senvolupament.<br />

Pla <strong>de</strong>l projecte<br />

Ens <strong>de</strong>scriu com construirem el nostre vi<strong>de</strong>ojoc. Consisteix en la planificació <strong>de</strong> totes<br />

les tasques, estableix les <strong>de</strong>pendències entre totes elles, té en compte les hores extres, en<br />

<strong>de</strong>finitiva transforma tots els aspectes implicats en una planificació real. El projecte<br />

final està dividit en el pla <strong>de</strong> recursos, el pressupost i la planificació.<br />

El pla <strong>de</strong> recursos és una fulla <strong>de</strong> càlcul que inclou una llista <strong>de</strong> tot el personal que<br />

participa en el projecte, quan començaran, i com s’aplicaran els seus salaris al projecte.<br />

Pren com a partida el document tècnic, el temps d’adquisició <strong>de</strong>l hardware i estima els<br />

costos externs (veu, musica, ví<strong>de</strong>o) que influiran en el pressupost.<br />

El pla <strong>de</strong> projecte ha <strong>de</strong> ser actualitzat a mesura que avança el projecte. Existeixen<br />

programes per gestionar projectes que ens po<strong>de</strong>n ajudar a la planificació. Alguns<br />

d’aquest programes son el Mr.Projecte, KProject, KPlanner, etc.<br />

27


Projecte<br />

El pla <strong>de</strong> projecte també especifica les dates en les s’han d’acabar les tasques. Hem<br />

d’anar en compte amb dates molt estrictes, ja que una mala planificació pot portar al<br />

incompliment d’aquestes; a més d’aquestes dates <strong>de</strong>penen altres <strong>de</strong>partaments, per<br />

exemple el <strong>de</strong> Marketing que pot començar a fer campanyes <strong>de</strong> publicitat, pot començar<br />

a negociar amb revistes per a cobrir la història. Un altre <strong>de</strong>partament afectat pot ser el <strong>de</strong><br />

ven<strong>de</strong>s que pot haver negociat amb les distribuïdores les dates en les que el producte<br />

estarà disponible. Per tant una errada en el compliment <strong>de</strong> les dates pot ocasionar moltes<br />

pèrdues en les ventes, a part <strong>de</strong> perdre temps i diners en les tasques que realitzen tots els<br />

<strong>de</strong>partament implicats.<br />

Prototipus<br />

El resultat <strong>de</strong> tota la fase <strong>de</strong> preproducció és el prototipus. Normalment és un petit<br />

programa que captura en una pantalla l’essència que fa que el vi<strong>de</strong>ojoc sigui especial i<br />

es diferencií <strong>de</strong> la competència. Po<strong>de</strong>m trobar també com a prototipus material<br />

preren<strong>de</strong>ritzat que serà ren<strong>de</strong>ritzat en temps real durant el joc, com també po<strong>de</strong>m trobar<br />

petites <strong>de</strong>mostracions <strong>de</strong> que la tecnologia que volem <strong>de</strong>senvolupar és factible en temps<br />

real. Aquestes petites <strong>de</strong>mostracions no solen ser <strong>de</strong>s <strong>de</strong>l punt <strong>de</strong> vista artístic cap gran<br />

èxit, però <strong>de</strong>s <strong>de</strong>l punt <strong>de</strong> vista tecnològic ens po<strong>de</strong>m mostrar el que comentàvem<br />

anteriorment, és a dir, que la tecnologia que volem incloure dins el joc és possible.<br />

La i<strong>de</strong>a principal <strong>de</strong>l prototipus, a part <strong>de</strong> mostrar la visió <strong>de</strong>l joc, <strong>de</strong> la tecnologia, etc,<br />

també ens serveix per <strong>de</strong>mostrar que el nostre camí <strong>de</strong> producció està en funcionament<br />

i estem passant <strong>de</strong>l mon <strong>de</strong> les i<strong>de</strong>es al mon <strong>de</strong> la realitat d’una manera raonable i<br />

efectiva.<br />

<strong>Desenvolupament</strong><br />

El <strong>de</strong>senvolupament és el punt mestre, la fase crítica en tot el procés <strong>de</strong> creació d’un<br />

vi<strong>de</strong>ojoc. Aquesta fase pot portar <strong>de</strong> 6 mesos fins a 2 anys. L’inconvenient <strong>de</strong><br />

<strong>de</strong>senvolupaments excessivament llargs està en el risc <strong>de</strong> que les noves i<strong>de</strong>es<br />

incorpora<strong>de</strong>s al joc po<strong>de</strong>n aparèixer en altres jocs (ja no tenim innovació) o bé que la<br />

tecnologia utilitzada quedi <strong>de</strong>sfasada <strong>de</strong>gut als avenços en el hardware.<br />

La dificultat d’aquesta tasca està en la correcta planificació <strong>de</strong> les diferents subfases que<br />

s’han <strong>de</strong> realitzar. Les subfases grans s’han <strong>de</strong> dividir en noves sub-subtasques per<br />

acotar molt més les hores <strong>de</strong> <strong>de</strong>senvolupament, els terminis, etc.<br />

En l’apartat posterior es donaran unes pinzella<strong>de</strong>s <strong>de</strong> diferents tècniques <strong>de</strong> gestió , però<br />

po<strong>de</strong>m anomenar una sèrie <strong>de</strong> consells per realitzar una bona planificació:<br />

• Mantenir una bona comunicació en l’equip. Un component crític és el mantenir<br />

el document <strong>de</strong> disseny actualitzat i fàcilment accessible. Tot l’equip a <strong>de</strong> tenir<br />

molt clar que és el que s’ha <strong>de</strong> fer en tot moment, quines son les característiques<br />

<strong>de</strong>l joc, quina qualitat s’espera, etc.<br />

28


Alfa<br />

Projecte<br />

• Fer un seguiment <strong>de</strong> les tasques actuals contra la planificació real. Hem <strong>de</strong> saber<br />

en tot moment la situació <strong>de</strong> cada una <strong>de</strong> les subtasques respecte la planificació<br />

per tal <strong>de</strong> po<strong>de</strong>r aplicar mesures correctores, o <strong>de</strong> recuperació.<br />

• Mantenir la i<strong>de</strong>ntitat i esperit <strong>de</strong> l’equip, s’ha <strong>de</strong> treballar en equip, cada<br />

component <strong>de</strong> l’equip ha <strong>de</strong> confiar en els altres. Una bona manera d’obtenir<br />

confiança, i<strong>de</strong>ntitat, etc, és la d’organitzar sopars, sorti<strong>de</strong>s, partits <strong>de</strong> futbol, etc,<br />

amb el que aconseguirem que els components <strong>de</strong> l’equip es sentin units,confiïn<br />

uns amb els altres i es coneguin.<br />

L’estat d’alfa en qualsevol programa representa que aquest é funcional, però que encara<br />

s’han <strong>de</strong> polir certs aspectes en la interfície, hi ha petites característiques que encara<br />

s’han <strong>de</strong> <strong>de</strong>senvolupar i la jugabilitat / usabilitat s’han <strong>de</strong> millorar.<br />

En aquesta fase és quan el vi<strong>de</strong>ojoc o programa és vist i evaluat per gent externa al<br />

equip <strong>de</strong> <strong>de</strong>senvolupament per primera vegada.<br />

Beta<br />

Al arribar a aquesta fase, totes les característiques <strong>de</strong>l joc han estat finalitza<strong>de</strong>s, la<br />

usabilitat i jugabilitat han estat poli<strong>de</strong>s, el <strong>de</strong>senvolupament s’acaba, es fan proves en<br />

altres configuracions <strong>de</strong> hardware (targetes gràfiques, processadors, ...). La única cosa<br />

pen<strong>de</strong>nt està en arreglar els errors <strong>de</strong> programació (bugs) el més aviat possible.<br />

Aquesta fase representa habitualment un “viure pel treball” constant, on tots els<br />

components <strong>de</strong> l’equip realitzen proves, arreglen errors, ...<br />

En els últims dies <strong>de</strong> la fase beta es realitzen els preparatius <strong>de</strong> començar a realitzar el<br />

cd “mestre”. El cd es prova i les úniques modificacions al codi font que es permetran<br />

serà per corregir errors que no possibilitin el testeig, i s’entra en un bucle fins que no<br />

s’aconsegueixi un “release to manufacture”.<br />

Producció final<br />

Un cop un cd <strong>de</strong> la fase beta s’ha testeijat i s’ha trobat acceptable, es proce<strong>de</strong>ix a<br />

produir tots els cd que es vendran al mercat.<br />

Parches i Actualitzacions<br />

Un cop el vi<strong>de</strong>ojoc s’ha realitzat, l’equip <strong>de</strong> <strong>de</strong>senvolupament anirà realitzant parches,<br />

que solucionaran problemes <strong>de</strong>tectats amb hardware específic (per exemple amb un<br />

<strong>de</strong>terminat tipus <strong>de</strong> tarjeta gràfica el joc no ha funcionat).<br />

Les actualitzacions aportaran noves millores al joc, com la millora en la jugabilitat, nous<br />

escenaris, nous personatges, etc.<br />

29


Projecte<br />

2.3 Introducció a la Gestió i planificació <strong>de</strong>l<br />

<strong>de</strong>senvolupament<br />

En aquest apartat introduirem breument el concepte <strong>de</strong> gestió i planificació <strong>de</strong>l<br />

<strong>de</strong>senvolupament d’un joc.<br />

No hem d’oblidar que <strong>de</strong>senvolupar un vi<strong>de</strong>ojoc no <strong>de</strong>ixa <strong>de</strong> ser <strong>de</strong>senvolupar un<br />

projecte <strong>de</strong> software, per tant, per afrontar la realitat <strong>de</strong> construir un vi<strong>de</strong>ojoc hem <strong>de</strong><br />

partir <strong>de</strong> les tècniques d’enginyeria <strong>de</strong>l software.<br />

Les principals característiques per gestionar correctament un projecte <strong>de</strong> software [4]<br />

[16][18][19][20][21] son:<br />

• Començar per un disseny complert.<br />

• Desenvolupar un raonable pla tecnològic i una bona planificació.<br />

• Entendre el problema que ens ocupa, i treballar per resoldre’l.<br />

• Conèixer com recuperar-nos quan el nostre projecte es un <strong>de</strong>sastre.<br />

Segons la metodologia que seguim per <strong>de</strong>senvolupar el joc, podria ser que fos important<br />

abans <strong>de</strong> començar la fase <strong>de</strong> <strong>de</strong>senvolupament tenir enllestit el document <strong>de</strong> disseny<br />

<strong>de</strong>l joc. El document <strong>de</strong> disseny, com s’ha comentat en apartats anteriors, equival a la<br />

fase d’anàlisis <strong>de</strong> requeriments en el mon <strong>de</strong> l’enginyeria <strong>de</strong>l software. Aquest<br />

document correspon a les característiques que tindrà el joc, l’estil gràfic <strong>de</strong> la interfície,<br />

<strong>de</strong> les pantalles, etc.<br />

Començar la fase <strong>de</strong> <strong>de</strong>senvolupament sense tenir les i<strong>de</strong>es clares <strong>de</strong> com serà el joc,<br />

com seran les pantalles, etc, portarà la fase <strong>de</strong> <strong>de</strong>senvolupament a un caos continu. Hi ha<br />

estudis que <strong>de</strong>mostren que la millor solució està en perdre temps en planificar,<br />

dissenyar, establir l’abast <strong>de</strong>l projecte, i un cop aquestes tasques estan ben lliga<strong>de</strong>s<br />

procedir a la fase <strong>de</strong> <strong>de</strong>senvolupament.<br />

2.3.1 Planificació i calendaris<br />

Els passos per crear un bon calendari per a projectes <strong>de</strong> software son els següents:<br />

• Estimar la mida/abast <strong>de</strong>l projecte<br />

• Estimar l’esforç d’una persona/mes per <strong>de</strong>senvolupar un sistema <strong>de</strong> la grandària<br />

indicada.<br />

• Aplicar l’estimació persona/mes al nombre <strong>de</strong> persones en l’equip <strong>de</strong> treball i<br />

aplicar-la al calendari per po<strong>de</strong>r establir els terminis, costos, dies <strong>de</strong> vacances,<br />

etc.<br />

Hi ha una sèrie <strong>de</strong> problemes en les planificacions:<br />

• Abast<br />

• Pressións externes<br />

30


Abast<br />

• Modificació <strong>de</strong>ls requeriment<br />

Projecte<br />

Molts <strong>de</strong>ls projectes <strong>de</strong> software fracassen <strong>de</strong>gut a que cap persona <strong>de</strong> l’equip <strong>de</strong> treball<br />

s’ha pres la molèstia d’estudiar les dimensions <strong>de</strong>l projecte, a part d’aquest gran<br />

problema ens trobem amb planificacions i pressupostos fets per executius que no tenen<br />

coneixements <strong>de</strong> l’esforç necessari per entregar el projecte.<br />

L’abast consisteix en analitzar la grandària <strong>de</strong>l projecte en si. Per estudiar la mida hi ha<br />

moltes tècniques:<br />

• Acudir a expert externs.<br />

• Comparar les característiques <strong>de</strong>l vi<strong>de</strong>ojoc a <strong>de</strong>senvolupar amb altres jocs que<br />

s’han realitzat anteriorment i estimar l’abast a partir <strong>de</strong> l’experiència <strong>de</strong> qui fa<br />

l’estudi. Per tal <strong>de</strong> portar a terme aquest estudi històric, és una bona <strong>pràctic</strong>a que<br />

les persones que planifiquen i gestionen un projecte guardi els resultats <strong>de</strong> les<br />

planificacions i els resultats reals un cop acabat el projecte, per tal <strong>de</strong> comparar<br />

da<strong>de</strong>s i fer una aproximació més acurada.<br />

• Llegir pàgines web amb postmortem <strong>de</strong>l <strong>de</strong>senvolupament <strong>de</strong> vi<strong>de</strong>ojocs que han<br />

sortit al mercat, per tal d’estudiar els problemes que han tingut altres equips <strong>de</strong><br />

treball i po<strong>de</strong>r aprendre com els han solucionat.<br />

Pressions externes<br />

Solen ser unes bones polítiques <strong>de</strong> ven<strong>de</strong>s el produir uns <strong>de</strong>terminats productes en unes<br />

dates concretes. Pot ser el cas <strong>de</strong>ls vi<strong>de</strong>ojocs per exemple <strong>de</strong> futbol, no té cap sentit<br />

treure el vi<strong>de</strong>ojoc <strong>de</strong> la lliga <strong>de</strong>l 2004 a l’any 2005.<br />

És molt important que abans d’acceptar els terminis, calendari, alguna persona <strong>de</strong><br />

l’equip <strong>de</strong> <strong>de</strong>senvolupament comprovi que es basen en da<strong>de</strong>s lògiques i reals, no te cap<br />

sentit que els calendaris i terminis no s’adjuntin a la realitat o bé siguin molt estrictes.<br />

L’equip <strong>de</strong> <strong>de</strong>senvolupament ha <strong>de</strong> ser capaç <strong>de</strong> realitzar el projecte, però no ha <strong>de</strong> tenir<br />

que fer esforços sobrehumans per dur-lo a terme.<br />

Modificació <strong>de</strong> requeriments<br />

Un altre error important està en la modificació <strong>de</strong>ls requeriments inicials sense<br />

replanificar ni canviar els calendaris. Depèn <strong>de</strong> la metodologia emprada aquest pot ser<br />

un gran problema.<br />

Optimisme <strong>de</strong>ls <strong>de</strong>senvolupadors<br />

31


Projecte<br />

Per realitzar la planificació, els <strong>de</strong>senvolupadors solen ser molt optimistes en quan els<br />

costos <strong>de</strong> temps representa fer una <strong>de</strong>terminada tasca. Hi ha estudis que mostren que els<br />

<strong>de</strong>sevnolupadors generalment <strong>de</strong>sestimen les seves pròpies tasques en un 20-30%.<br />

El problema irresoluble<br />

L’últim problema està en que és difícil fer-se una i<strong>de</strong>a <strong>de</strong> com serà el vi<strong>de</strong>ojoc a partir<br />

<strong>de</strong>l document <strong>de</strong> disseny. Per tant sol ser habitualment comú realitzar prototipus <strong>de</strong>l que<br />

serà el joc i a<strong>de</strong>quar els requeriments a mesura que el prototipus va creixent.<br />

Tenim una realimentació constant entre les diferents fases, per exemple si el vi<strong>de</strong>ojoc no<br />

és entretingut, el disseny canviarà. Si el disseny canvia, els requeriments canvien , i si<br />

els requeriments canvien la planificació canvia també.<br />

Aquest és un problema comú en tots els projectes <strong>de</strong> software. En l’apartat següent es<br />

comenten diferents cicles <strong>de</strong> vida que intenten arreglar el problema anterior.<br />

2.3.2 Escollint el millor mo<strong>de</strong>l <strong>de</strong> cicle <strong>de</strong> vida per al<br />

<strong>de</strong>senvolupament d’un vi<strong>de</strong>ojoc<br />

L’enginyeria <strong>de</strong>l software reconeix diferents maneres d’aproximació al disseny i<br />

<strong>de</strong>senvolupament <strong>de</strong> projectes <strong>de</strong> software. Algunes aproximacions són idonies per a<br />

projectes en les que intervé un únic programador amb uns milers <strong>de</strong> línies <strong>de</strong> codi,<br />

mentre que altres son aptes per a equips <strong>de</strong> programació <strong>de</strong> quinze programadors i<br />

milions <strong>de</strong> línies <strong>de</strong> codi. En el cas <strong>de</strong>l <strong>de</strong>senvolupament <strong>de</strong> vi<strong>de</strong>ojocs els projectes<br />

tenen la categoria mitja, que correspon a equips entre quatre i vuit programadors i<br />

centenars <strong>de</strong> milers <strong>de</strong> línies <strong>de</strong> codi.<br />

Degut a la grandaria d’aquest tipus <strong>de</strong> projectes, els cicles <strong>de</strong> vida més apropiats son els<br />

següents:<br />

• <strong>Cas</strong>cada<br />

• <strong>Cas</strong>cada modificada<br />

• Prototipatge iteratiu.<br />

<strong>Cas</strong>cada<br />

Aquest mo<strong>de</strong>l és el tradicional mo<strong>de</strong>l en enginyeria <strong>de</strong>l programari. Consisteix en<br />

realitzar una sèrie <strong>de</strong> fases d’una manera or<strong>de</strong>nada.<br />

L’inconvenient d’aquesta metodologia està en l’estudi <strong>de</strong>ls requeriments. S’han <strong>de</strong> tenir<br />

ben <strong>de</strong>finits els requeriments <strong>de</strong>s <strong>de</strong>l principi, tasca molt difícil en segons quin tipus <strong>de</strong><br />

projectes on els clients no saben el que volen.<br />

32


Projecte<br />

Aquesta metodologia s’utilitza en projectes <strong>de</strong> vi<strong>de</strong>ojocs en els quals els mecanismes <strong>de</strong><br />

jugabilitat son molt coneguts, com po<strong>de</strong>n ser jocs que composen una saga (per exemple<br />

FIFAs, King quest, etc), on es coneixen molt bé les característiques <strong>de</strong>l joc. Es pot<br />

utilitzar també aquest mo<strong>de</strong>l per subsistemes grans dins <strong>de</strong>l joc, com po<strong>de</strong>n ser el <strong>motor</strong><br />

gràfic i la interfície, o bé quan s’estan afegint noves funcionalitats o nous nivells al joc.<br />

<strong>Cas</strong>cada modificada<br />

Figura 2.3.2.1: Cicle <strong>de</strong> vida en cascada<br />

La i<strong>de</strong>a <strong>de</strong>l cicle <strong>de</strong> vida tradicional modificat està en po<strong>de</strong>r sobreposar les diferents<br />

fases, per exemple po<strong>de</strong>m començar a implementar alguns subsistemes abans <strong>de</strong> que<br />

estigui acabat tot el disseny.<br />

Un exemple <strong>de</strong> jocs que po<strong>de</strong>n utilitzar aquesta metodologia son els jocs aventures, ja<br />

que el més important per la jugabilitat <strong>de</strong>l joc està en la interacció amb l’entorn, però el<br />

dissenyador habitualment no coneix com serà aquest entorn visualment fins que els<br />

artistes el creen.<br />

Prototipatge iteratiu<br />

Aquesta metodologia és molt utilitzada quan és molt costos establir els requeriments<br />

inicials d’una manera acurada.<br />

La i<strong>de</strong>a principal d’aquest mèto<strong>de</strong> està en <strong>de</strong>senvolupar el més ràpid possible un<br />

prototipus funcional, i sobre aquest prototipus <strong>de</strong>terminar quines coses agra<strong>de</strong>n i quines<br />

no, refent contínuament el disseny.<br />

El tipus <strong>de</strong> vi<strong>de</strong>ojocs en els que es sol utilitzar aquesta metodologia son els d’estratègia.<br />

Un cop es creen les unitats i s’han afegit les característiques, els mecanismes <strong>de</strong><br />

jugabilitat i estratègia s’han <strong>de</strong> realitzar, i po<strong>de</strong>n haver-hi estratègies bones i <strong>de</strong><br />

33


Projecte<br />

dolentes. Les bones estratègies es mantindran per a futurs prototipus, mentre que les<br />

dolentes es <strong>de</strong>scartaran, al igual passa amb els escenaris.<br />

El software es fa per increments i cada increment afegeix una nova funcionalitat al<br />

sistema, a més <strong>de</strong> fer les extensions <strong>de</strong>l disseny necessàries. Cada increment es prova<br />

(això suposa un avantatge ja que el sistema rep una prova més exhaustiva).<br />

2.3.3 Recuperació<br />

Tot i que és pot realitzar una bona planificacions en un projecte, segurament aquest<br />

haurà <strong>de</strong> fer front a una sèrie <strong>de</strong> problemes d’entre molts d’altres <strong>de</strong>staquem:<br />

• Si es subcontracten parts <strong>de</strong>l <strong>de</strong>senvolupament, l’empresa subcontractada pot<br />

lliurar fora <strong>de</strong> termini la seva part.<br />

• Mecanismes <strong>de</strong> planificació insuficients. S’ha <strong>de</strong> fer un seguiment <strong>de</strong> les tasques<br />

que es van o s’han realitzat, per tal <strong>de</strong> saber l’estat <strong>de</strong> cada part <strong>de</strong>l projecte.<br />

• Equips <strong>de</strong> <strong>de</strong>senvolupament distribuïts. Si el nostre equip <strong>de</strong> treball està dispers<br />

en la geografia serà convenient establir reunions “cara a cara” periòdicament per<br />

tal <strong>de</strong> que els components <strong>de</strong> l’equip no es sentin sols davant el projecte.<br />

Estratègies innefectives<br />

Quan un projecte començar a fer fallida en certes parts, les reaccions típiques per tal <strong>de</strong><br />

rectificar-lo son:<br />

• Imposar que els treballadors realitzin hores extres. És millor preguntar qui<br />

estaria disposat a fer hores extres que imposar-les, ja que si es sotmet als<br />

treballadors a la realització per força <strong>de</strong> més hores per a avançar tasques que<br />

s’estan endarrerint, això <strong>de</strong>semboca amb el temps a una pèrdua <strong>de</strong> motivació, es<br />

cometen més errors per el que implica haver <strong>de</strong> realitzar més proves. Hi ha<br />

estudis que <strong>de</strong>mostren que una gran motivació és igual a una gran productivitat,<br />

per tant és millor preguntar als treballadors com creuen que han <strong>de</strong> planificar el<br />

seu horari laboral per tal <strong>de</strong> ser el més efectius i productius possibles.<br />

• Afegir gent al projecte. Afegir més personal a un projecte que acaba <strong>de</strong><br />

començar pot ser una bona i<strong>de</strong>a per tal <strong>de</strong> incrementar la productivitat <strong>de</strong> l’equip<br />

<strong>de</strong> treball. Afegir més personal quan el projecte fa mesos que ha començat no és<br />

una solució, ja que les persones noves necessiten un temps <strong>de</strong> rodatge per tal <strong>de</strong><br />

familiaritzar-se amb els altres components <strong>de</strong> l’equip, a més les persones<br />

originals <strong>de</strong>l projecte han <strong>de</strong> <strong>de</strong>dicar temps a instruir als nous, la comunicació és<br />

fa més difícil ja que hi ha més gent que s’ha <strong>de</strong> posar d’acord, les reunions<br />

s’allarguen, etc.<br />

• Demanar més reunions per control l’estat <strong>de</strong> les coses. Un exemple típic en<br />

les empreses és que els responsables <strong>de</strong>manin un resum <strong>de</strong>l que han fet els<br />

treballadors durant el dia, també que és realitzin reunions a unes <strong>de</strong>termina<strong>de</strong>s<br />

hores, etc. El problema radica en que el treball intel·lectual necessita d’un estat<br />

34


Projecte<br />

<strong>de</strong> “flux d’i<strong>de</strong>es” en el que la ment s’endinsa plenament en el problema. Els<br />

estudis <strong>de</strong>terminen que aquest procés d’establir el flux està en uns 15 minuts.<br />

Cada cop que s’interromp el treballador, ha <strong>de</strong> tornar a establir aquest flux. Per<br />

tant crear un dia <strong>de</strong> treball que estigui ple <strong>de</strong> reunions, resums <strong>de</strong> treball, etc<br />

garanteix que el treball creatiu/intel·lectual es retardi.<br />

Estratègies efectives<br />

Com hem vist anteriorment el principal problema que pot afectar a la planificació d’un<br />

projecte és el seu abast. La manera més efectiva <strong>de</strong> dividir la planificació d’un projecte<br />

està en <strong>de</strong>crementar el seu abast via disminuir les característiques/funcionalitats finals<br />

que tindrà el projecte .Cada característica/funcionalitat que s’elimina redueix el temps<br />

<strong>de</strong> disseny, creació, <strong>de</strong>senvolupament, integració i proves. L’inconvenient <strong>de</strong> reduir<br />

funcionalitats en fases molt avança<strong>de</strong>s <strong>de</strong>l <strong>de</strong>senvolupament pot comportar llacunes,<br />

crear errors, i per últim <strong>de</strong>smoralitzar a l’equip.<br />

La solució a aquesta fet està en prioritzar les diferents característiques/funcionalitats que<br />

tindrà el vi<strong>de</strong>ojoc i<strong>de</strong>ntificant les que son importants, les que serien interessants i les<br />

que podria tenir. Les avantatges <strong>de</strong> donar prioritat a les característiques/funcionalitats<br />

són:<br />

• Si el <strong>de</strong>senvolupament s’encara a finalitzar les entra<strong>de</strong>s més prioritaries, l’equip<br />

tindrà més ganes d’acabar-les el més ràpid possible per tal <strong>de</strong> tenir temps per<br />

implementar les característiques/funcionalitats no tant prioritaries.<br />

• Si tothom coneix el temps que es requereix per <strong>de</strong>senvolupar una característica,<br />

es sentiran menys “afectats” emocionalment si s’ha d’eliminar per falta <strong>de</strong><br />

temps.<br />

• No es crearan llacunes en el joc al eliminar una característica/funcionalitat, ja<br />

que es coneix tot el que repercuteix a aquesta (prioritat) i es coneix que el joc<br />

funcionarà bé sense ella.<br />

35


2.4 Parts d’un Vi<strong>de</strong>ojocs<br />

Projecte<br />

En aquest subcapítol explicarem les diferents parts d’un vi<strong>de</strong>ojoc a nivell més tècnic.<br />

Molts <strong>de</strong>ls vi<strong>de</strong>jocs tenen en comú moltes parts. El <strong>motor</strong> intern està composat <strong>de</strong><br />

diferents parts lògiques [6][17] amb una sèrie <strong>de</strong> funcions. Po<strong>de</strong>m trobar els<br />

subsistemes:<br />

• Entrada<br />

• Visualització<br />

• So<br />

• Xarxa<br />

• Actualització<br />

• Bucle principal<br />

Figura 2.4.1: Parts d’un vi<strong>de</strong>ojoc<br />

És dificil <strong>de</strong>tectar en el codi font d’un vi<strong>de</strong>ojoc on comença i on acaba un <strong>de</strong>terminat<br />

subsistema per que els jocs estan molt optimitzats per a la velocitat <strong>de</strong> procés, no<br />

obstant teòricament suposem in<strong>de</strong>pen<strong>de</strong>nts per tal d’estudiar les característiques <strong>de</strong> cada<br />

un d’ells.<br />

En els capítols posteriors s’analitzaran algunes llibreries per ajudar al <strong>de</strong>senvolupament<br />

<strong>de</strong> cada un <strong>de</strong>ls subsistemes que formen part d’un vi<strong>de</strong>ojoc.<br />

2.4.1 Sistema d’Entrada<br />

36


Projecte<br />

Aquest sistema rep les coman<strong>de</strong>s d’entrada <strong>de</strong> l’usuari via dispositius com el teclar, la<br />

rata, etc. I guarda aquestes coman<strong>de</strong>s per al posterior processament. Aquest sistema és<br />

una part important en el <strong>motor</strong> d’un joc, ja que tot i que programar un dispositiu<br />

d’entrada no és complicat, s’ha <strong>de</strong> fer amb compte per que una mala entrada pot arruïnar<br />

la jugabilitat <strong>de</strong>ls millors jocs. Habitualment aquest sistema soporta la possibilitat <strong>de</strong><br />

tenir diferents elements d’entrada (ratolí, teclat, joysticks, etc), a més un bon sistema<br />

hauria <strong>de</strong> permetre integrar d’altres amb un mínim esforç.<br />

2.4.2 Sistema <strong>de</strong> Visualització<br />

El sistema <strong>de</strong> visualització té com a objectiu mostrar l’estat <strong>de</strong>l joc, els elements gràfics,<br />

etc al jugador. Aquest sistema ha <strong>de</strong> ser capaç d’utilitzar la potència <strong>de</strong> les targetes<br />

gràfiques d’última generació aprofitant totes les capacitats 3D per tal <strong>de</strong> tenir una gran<br />

eficiència i qualitat en els vi<strong>de</strong>ojocs 3D. Normalment, per explotar aquesta potència és<br />

necessari utilitzar una Aplication programming intergace (API) com po<strong>de</strong>n ser<br />

OpenGL, DirectX, etc, o bé partir d’un <strong>motor</strong>/llibreria que suporti aquestes APIs.<br />

2.4.3 Sistema <strong>de</strong> So<br />

Desenvolupar un sistema <strong>de</strong> so no és tant complicat i no necessita tant potència com pot<br />

necessitar <strong>de</strong>senvolupar el sistema <strong>de</strong> visualització. Al igual que el sistema anterior, el<br />

sistema <strong>de</strong> so ha <strong>de</strong> ser capaç d’aprofitar el hardware <strong>de</strong> la targeta <strong>de</strong> so, per exemple<br />

hauria <strong>de</strong> ser capaç <strong>de</strong> produir efectes <strong>de</strong> so surround en les targetes actuals.<br />

Similarment passa amb l’us d’un API per tal d’explotar la potència <strong>de</strong>l só. Aquestes<br />

APIs po<strong>de</strong>n ser la OpenAL, DirectSound o bé aprofitar <strong>motor</strong>s/llibreries que suportin<br />

aquestes APIs.<br />

37


2.4.4 Sistema <strong>de</strong> Xarxa<br />

Projecte<br />

Actualment afegir la funcionalitat <strong>de</strong> multijugador a través <strong>de</strong> la xarxa permet que els<br />

jugadors “aprofitin” molts més els vi<strong>de</strong>ojocs, és a dir, ja no parlem d’un joc<br />

monojugador amb l’objectiu <strong>de</strong> passar-se totes les fases, estem parlant d’un vi<strong>de</strong>ojoc<br />

que permet competir entre diferents jugadors distribuïts amb l’objectiu <strong>de</strong> guanyar la<br />

partida.<br />

L’objectiu d’aquest sistema és el d’informar als altres ordinadors distribuïts <strong>de</strong> l’estat<br />

<strong>de</strong>l joc per tal <strong>de</strong> que és pugin sincronitzar entre ells. Al igual que els casos anteriors<br />

normalment és treballar per sobre d’una API com po<strong>de</strong>n ser Hawknl, Rakknet,<br />

directplay, o <strong>motor</strong> que soporti el joc en xarxa.<br />

2.4.5 Sistema d’Actualització<br />

El sistema d’actualització és el “cervell” <strong>de</strong>l joc. És el sistema que controla l’estat <strong>de</strong><br />

totes les entitats en el joc, com po<strong>de</strong>n ser el jugador, enemics (mitjançant Intel·ligència<br />

Artificial), etc, en <strong>de</strong>finitiva, controla la informació que s’ha d’actualitzar quadre a<br />

quadre.<br />

2.4.6 Bucle principal<br />

El bucle principal <strong>de</strong>l joc és el sistema que s’encarrega d’ajuntar els diferents<br />

subsistemes. Bàsicament és un bucle while que s’executa <strong>de</strong> 30 a 60 vega<strong>de</strong>s per segon.<br />

El bucle principal s’encarrega <strong>de</strong> cridar les funcions correctes per tal d’obtenir les<br />

entra<strong>de</strong>s (per exemple <strong>de</strong>l teclat) que fa el jugador o bé <strong>de</strong> la xarxa provenint d’altres<br />

jugadors, actualitzant l’estat <strong>de</strong> tots els objectes en el joc, visualitzant el pròxim quadre<br />

<strong>de</strong>ls gràfics i produint el so.<br />

38


Projecte<br />

La organització en el bucle principal és important ja que l’ordre afecta al producte. Per<br />

exemple, les da<strong>de</strong>s que es reben <strong>de</strong> la xarxa que indica l’estat <strong>de</strong>ls altres jugadors dins el<br />

joc, influència els altres sistemes com per exemple l’actualització o la xarxa. I<br />

normalment el sistema <strong>de</strong> gràfics és el darrer sistema que s’executa per tal <strong>de</strong> reflectir<br />

les da<strong>de</strong>s genera<strong>de</strong>s pels altres anteriors sistemes.<br />

39


2.5 <strong>Desenvolupament</strong> <strong>de</strong> vi<strong>de</strong>ojocs<br />

Projecte<br />

En el capítol anterior hem comentat les diferents parts que formaven un vi<strong>de</strong>ojoc, en<br />

aquest capítol es comentaran algunes <strong>de</strong> les APIs/llibreries/<strong>motor</strong>s gràfics per tal <strong>de</strong><br />

<strong>de</strong>senvolupar els diferents sistemes que formen un vi<strong>de</strong>ojoc, tot i que ens centrarem<br />

molt més en la part <strong>de</strong>ls <strong>motor</strong>s gràfics.<br />

Primer <strong>de</strong> tot explicarem les diferències entre les llibreries i els <strong>motor</strong>s gràfics.<br />

2.5.1 Llibreries, <strong>motor</strong>s gràfics i <strong>motor</strong>s <strong>de</strong> vi<strong>de</strong>ojocs<br />

Entenem per llibreria un conjunt <strong>de</strong> funcions/utilitats/eines que ens aju<strong>de</strong>n a realitzar<br />

tasques concretes, com po<strong>de</strong>n ser el <strong>de</strong>senvolupament <strong>de</strong> tot el sistema <strong>de</strong> xarxa <strong>de</strong>l joc,<br />

o el sistema <strong>de</strong> visualització. Exemples d’aquest tipus són:<br />

• Xarxa: HawkLib, Raknet, DirectPlay.<br />

• Visualització: OpenGL, DirectX.<br />

Podríem <strong>de</strong>senvolupar un vi<strong>de</strong>ojoc a partir <strong>de</strong> diferents llibreries especialitza<strong>de</strong>s en cada<br />

subsistema d’un vi<strong>de</strong>ojoc, per exemple podríem utilitzar pel sistema d’entrada la<br />

llibreria DirectInput, pel sistema <strong>de</strong> xarxa la llibreria Raknet, per el sistema <strong>de</strong><br />

visualització OpenGL i pel só la llibreria OpenAL.<br />

Entenem per <strong>motor</strong> gràfic un conjunt <strong>de</strong> funcions/utilitats/eines que ens aju<strong>de</strong>n al<br />

<strong>de</strong>senvolupament <strong>de</strong>l sistema <strong>de</strong> visualització a més alt nivell <strong>de</strong>l que ens permetria per<br />

exemple la llibreria <strong>de</strong> visualització OpenGL. En OpenGL no tenim contemplat la<br />

càrrega <strong>de</strong> objectes 3D, l’estructuració <strong>de</strong> les da<strong>de</strong>s per a fer més eficient la<br />

visualització, entre d’altres característiques, mentre que en un <strong>motor</strong> gràfic aquestes<br />

funcions estarien incloses.<br />

I per últim tenim els motos <strong>de</strong> vi<strong>de</strong>ojocs que van un pas més enllà. Un <strong>motor</strong> <strong>de</strong><br />

vi<strong>de</strong>ojocs incorpora totes les funcionalitats d’un <strong>motor</strong> gràfics però afegint-hi per<br />

exemple funcionalitats <strong>de</strong> llenguatges d’script per tal <strong>de</strong> que la gent no programadora<br />

pugi modificar el comportament <strong>de</strong> certes part <strong>de</strong>l <strong>motor</strong>.<br />

Resumint po<strong>de</strong>m dir que un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs dona totes les funcionalitats per po<strong>de</strong>r<br />

<strong>de</strong>senvolupar vi<strong>de</strong>ojocs d’una manera ràpida, un <strong>motor</strong> gràfic incorpora totes les<br />

funcionalitats per fer aplicacions <strong>de</strong> visualització 3D, sense tenir en compte el tipus<br />

d’aplicació ni si necessita llenguatges d’script, per exemple, i les llibreries incorporen<br />

totes les funcionalitats d’un subsistema dintre d’un joc o aplicació.<br />

A la <strong>pràctic</strong>a la diferenciació entre <strong>motor</strong>s gràfics i <strong>motor</strong>s <strong>de</strong> vi<strong>de</strong>ojocs és molt difícil<br />

d’establir ja que col·loquialment anomenen indistintament a tots els <strong>motor</strong>s gràfics i<br />

<strong>motor</strong>s <strong>de</strong> vi<strong>de</strong>ojocs simplement <strong>motor</strong>s gràfics o <strong>motor</strong>s 3D, encara que en teoria tenen<br />

diferències conceptuals.<br />

40


2.5.2 Llibreries<br />

Projecte<br />

Existeixen un gran nombre <strong>de</strong> llibreries per tal <strong>de</strong> <strong>de</strong>senvolupar els subsistemes que<br />

formen part d’un vi<strong>de</strong>ojoc, d’entre elles po<strong>de</strong>m <strong>de</strong>stacar:<br />

• Sistema d’entrada: OpenGL, SDL, Clanlib.<br />

• Sistema <strong>de</strong> visualització: OpenGL.<br />

• Sistema <strong>de</strong> So: OpenAL.<br />

• Sistema <strong>de</strong> xarxa: HawkLib, Raknet.<br />

• Formats <strong>de</strong> fitxers d’imatges: Devil, Corona.<br />

• Formats <strong>de</strong> fitxers <strong>de</strong> da<strong>de</strong>s: Cal3D, lib3ds.<br />

• Middleware: SDL, Clanlib<br />

Les seves característiques principals son:<br />

• Portabilitat: Suport multiplataforma (Windows, Linux, etc).<br />

• Programari lliure: tenim accés al codi font.<br />

OpenGL<br />

figura 2.5.2.1: Llibreries i els subsistemes que tracten.<br />

OpenGL s’ha convertit en l’estandar per <strong>de</strong>senvolupar aplicacions interactives en 2D i<br />

3D. Està <strong>de</strong>senvolupat en C++ i suport multiplataforma.<br />

OpenAL<br />

És una llibreria multiplataforma (PC, XBox, GameCube, Playstation 2) per<br />

<strong>de</strong>senvolupar solucions en só 3D. Incorpora efectes Doppler, atenuació relativa a la<br />

distància, efectes d’entorn (reflexions, obstruccions, transmissions, reverberació, …)<br />

HawkLib<br />

Entorn <strong>de</strong> <strong>de</strong>senvolupament multiplataforma orientat a xarxa. Suporta multitud <strong>de</strong><br />

protocols, estadistíques <strong>de</strong> treansmisió, etc.<br />

41


Raknet<br />

Llibreria multiplataforma que incorpora característiques avança<strong>de</strong>s <strong>de</strong> xarxa.<br />

Devil, Corona<br />

Son dues llibreries per treballar amb fitxers d’imatges contra OpenGL.<br />

Cal3D<br />

Projecte<br />

Llibreria escrita en C++ multiplataforma. La seva funció està en aportar animacions 3D<br />

basa<strong>de</strong>s en esquelet.<br />

lib3DS<br />

Aporta suport per treballart amb el format 3DS. Està escrita en C++ I és<br />

multiplataforma.<br />

SDL (Simple Direct Layer)<br />

És una llibreria multiplataforma amb suport per Linux, Windows, etc. Està escrit en C,<br />

però funciona nativament en C++ i com a llenguatge d’scripts te enllaços a Lua, Perl,<br />

Php, Python, Ruby, etc.<br />

Engloba accés <strong>de</strong> baix nivell a funcions d’audio, teclat, ratolí, acceleració 3D via<br />

OpenGL, etc.<br />

Clanlib<br />

Llibreria multiplataforma escrita en C++ per <strong>de</strong>senvolupar jocs. Integra accés a baix<br />

nivell per controlar recursos, replicació d’objecte en la zarza, só, teclat, etc.<br />

Per veure exemples d’utilització <strong>de</strong> les llibreries i les seves finalitats consulteu les<br />

respectives pàgines web.<br />

2.5.3 Motor <strong>de</strong> vi<strong>de</strong>ojocs<br />

42


Projecte<br />

Un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs no es res més que una API (aplication programming interface)<br />

que ens permet <strong>de</strong>senvolupar <strong>d'un</strong>a manera còmoda i ràpida vi<strong>de</strong>ojocs, i aplicacions 3D<br />

(tot i que pel que estan realment optimitza<strong>de</strong>s son pels vi<strong>de</strong>ojocs).<br />

D'una manera planera <strong>de</strong>finim un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs com una caixa d'eines. Per<br />

exemple si necessitem fer una taula, obrirem la caixa d'eines i agafarem una serra, un<br />

<strong>de</strong>stornillador, cargols, un taladre , etc., a part necessitarem també els taulons <strong>de</strong> fusta.<br />

A continuació per fabricar la nostra taula, serrarem els taulons amb les formes <strong>de</strong> les<br />

potes i la base <strong>de</strong> la taula. Farem un forat a les potes amb el taladre, i també farem un<br />

forat a la base <strong>de</strong> la taula. Tot seguit unirem les potes a la base fent passar els cargols<br />

pels forats que hem fet i amb el <strong>de</strong>stornillador els collarem el més fort possible per que<br />

la taula sigui solida i no trontolli.<br />

Prenent com a partida el símil <strong>de</strong> la taula, si el que volem és fer un vi<strong>de</strong>ojocs <strong>de</strong>l tipus<br />

tetris, únicament haurem d'agafar les eines que ens proporciona el <strong>motor</strong> per tal <strong>de</strong><br />

<strong>de</strong>senvolupar el nostre joc.<br />

En internet po<strong>de</strong>m trobar gran quantitat <strong>de</strong> <strong>motor</strong>s gràfics [WEB1] <strong>de</strong>stinats a ajudar al<br />

<strong>de</strong>senvolupament <strong>de</strong> vi<strong>de</strong>ojocs.<br />

Les característiques mínimes que requerim d’un <strong>motor</strong> gràfic són:<br />

• Portabilitat: Suport multiplataforma (Windows, Linux, etc).<br />

• Modularitat: Claredat en l’estructuració, la implementació, en el disseny, etc.<br />

• Extensibilitat: Facilitat <strong>de</strong> ampliar les característiques (plugins).<br />

• Interoperativilitat: Incorpori importadors / exportadors <strong>de</strong> diferents paquets 3D<br />

com per exemple 3D, Maya, Milkshape, etc.<br />

• Tecnologia: Incorpori les noves tendències actuals, com per exemple el<br />

llenguatge CG (vertex sha<strong>de</strong>rs, pixel sha<strong>de</strong>rs).<br />

• Programari lliure: necessitem llibertat d’acció.<br />

Entre la infinitat <strong>de</strong> <strong>motor</strong>s disponibles [11][WEB1], enumerarem les característiques<br />

principals <strong>de</strong>ls que consi<strong>de</strong>rem més importants dins les pautes anteriors, que podríem<br />

resumir en:<br />

• Crystal Space<br />

• Ogre<br />

• Nebula Device<br />

• Open Scene Graph<br />

• Irrlicht<br />

A més d’enumerar les característiques principals entrarem més a fons en el <strong>motor</strong><br />

Crystal Space que és en el que hem <strong>de</strong>senvolupat les Obscurances.<br />

43


Crystal Space<br />

Projecte<br />

[WEB2] CS és un Kit <strong>de</strong> <strong>de</strong>senvolupament <strong>de</strong> jocs 3D escrit en C++ sota llicència GPL,<br />

actualment hi ha una gran comunitat <strong>de</strong> col·laboradors participant i un gran nombre <strong>de</strong><br />

projectes <strong>de</strong>senvolupats amb aquest <strong>motor</strong>, d’entre ells:<br />

• PlanetShift: joc <strong>de</strong> rol multijugador a través d’internet.<br />

Algunes imatges <strong>de</strong>l joc:<br />

Les característiques principals <strong>de</strong>l <strong>motor</strong> son:<br />

Arquitectura general:<br />

• Sistema <strong>de</strong> plugins, com so, tipus <strong>de</strong> lletres, etc., i llenguatges <strong>de</strong> script<br />

flexibles, com Python i LUA.<br />

Textures i mapes <strong>de</strong> textures:<br />

Portabilitat:<br />

• Suport per diferents formats <strong>de</strong> textures: GIF, TGA, PNG, BMP, JPG i<br />

altres.<br />

• Les plataformes actuals suporta<strong>de</strong>s son DOS (DJGPP), Unix (X Widnows,<br />

OpenGL), GNU/Linux (X Windows, SVGALIB, SDL i OpenGL),<br />

Macintosh (OpenGL), Widows 32-bit (DirectDraw Direct3D, DirectX,<br />

OpenGL), BeOS (OpenGL), NextStep, OpenStep, Rhapsody i OS/2<br />

(OpenGL).<br />

Formats <strong>de</strong> fitxers suportats:<br />

44


Projecte<br />

• Càrrega directa <strong>de</strong>ls formats 3DS, MDL, MD2, ASE, OBJ o POV.<br />

• Format <strong>de</strong> fitxers XML, el que permet re<strong>de</strong>finir l’escena <strong>de</strong> manera ràpida.<br />

• Les escenes po<strong>de</strong>n ser guarda<strong>de</strong>s en fitxers comprimits per a permetre<br />

empaquetar els diferents fitxers que en formen part.<br />

• Possibilitat <strong>de</strong> fer llibreries d’objectes, textures, i altres utilitats.<br />

Altres característiques:<br />

• Suport <strong>de</strong> so en Windows, GNU/Linux i Macintosh i a més suport per so 3D<br />

com EAX, D3D, etc. i suport per diferents formats <strong>de</strong> so com WAV, MP3,<br />

Ogg/Vorbis, AIFF, IFF, MOD<br />

• Comunicació simple per Windows, GNU/Linux and Unix basada en Sockets.<br />

L’estructura <strong>de</strong>l <strong>motor</strong><br />

Aquest <strong>motor</strong> implementa la i<strong>de</strong>a <strong>de</strong> Interfícies per tal d’in<strong>de</strong>penditzar la implementació<br />

<strong>de</strong> les classes <strong>de</strong>ls objectes que les utilitzen i evitar d’aquesta manera problemes <strong>de</strong><br />

compatibilitat.<br />

Un plugin implemetna una o més Interfaces. És el mateix concepte que en Java. A més<br />

en CS esta solventat per el sistema SCF (shared Class facility), com veurem més<br />

endavant).<br />

El <strong>motor</strong> està format d’entre d’altres per:<br />

• Llibreries<br />

• Plugins<br />

• Sectors i Portals<br />

• Da<strong>de</strong>s geomètriques (Meshes) <strong>de</strong>ls Objectes<br />

Per una informació <strong>de</strong>tallada consultar la informació <strong>de</strong>l <strong>motor</strong> gràfic.<br />

Llibreries<br />

Aquest <strong>motor</strong> gràfic està dividit en diverses llibreries, algunes <strong>de</strong> les més importants son<br />

Llibreria geomètrica ( llibreria: csgeom)<br />

Inclou una llibreria matemàtica 3D, 2D, vectors, matrius i polígons. Pot ser utilitzada<br />

in<strong>de</strong>pen<strong>de</strong>ntment <strong>de</strong> la resta <strong>de</strong>l <strong>motor</strong> gràfic.<br />

Llibreria d’utilitats ( llibreria: csutil)<br />

45


Projecte<br />

Aquesta llibreria inclou la possibilitat <strong>de</strong> llegir fitxer comprimits directament, fitxers <strong>de</strong><br />

configuracions per a opcions <strong>de</strong>l programa, carrega dinàmica <strong>de</strong> llibreries (.so i .dll),<br />

entre d’altres.<br />

Llibreria SCF (Shared Class Facility)<br />

La funció d’aquesta llibreria està en separar la implementació <strong>de</strong> les classes <strong>de</strong>ls<br />

programes que les utilitzen. És realitza separant la implementació <strong>de</strong> les classes en<br />

mòduls separats en forma <strong>de</strong> llibreries comparti<strong>de</strong>s, anomena<strong>de</strong>s mòduls <strong>de</strong> plugins. El<br />

motiu <strong>de</strong> separar la implementació <strong>de</strong>ls programes que utilitzen les classes és el <strong>de</strong><br />

solventar problemes d’incompatibilitat entre plataformes. D’aquesta manera po<strong>de</strong>m<br />

crear els nostres plugins <strong>de</strong> manera in<strong>de</strong>pen<strong>de</strong>nt.<br />

Crystal Space Windowing System (CSWS)<br />

Aquest sistema s’encarrega d’aportar un sistema <strong>de</strong> finestres simple, efectiu i<br />

multiplataforma al CS.<br />

Plugins<br />

Un plugin és un subsistema que es carrega en temps d’execució i que ens representa<br />

alguna funcionalitat.<br />

Virtual File System (VFS)<br />

S’encarrega <strong>de</strong> gestionar el sistema <strong>de</strong> fitxers <strong>de</strong> cada una <strong>de</strong> les plataformes suporta<strong>de</strong>s<br />

i <strong>de</strong> gestionar els diferents fitxers (fitxers comprimits) <strong>de</strong>l <strong>motor</strong> d’una manera<br />

transparent per l’usuari.<br />

Graphics Drivers<br />

Controlador 2d<br />

S’encarrega <strong>de</strong> gestionar l’accés <strong>de</strong> baix nivell a la pantalla. Suporta funcions<br />

primitives <strong>de</strong> pintar píxels, línies, texte, accés directe a la memòria, etc. Totes<br />

son específiques <strong>de</strong> rasteritzadors 3D com l’OpenGL 3D o bé en Unix <strong>de</strong> la<br />

llibreria/controlador OpenGL 2D XLib.<br />

Rasteritzador 3D<br />

Aquest sistema es necessari pel <strong>motor</strong> 3D però pot funcionar sol. Aquest<br />

controlador s’utilitza per dibuixar gràfics 3D i també textures 2D en pantalla.<br />

Actualment hi ha varies implementacions d’aquest component: Software,<br />

OpenGL, directX, etc.<br />

Sistema <strong>de</strong> Sha<strong>de</strong>rs<br />

46


Projecte<br />

Alguns ren<strong>de</strong>ritzadors (com per exemple l’OpenGL) necessiten sistema <strong>de</strong><br />

sha<strong>de</strong>rs adicionals per tal d’activar diferents característiques avança<strong>de</strong>s <strong>de</strong> les<br />

targetes gràfiques.<br />

3D Engine (csEngine)<br />

És el cor <strong>de</strong> Crystal Space. Necessita el component <strong>de</strong> rasteritzador 3D per a visualitzar<br />

les escenes i necessita també altres llibreries com (csutil, csgeom,).<br />

Aquesta classe implementa la interfície pública “iEngine” i a més conté una sèrie<br />

d’objectes d’entre d’altres que son interessants:<br />

• Sectors: la classe csSector amb interfície “iSector” correspon a una regió <strong>de</strong><br />

l’espai i conté la llista <strong>de</strong> meshes <strong>de</strong>l sector, les llums, portals, etc.<br />

• Meshes: Da<strong>de</strong>s geomètriques <strong>de</strong>ls objectes que hi ha en l’escena, així com <strong>de</strong> si<br />

es pot moure, la informació <strong>de</strong> les llums, ombres, etc que l’afecten.<br />

• Camera_position: Guarda la posició <strong>de</strong> la càmera inicial.<br />

• Textures: Guarda les textures que s’aplicaran als diferents objectes <strong>de</strong> l’escena.<br />

Map File Parser (csParser)<br />

Aquesta classe s’encarrega <strong>de</strong> llegir la informació <strong>de</strong>ls fitxers que <strong>de</strong>fineixen les<br />

escenes.<br />

Sistema Mesh Object Plug-In<br />

Aquest sistema s’encarrega <strong>de</strong> <strong>de</strong>finir i d’utilitzar els objectes 3D dins el <strong>motor</strong> CS. Hi<br />

ha una sèrie d’objectes pre<strong>de</strong>finits com po<strong>de</strong>n ser sistemes <strong>de</strong> partícules, fonts, boles,<br />

etc.<br />

Llenguatges d’Scripting<br />

S’encarrega <strong>de</strong> relacionar el CS amb llenguatges d’script com po<strong>de</strong>n ser el python, perl,<br />

lua, etc.<br />

Animació<br />

Aquest plugins s’encarrega d’animar els sprites que hi ha dins l’escena. Existeixen dos<br />

sistemes d’animació, el basat en quadres o per animació <strong>de</strong> l’esquelet (s’utilitza la<br />

llibreria externa Cal3D).<br />

Important mo<strong>de</strong>ls <strong>de</strong> da<strong>de</strong>s<br />

CS permet llegir altres formats que no siguin el format natiu. Amb aquest plugin és<br />

permet importar da<strong>de</strong>s in<strong>de</strong>pen<strong>de</strong>nts <strong>de</strong> l’estructura i carregar-les dins el <strong>motor</strong>.<br />

Alternate Windowing System (AWS)<br />

El AWS és una alternativa millorada al Sistema <strong>de</strong> finestres que incorpora el CS.<br />

47


Arquitectura principal<br />

Projecte<br />

L’arquitectura principal <strong>de</strong>l <strong>motor</strong> el qual <strong>de</strong>mostra una elevada modularitat, estret <strong>de</strong> la<br />

seva pàgina web és el seqüent:<br />

Sectors i Portals<br />

El concepte bàsic <strong>de</strong> CS és el sectors [12][17]. Un sector és<br />

• Àrea infinita <strong>de</strong> l’espai<br />

• Conté llums i objectes<br />

• Un portal connecta diferents sectors.<br />

Una escena està constituïda per sectors que no son res més que un conjunt tancat i<br />

convex <strong>de</strong> polígons. Convex significa que si dibuixem una línia entre dos punts<br />

arbitraris en el sector, llavors mai interceptarà un polígon en el sector. Tancat indica<br />

que no existeix possibilitat <strong>de</strong> sortir <strong>de</strong>l sector sense traspassar un polígon.<br />

48


Projecte<br />

Dos sectors adjacents po<strong>de</strong>n ser connectats usant un portal. Un portal és un tipus <strong>de</strong><br />

polígon especial, ja que un polígon normal és ren<strong>de</strong>ritzat utilitzant mapes <strong>de</strong> textura o<br />

altres tècniques, però quan el ren<strong>de</strong>r troba un portal, aquest salta a un altre sector, que<br />

és el sector <strong>de</strong>stí <strong>de</strong>l portal.<br />

Un portal és un polígon que connecta dos sectors (pot ser el mateix sector). És po<strong>de</strong>n<br />

crear efectes especials utilitzant portals com per exemple miralls i tenen grans<br />

repercusions en el disseny <strong>de</strong> nivells ja que es pot separar àrees interiors <strong>de</strong> les àrees<br />

exteriors.<br />

Meshes<br />

Una mesh no és res més que una graella <strong>de</strong> da<strong>de</strong>s d’un objecte (ja sigui da<strong>de</strong>s<br />

geomètriques, textures, ...).<br />

Existeien diferents tipus <strong>de</strong> Meshes d’objectes dins el CS, d’entre les que <strong>de</strong>staquem:<br />

• Objecte format per triangles<br />

• Objectes animats<br />

• Objecte format <strong>de</strong> polígons<br />

• Sistemes <strong>de</strong> partícules<br />

• Motor <strong>de</strong> terrenys<br />

Les meshes po<strong>de</strong>n ser afegi<strong>de</strong>s en jerarquies i a més és po<strong>de</strong>n moure, rotar i <strong>de</strong>splaçar<br />

entre sectors.<br />

Fabrica <strong>de</strong> meshes<br />

Com hem comentat les meshes representen la geometria d’una escena. Una fabrica <strong>de</strong><br />

meshes no és res més que una plantilla per una mesh d’un objecte. Es a dir, po<strong>de</strong>m tenir<br />

una fabrica <strong>de</strong> mesh que ens representa per exemple una taula, i tenir diferents meshes<br />

<strong>de</strong> la taula que s’han creat a partir d’aquesta plantilla a diferents punts <strong>de</strong> l’escena.<br />

D’aquesta manera aprofitem millor la memòria, ja que només és guarda un cop la<br />

informació <strong>de</strong> la taula, i és fa referència en les diferents meshes que instancien la taula.<br />

Estructura d’una escena<br />

49


Projecte<br />

Com s’ha comentat anteriorment en l’apartat <strong>de</strong> Sectors i Portals, una escena està<br />

formada per sectors. Un sector manté una llista <strong>de</strong> les llums i una llista amb les meshes<br />

<strong>de</strong>ls objectes, una llista <strong>de</strong>ls portals d’entre d’altres. Una mesh com hem comentat en la<br />

part <strong>de</strong> les Meshes pot estar entre dos sectors.<br />

Per a un resum <strong>de</strong> totes les característiques visitar la pàgina web <strong>de</strong> Crystal Space.<br />

50


Ogre<br />

Projecte<br />

[WEB3] OGRE (Object-Oriented Graphics Ren<strong>de</strong>ring Engine) és un <strong>motor</strong> 3D orientat<br />

a escena i molt flexible, dissenyat per fer més fàcil i més intuïtiu el <strong>de</strong>senvolupament <strong>de</strong><br />

vi<strong>de</strong>ojoc utilitzant el hardware 3D. Està <strong>de</strong>senvolupat en C++ i sota llicència LGPL.<br />

Aquest <strong>motor</strong> tot i no tenir una tant gran comunitat com el cas <strong>de</strong>l Crystal Space, té<br />

també molts projectes, i a més comercials:<br />

• Granite2004: Simulador <strong>de</strong> “autos <strong>de</strong> xoc”<br />

• VTrike: Simulador ”d’ala <strong>de</strong>lta”.<br />

Granite 2004 Vstrike<br />

Entre d’altres característiques <strong>de</strong>staquem:<br />

Característiques <strong>de</strong> productivitat:<br />

• Interfície orientada a objectes simple i fàcil d’utilitzar, dissenyada per reduir<br />

l’esforç al ren<strong>de</strong>ritzar escenes 3D.<br />

• Sistema <strong>de</strong> plugins, com so, tipus <strong>de</strong> lletres, etc., i llenguatges <strong>de</strong> script<br />

flexibles, com Python.<br />

Portabilitat:<br />

• Windows (DirectX i OpenGL), Linux (OpenGL) i MacOSX (OpenGL).<br />

• Utilització <strong>de</strong> les llibreries STL.<br />

Materials:<br />

• Potent llenguatge <strong>de</strong> <strong>de</strong>claració <strong>de</strong> materials.<br />

• Permet sha<strong>de</strong>rs (CG i DirectX9 HLSL).<br />

• Suport per textures en format PNG, JPEG, TGA, BMP i DDS .<br />

51


Formats <strong>de</strong> fitxers suportats:<br />

Projecte<br />

• Càrrega directa <strong>de</strong>ls formats 3DS, MDL, MD2, ASE, OBJ o POV.<br />

• Format <strong>de</strong> fitxers XML, el que permet re<strong>de</strong>finir l’escena <strong>de</strong> manera ràpida.<br />

• Les escenes po<strong>de</strong>n ser guarda<strong>de</strong>s en fitxers comprimits per a permetre<br />

empaquetar els diferents fitxers que en formen part.<br />

• Possibilitat <strong>de</strong> fer llibreries d’objectes, textures, i altres utilitats.<br />

Característiques <strong>de</strong> les escenes :<br />

• Gestió <strong>de</strong> l’escena altament configurable, permet estructuració en BSP, octress ,<br />

scene graphs, etc.<br />

Com s’ha comentat a l’inici d’aquest apartat, l’únic <strong>motor</strong> gràfic que s’explica en<br />

<strong>de</strong>tall és el Crystal Space, ja que és el <strong>motor</strong> amb el que s’ha <strong>de</strong>senvolupat les<br />

Obscurances.<br />

Per a un resum <strong>de</strong> totes les característiques visitar la pàgina web <strong>de</strong> Ogre.<br />

Nebula Device 2<br />

[WEB5] Aquest <strong>motor</strong> és un <strong>motor</strong> <strong>de</strong> vi<strong>de</strong>ojocs /visualització escrit en c++ i sota<br />

llicència Tcl-style license. Hi ha una gran comunitat al darrera <strong>de</strong> Nebula Device, a més<br />

la gran majoria <strong>de</strong> projectes son comercials:<br />

• Project Nomads: arcada fantàstic.<br />

• Urban assault: estratègia futurista.<br />

• Schwarzenberg: thriller històric.<br />

Nomads Schwarzenberg Urban assault<br />

Les característiques més importants son:<br />

52


Portabilitat:<br />

• Windows (DirectX i OpenGL), Linux (OpenGL) i MacOSX (OpenGL).<br />

Característiques <strong>de</strong> productivitat:<br />

Projecte<br />

• Sistema <strong>de</strong> plugins, com so, tipus <strong>de</strong> lletres, etc., i llenguatges <strong>de</strong> script<br />

flexibles, com Python, Lua, Tcl/Tk, java<br />

Materials:<br />

• Potent llenguatge <strong>de</strong> <strong>de</strong>claració <strong>de</strong> materials.<br />

• Permet sha<strong>de</strong>rs (CG i DirectX9 HLSL).<br />

• Suport per textures en format PNG, JPEG, TGA, BMP i DDS .<br />

Formats <strong>de</strong> fitxers suportats:<br />

• Càrrega directa <strong>de</strong>ls formats 3DS, MDL, MD2, ASE, OBJ o POV.<br />

• Format <strong>de</strong> fitxers XML, el que permet re<strong>de</strong>finir l’escena <strong>de</strong> manera ràpida.<br />

• Les escenes po<strong>de</strong>n ser guarda<strong>de</strong>s en fitxers comprimits per a permetre<br />

empaquetar els diferents fitxers que en formen part.<br />

• Possibilitat <strong>de</strong> fer llibreries d’objectes, textures, i altres utilitats.<br />

Aquest <strong>motor</strong> està pensat per po<strong>de</strong>r accedir a tota la estructura interna a partir <strong>de</strong><br />

llenguatge script.<br />

Com s’ha comentat a l’inici d’aquest apartat, l’únic <strong>motor</strong> gràfic que s’explica en<br />

<strong>de</strong>tall és el Crystal Space, ja que és el <strong>motor</strong> amb el que s’ha <strong>de</strong>senvolupat les<br />

Obscurances.<br />

Per a un resum <strong>de</strong> totes les característiques visitar la pàgina web <strong>de</strong> Nebula.<br />

Open Scene Graph<br />

53


Projecte<br />

[WEB4] L’OSG és un <strong>motor</strong> 3D d’altres prestacions utilitzat en els camps <strong>de</strong> la<br />

simulació, vi<strong>de</strong>ojocs, realitat virtual, visualització científica i mo<strong>de</strong>lat. Està<br />

<strong>de</strong>senvolupat en c++ i sota llicència.<br />

D’entre els projectes que s’han realitzat en aquest <strong>motor</strong> <strong>de</strong>staquem:<br />

• Barc: sistema <strong>de</strong> realitat virtual capaç <strong>de</strong> visualitzar qualsevol tipus <strong>de</strong> carreres<br />

marítimes. Va ser <strong>de</strong>senvolupat per la copa <strong>de</strong> les nacions 2003 en Itàlia.<br />

• Vi<strong>de</strong>aLab: aquest laboratoria va mo<strong>de</strong>lar la catedral <strong>de</strong> Tiu (Espanya) en vrml i<br />

la visualitzava a partir <strong>de</strong> l’OSG.<br />

• CSP: simulador <strong>de</strong> combat aeri.<br />

Barc Vi<strong>de</strong>aLab CSP<br />

D’entre les característiques <strong>de</strong>staquem:<br />

Portabilitat:<br />

• Windows, Linux, MacOSX, IRIX, Solaris i FreeBSD, tots amb OpenGL.<br />

Característiques <strong>de</strong> productivitat:<br />

• Sistema <strong>de</strong> plugins, com so, tipus <strong>de</strong> lletres, etc., i llenguatges <strong>de</strong> script<br />

flexibles, com Python.<br />

Característiques <strong>de</strong> les escenes :<br />

• Sistemes <strong>de</strong> portals, Impostors, View Frustum cullung, etc.<br />

Materials:<br />

• Permet sha<strong>de</strong>rs (CG).<br />

• Suport per textures en format PNG, JPEG, TGA, BMP, DirectX .x, AC3D .<br />

Formats <strong>de</strong> fitxers suportats:<br />

• Càrrega directa <strong>de</strong>ls formats 3DS, MDL, MD2, ASE, OBJ o POV.<br />

Característiques avança<strong>de</strong>s:<br />

54


• Paginació nativa <strong>de</strong> Bases <strong>de</strong> da<strong>de</strong>s multi-threa<strong>de</strong>d<br />

Projecte<br />

Com s’ha comentat a l’inici d’aquest apartat, l’únic <strong>motor</strong> gràfic que s’explica en<br />

<strong>de</strong>tall és el Crystal Space, ja que és el <strong>motor</strong> amb el que s’ha <strong>de</strong>senvolupat les<br />

Obscurances.<br />

Per a un resum <strong>de</strong> totes les característiques visitar la pàgina web <strong>de</strong> OSG.<br />

Irrlitch<br />

[WEB6] El <strong>motor</strong> Irrlicht està escrit en C++ sota llicència zlib/libpng. Té una gran<br />

comunitat al darrera però no té t’han d’èxit en aplicacions comercials com po<strong>de</strong>n ser el<br />

Nebula o l’OSG o inclòs l’Ogre.<br />

Algunes pantalles <strong>de</strong>l <strong>motor</strong>:<br />

D’entre les característiques <strong>de</strong>staquem:<br />

Portabilitat:<br />

• Windows (DirectX i OpenGL), Linux (OpenGL).<br />

Característiques <strong>de</strong> productivitat:<br />

• Sistema <strong>de</strong> plugins, com so, tipus <strong>de</strong> lletres, etc., i llenguatges <strong>de</strong> script<br />

flexibles, com Python, perl, java, ruby.<br />

Materials:<br />

• Suport per textures en format: BMP, PSD, JPG, TGA.<br />

Formats <strong>de</strong> fitxers suportats:<br />

• Càrrega directa <strong>de</strong>ls formats: DirecX .x, 3DS, Milkshape, Maya, Quake 3,<br />

Quake 2Format <strong>de</strong> fitxers XML, el que permet re<strong>de</strong>finir l’escena <strong>de</strong> manera<br />

ràpida.<br />

55


Projecte<br />

• Les escenes po<strong>de</strong>n ser guarda<strong>de</strong>s en fitxers comprimits per a permetre<br />

empaquetar els diferents fitxers que en formen part.<br />

• Possibilitat <strong>de</strong> fer llibreries d’objectes, textures, i altres utilitats.<br />

Com s’ha comentat a l’inici d’aquest apartat, l’únic <strong>motor</strong> gràfic que s’explica en<br />

<strong>de</strong>tall és el Crystal Space, ja que és el <strong>motor</strong> amb el que s’ha <strong>de</strong>senvolupat les<br />

Obscurances.<br />

Per a un resum <strong>de</strong> totes les característiques visitar la pàgina web <strong>de</strong> Irrlitch<br />

56


Projecte<br />

3. <strong>Cas</strong> <strong>pràctic</strong>: <strong>Desenvolupament</strong> <strong>de</strong> les<br />

Obscurances en temps real<br />

3.1. Anàlisis: mo<strong>de</strong>l d’il·luminació global<br />

mitjançant Obscurances<br />

El primer pas per entendre bé el que hem <strong>de</strong> <strong>de</strong>senvolupar està en estudiar amb <strong>de</strong>tall el<br />

concepte d’Obscurances [1][14].<br />

Les Obscurances són una tècnica d’il·luminació molt poten que simula la il·luminació<br />

difusa, obtenint resultats similars a la radiositat però a un menor cost. Aquesta avantatge<br />

es basa en consi<strong>de</strong>rar únicament les interaccions veïnes en lloc <strong>de</strong> consi<strong>de</strong>rar les<br />

interaccions globals. Podríem <strong>de</strong>finir la tècnica com la propietat geomètrica purament<br />

local d’un punt en l’escena que consisteix en la integració <strong>de</strong>ls factors <strong>de</strong> forma <strong>de</strong>ls<br />

punts veïns al punt donat. La tecnologia que es proposa té molts beneficis, entre ells la<br />

simplicitat i l’acceleració <strong>de</strong> la representació d’escenes realistes.<br />

La tècnica <strong>de</strong> la radiositat es comunment emprada per simular la il·luminació difusa en<br />

entorns 3D tancats. Aquesta tècnica es molt potent i ha incrementat la seva velocitat<br />

d’una manera consi<strong>de</strong>rable, però no és suficient per als requeriments d’editar d’una<br />

manera ràpida i eficient una escena o bé l’actualizació en temps real d’aquesta. Les<br />

interaccions <strong>de</strong> cada superfície en l’escena amb les altres ha <strong>de</strong> consi<strong>de</strong>rar-se (almenys<br />

potencialment). Les Obscurances han estat dissenya<strong>de</strong>s per oferir una alternativa a la<br />

radiositat, mentre es mantenen les propietats visuals que fan que l’escena tingui un<br />

aspecte realista. D’aquesta forma aquestes po<strong>de</strong>n aplicar-se sense cap canvi als entorns<br />

3D. Aquesta tècnica ha estat utilitzada en vi<strong>de</strong>ojocs 3D i animacions (intros i cutscenes)<br />

per a Heretic-II, Civilization-III, etc. En aquest capítol es comenta la implementació en<br />

el <strong>motor</strong> gràfic Crystal Space [10], permeten l’actualització en temps real <strong>de</strong> les<br />

Obscurances per a objectes en moviment.<br />

La majoria <strong>de</strong> mo<strong>de</strong>ls <strong>de</strong> il·luminació local expliquen las interreflexions difuses<br />

utilitzant la llum ambient, la que es consi<strong>de</strong>ra normalment constant per tota l’escena. En<br />

realitat, l’il·luminació no és constant. Per exemple, en una habitació amb parets difuses<br />

o Lambertianess, la il·luminació canvia sobre les superfícies <strong>de</strong> la paret, <strong>de</strong> tal manera<br />

que en les cantona<strong>de</strong>s el color és més fosc (Obscurances), comparat amb el reste <strong>de</strong> l’<br />

habitació. Cada efecte <strong>de</strong> llum en àrees ombreja<strong>de</strong>s pot ser mo<strong>de</strong>lat sense necessitat<br />

d’utilitzar mèto<strong>de</strong>s tan costosos com la Radiositat. El nostre mo<strong>de</strong>lo d’il·luminació està<br />

basat en el concepte <strong>de</strong> Obscurances, que <strong>de</strong>staca per la generació <strong>de</strong> les ombres en les<br />

cantona<strong>de</strong>s o zones on hi ha més quantitat <strong>de</strong> patchs per àrea, per exemple sota d’una<br />

pota <strong>de</strong> la taula o als voltants d’aquesta taula.<br />

57


Projecte<br />

3.1.1.Mo<strong>de</strong>l d’ il·luminació Obscurances sense fonts <strong>de</strong><br />

llum<br />

Suposem que la llum difusa pot venir <strong>de</strong> qualsevol direcció il·luminant tota l’escena.<br />

Definició: Escollim un punt P d’una superfície <strong>de</strong> l’escena, ω un punt <strong>de</strong> la hemiesfera<br />

unitaria Ω centrada en P.<br />

La funció L (P, ω) es <strong>de</strong>fineix com:<br />

Figura 3.1.1.1: Obscurances Hemiesfera<br />

⎧dist(<br />

P,<br />

C),<br />

on Cés<br />

el primer punt d' intersecci ó <strong>de</strong>l raig Pω<br />

L(P, ω ) = ⎨<br />

⎩+<br />

∞,<br />

cas _ contrari (si el raig no intersecta )<br />

Consi<strong>de</strong>rem que un patch estè completament obert, es a dir, que estè completament<br />

il·luminat. D’aquesta manera l’intensitat d’un patch donat pot ser aproximat <strong>de</strong> la<br />

següent format:<br />

? ( L ( P, ?)) : Funció que <strong>de</strong>termina l’energia que arriba al punt P <strong>de</strong>s <strong>de</strong> la primera<br />

superfície interceptada amb una distancia menor que L en direcció ?<br />

? : Àngle entre la direcció ? i la normal en P.<br />

IA : Intensitat <strong>de</strong> la Llum Ambient.<br />

R (P): Reflectivitat <strong>de</strong> P.<br />

π<br />

1 : és el factor <strong>de</strong> normalització tal que si ?() = 1 contra el reste <strong>de</strong> la semiesfera O,<br />

llavors I (P) es R * IA.<br />

(1)<br />

58


Projecte<br />

La funció ρ() és una funció monòtona creixent que <strong>de</strong>pèn <strong>de</strong> L. Sabent que normalment<br />

la il·luminació ambient d’un cert punt afectarà primerament als patchs veïns. Llavors,<br />

po<strong>de</strong>m concluïr que la funció ρ() haurà <strong>de</strong> seguir la forma que indica la següent figura:<br />

Figura 3.1.1.2: Funció monòtonaa creixent<br />

Es a dir, que la funció ρ(L) serà igual a 1 quan L ≥Lmax. Això significa que no tindrem<br />

en consi<strong>de</strong>ració totes aquelles interseccions que es trobin més enllà <strong>de</strong> la distancia<br />

màxima. D’aquesta manera, únicament escollirem aquelles interseccions “veïnes” al<br />

punt fitxat.<br />

Definició: Triarem un punt P d’una superfície <strong>de</strong> la escena. La Obscurance <strong>de</strong>l punt P<br />

la <strong>de</strong>finirem com:<br />

Llavors la Obscurance <strong>de</strong>l punt P és la mitjana <strong>de</strong> les proporcions <strong>de</strong> l’energia donada<br />

per els punts d’intersecció veïns al punt P. Clarament, per qualsevol punt P <strong>de</strong> la<br />

superfície és cumpleix que 0 ≤ W ( P)<br />

≤ 1 . La funció W(P) reflexa les propietats<br />

geomètriques <strong>de</strong>l punt P.<br />

En els casos més extrems, el valor 1 <strong>de</strong> la Obscurance significa que el patch està<br />

completament obert, mentre que el valor 0 vol dir que el patch està totalment tancat. La<br />

Obscurance d’un patche és la mitjana <strong>de</strong>ls factors <strong>de</strong> forma <strong>de</strong>l patch pon<strong>de</strong>rat per la<br />

funció ρ . D’aquesta forma, utilizant les equacions anteriors sabem que la intensitat <strong>de</strong>l<br />

patch P és:<br />

I( P)<br />

R ( P)<br />

I A W ( P)<br />

∗ ∗ =<br />

Aquesta expressió ens <strong>de</strong>termina el nostre mo<strong>de</strong>l d’il·luminació sense fonts <strong>de</strong> llum.<br />

Aquest mo<strong>de</strong>l pot anomenar-se localment global; ja que el càlcul <strong>de</strong> las Obscurances<br />

inclou l’anàlisi <strong>de</strong> la geometria local <strong>de</strong> l’escena, però amb els efectes <strong>de</strong> la il·luminació<br />

semblant globals.<br />

La tècnica exposada és una propietat geomètrica que no <strong>de</strong>pèn <strong>de</strong> les fonts <strong>de</strong> llum, això<br />

suposa que únicament seran calcula<strong>de</strong>s un sol cop, implicant que per escenes anima<strong>de</strong>s<br />

59


Projecte<br />

on es po<strong>de</strong>n moure les fonts <strong>de</strong> llum, simplement calcularem un cop les Obscurances<br />

associa<strong>de</strong>s a l’escena i reutilizarem els càlculs a cada pas d’animació. És evi<strong>de</strong>nt que<br />

això representa una reducció consi<strong>de</strong>rable <strong>de</strong>l cost computacional.<br />

3.1.2.Mo<strong>de</strong>l d’ il·luminació Obscurances amb fonts <strong>de</strong><br />

llum<br />

L’objectiu <strong>de</strong>l nostre mo<strong>de</strong>l d’il·luminació es justificar la il·luminació indirecta causada<br />

per les interreflexions difuses d’una manera senzilla i ràpida. Per calcular la il·luminació<br />

d’un <strong>de</strong>terminat patch causada per una <strong>de</strong>terminada font <strong>de</strong> llum, distingirem dos parts<br />

dins d’aquesta il·luminació: una directa i una altra indirecta. Per calcular la primera,<br />

utilitzarem els mo<strong>de</strong>ls estàndards d’il·luminació local difusos. Per a la segona,<br />

aplicarem el concepte <strong>de</strong> Obscurance en un punt.<br />

La fórmula que <strong>de</strong>fineix la il·luminació:<br />

On<br />

( P)<br />

= ( I A + I ′ ( P))<br />

∗ R(<br />

P)<br />

* W ( P)<br />

+ RD<br />

( P)<br />

∗ I ( P)<br />

1 4 4 4 4 2 4 4 4 4 3 1 4 2 4 43<br />

I s<br />

iluminacióindirecta<br />

iluminaciódirecta<br />

IA: constant <strong>de</strong> l’intensitat <strong>de</strong> la llum ambient. Aquest valor és pot calcular.<br />

R, RD : coeficients <strong>de</strong> reflexió i difusa <strong>de</strong>l patch.<br />

IS : ens indicarà la intensitat <strong>de</strong> la llum directa que es <strong>de</strong>sprèn per totes les fonts <strong>de</strong> llum<br />

visibles.<br />

= ∑ 2 cos<br />

) ( I j<br />

I P<br />

α j<br />

r<br />

by allvisible<br />

light sources<br />

I ’ S : intensitat <strong>de</strong> la llum indirecta que ve <strong>de</strong> totes les fonts <strong>de</strong> llum,<br />

on<br />

'<br />

I S ( P)<br />

= β ∗<br />

j<br />

∑<br />

light sources<br />

all by<br />

Ij : intensitat <strong>de</strong> la llum j-essima.<br />

Rj : distancia <strong>de</strong> la llum al patch P.<br />

α j : angle que forma la normal <strong>de</strong>l patch amb la direcció <strong>de</strong> la font j.<br />

β : constant que compleix 0 < β < 1.<br />

La il·luminació indirecta proce<strong>de</strong>nt <strong>de</strong> les fonts <strong>de</strong> llum la calcularem a partir <strong>de</strong>l terme<br />

I’S. El factor β ens escalarà la component indirecta contra la directa. El terme I’S no<br />

conté el factor cosinus perquè consi<strong>de</strong>rem que els raigs secundaris, que arriben a un<br />

patch, venen <strong>de</strong> totes direccions.<br />

I<br />

r<br />

j<br />

2<br />

j<br />

60


Projecte<br />

El principal paràmetre que controla l’ il·luminació és la distancia màxima (Lmax).<br />

D’aquest terme <strong>de</strong>pendrà la quantitat d’ombra que generen els objectes, es a dir, la<br />

distancia màxima seleccionada haurà d’estar en concordança amb la grandària <strong>de</strong>ls<br />

objectes; ja que en realitat, objectes grans presenten ombres més grans que els objectes<br />

més petits. Tal com indica la següent figura:<br />

Figura 3.1.2.1: Efecte <strong>de</strong> la distància Lmax en el càlcul <strong>de</strong> les Obscurances<br />

La distancia màxima <strong>de</strong>pendrà també <strong>de</strong> la grandària <strong>de</strong> l’escena, ja que ens interessa<br />

que les Obscurances siguin una propietat local. Per tant, Lmax tindrà un valor<br />

proporcional a la grandària <strong>de</strong> l’escena <strong>de</strong> manera que sigui el més local possible. Un<br />

<strong>de</strong>ls objectius futurs que proposem és el càlcul automàtic <strong>de</strong> la distancia màxima més o<br />

menys acceptable per a una escena <strong>de</strong>terminada.<br />

3.1.3.Mo<strong>de</strong>l millorat <strong>de</strong> les obscurances (Color Bleeding)<br />

El mo<strong>de</strong>l exposat anteriorment ens proporciona d’una manera simple i ràpida escenes<br />

3D molt reals. Les característiques que ens genera la tècnica presentada son ombres<br />

molt realistes (en els contorns, en els objectes, suavitat d’ombres, etc).<br />

En el mon real no solament es té en compte que tot objecte genera una certa “ombra”,<br />

sinó que existeix una interacció entre els colors <strong>de</strong> les diferents superfícies <strong>de</strong>l objecte i<br />

les superfícies pròximes. Per exemple, suposem que tenim una habitació amb totes les<br />

parets <strong>de</strong> color blanc exceptuant una que és <strong>de</strong> color vermell; és evi<strong>de</strong>nt, que les parets<br />

veïnes a la vermella adquireixen una tonalitat vermellosa <strong>de</strong>gut a les reflexions tal i com<br />

es pot veure en el dibuix:<br />

Figura 3.1.3.1: Color Bleeding<br />

És obvio que l’efecte entre les diferents superfícies <strong>de</strong> l’escena <strong>de</strong>pendrà <strong>de</strong> les<br />

característiques d’aquestes com po<strong>de</strong>n ser el color i la seva reflectancia.<br />

61


Projecte<br />

La millora anterior rep el nom <strong>de</strong> color bleeding, és a dir, la transferència <strong>de</strong>l color<br />

mitjançant reflexió amb la superfície, <strong>de</strong> manera que les escenes tenen un major<br />

realisme.<br />

Per obtenir la finalitat o efecte que produeixen les diferents superfícies <strong>de</strong>ls patch veïns<br />

sobre un <strong>de</strong>terminat patch, utilitzarem el concepte <strong>de</strong> reflectancia (capacitat <strong>de</strong> reflexar<br />

la llum) <strong>de</strong>ls patch veïns a aquest. Resumint, <strong>de</strong>penent <strong>de</strong> la reflectància que presentin<br />

els patchs <strong>de</strong> l’entorn, l’efecte sobre el patch serà major o menor. Aquesta característica<br />

serà la que ens transmetrà el color <strong>de</strong> les superfícies veïnes al nostre patch. L’esquema<br />

que seguirem per calcular l’efecte <strong>de</strong>l color bleeding sobre un cert patch és el següent.<br />

Figura 3.1.3.2: Càlcul color bleeding<br />

Obtenim la reflectancia <strong>de</strong>l patch que ha interceptat cada raig llançat <strong>de</strong>s <strong>de</strong> el patch<br />

seleccionat, <strong>de</strong> manera que aquest obté els colors <strong>de</strong> les superfícies intercepta<strong>de</strong>s. Si es<br />

donés el cas que el raig llançat no interceptes cap patch, utilitzarem com a reflectancia<br />

<strong>de</strong>l patch seleccionat la reflectancia mitjana <strong>de</strong> l’escena que anteriorment hauríem<br />

calculat.<br />

3.1.4.Calculant les obscurances<br />

Abans d’aplicar les Obscurances hem d’especificar la distància màxima i el nomre <strong>de</strong><br />

raigos que s’hauran <strong>de</strong> llançar per calcular la part indirecta (Obscurances). El següent<br />

pas és calcular la constant <strong>de</strong> llum ambient. Per això calcularem la reflectància mitjana<br />

total Rave:<br />

R<br />

n<br />

∑<br />

i=<br />

ave = 1<br />

A ∗ R<br />

on:<br />

Ai : és l’àrea <strong>de</strong>l patch i<br />

Ri: és la reflectància <strong>de</strong>l patch i<br />

Atotal: és l’àrea <strong>de</strong> tota l’escena. Quan s’hagi calculat la reflectància mitjana passarem al<br />

càlcul <strong>de</strong> la intensitat <strong>de</strong> la llum ambient.<br />

A<br />

i<br />

total<br />

i<br />

62


I<br />

A<br />

=<br />

n<br />

∑<br />

i=<br />

1<br />

Ai<br />

∗Ei<br />

+ R<br />

A<br />

total<br />

ave<br />

∗<br />

n<br />

∑<br />

i=<br />

1<br />

Ai<br />

∗Ei<br />

+ R<br />

A<br />

total<br />

2<br />

ave<br />

∗<br />

n<br />

∑<br />

i=<br />

1<br />

Ai<br />

∗Ei<br />

1<br />

+ ... =<br />

A ( 1−<br />

R<br />

total<br />

ave<br />

∗<br />

)<br />

n<br />

∑<br />

i=<br />

1<br />

A<br />

Projecte<br />

A ∗E<br />

on:<br />

Ei: és la emitància <strong>de</strong>l patch i;<br />

1 ( 1−<br />

Rave<br />

) és el número mitjà <strong>de</strong> rebots o camins <strong>de</strong> la llum. Aquesta expressió té en<br />

consi<strong>de</strong>ració la llum directa (1ª expresió <strong>de</strong> la sèrie). Tan sols ens interessa la llum<br />

ambient indirecta, per tan hi haurà un factor <strong>de</strong> reflectivitat Rave per el que tindrem que<br />

multiplicar IA. Aquest factor estarà implícit en el càlcul <strong>de</strong> les Obscurances millora<strong>de</strong>s.<br />

Una cop calculada la intensitat <strong>de</strong> la llum ambient, podrem passar al càlcul <strong>de</strong> les<br />

Obscurances. Primer, calcularem els raigs que corresponen a cada patch amb la<br />

següent expressió: i total A A raigs<br />

patch<br />

Lines ) ( _ = ∗ , és a dir, número <strong>de</strong> raigs per<br />

unitat d’àrea <strong>de</strong>l patch. Tot i que, es podria distribuir <strong>de</strong> diferent forma, per exemple<br />

número constant <strong>de</strong> raigs per patch (aquesta és la solució utilitzada en la implementació<br />

amb el <strong>motor</strong> Crystal Space).<br />

A continuació llançarem tants raigs com indica el terme Lines_patch. Els raigos es<br />

llancen d’una manera aleatòria, amb la distribució corresponent als factors <strong>de</strong> forma. Per<br />

cada raig es busca la intersecció més pròxima dins <strong>de</strong> la distància màxima prenent com<br />

origen el patch actual. Si es produeix la intersecció, aplicarem la funció monòtona<br />

creixent i que segueix la corba especificada en els apartats anterior; en el nostre cas<br />

i max L D f = , on Di és la distància entre l’origen <strong>de</strong>l raig i el punt d’intersecció. En el<br />

cas <strong>de</strong> que la intersecció no es produís , f serà igual a 1. Tenint en compte aquest fet, la<br />

Obscurance <strong>de</strong>l patch serà:<br />

1<br />

Obscurance =<br />

num.<br />

rayos<br />

on<br />

fi: és el valor <strong>de</strong> la funció per al raig j.<br />

Rint:: és la reflectància <strong>de</strong>l patch interceptat.<br />

num rayos<br />

∑ j<br />

j=<br />

R f<br />

.<br />

int<br />

1<br />

Aquesta operació es reprodueix per a tots els raigs que es llancen <strong>de</strong>s d’aquest patch.<br />

Després es multiplica el valor <strong>de</strong> la funció, que és el que ens <strong>de</strong>termina la Obscurance<br />

<strong>de</strong>l patch, per la reflectància <strong>de</strong> cada patch interceptat. La reflectància <strong>de</strong> cada patch<br />

interceptat s’ha <strong>de</strong> tenir en compte per a que cada patch origen <strong>de</strong>ls raigs adquireixi<br />

l’efecte <strong>de</strong> color bleeding (seguint el procediment explicat en l’apartat anterior).<br />

A continuació es calcula la il·luminació <strong>de</strong> l’escena amb les Obscurances seguint la<br />

fórmula:<br />

I( P)<br />

= ( I A + I ′ ( P))<br />

∗ R(<br />

P)<br />

* W ( P)<br />

+ RD<br />

( P)<br />

∗ I s(<br />

P)<br />

on<br />

I A (llum ambient): calculada a partir <strong>de</strong>l procediment exposat anteriorment.<br />

I′ s (P)<br />

: no es té en consi<strong>de</strong>ració.<br />

i<br />

total<br />

i<br />

63


Projecte<br />

R, RD<br />

: R correspon a la reflectància <strong>de</strong>l patch i RD es troba implícit en el càlcul <strong>de</strong> la<br />

llum directa que fa el mateix programa.<br />

W (P)<br />

: correspon a Obscurance mitjana <strong>de</strong>l patch.<br />

I s (P)<br />

: correspon a la llum directa.<br />

Obtenint l’expressió:<br />

I A<br />

( P)<br />

= I ∗ R ( P)<br />

* W ( P)<br />

+ ( llum<br />

on la llum directa es calculada per el Crystal Space.<br />

directe)<br />

64


3.2. Disseny<br />

Projecte<br />

Tenint clar els càlculs necessaris que s’han <strong>de</strong> realitzar per calcular les Obscurances<br />

procedirem al disseny <strong>de</strong> les Obscurances en temps real.<br />

3.2.1.Fases en la implementació <strong>de</strong> les Obscurances en<br />

temps real<br />

El procés <strong>de</strong> calcular les Obscurances té un seguit <strong>de</strong> pasos:<br />

En <strong>de</strong>tall:<br />

Figura 3.2.2.1: Pasos a realitzar<br />

• Càrrega <strong>de</strong> les da<strong>de</strong>s (preparació <strong>de</strong>ls Lightmaps) i estructuració <strong>de</strong> l’escena.<br />

• Algorisme per Calcular les Obscurances<br />

o Voxel Origen <strong>de</strong>l raig<br />

o Llançament <strong>de</strong> raigs<br />

o Intersecció <strong>de</strong>ls raigs<br />

o Modificació <strong>de</strong>ls Lightmaps <strong>de</strong>ls polígons afectats<br />

o Inicialització <strong>de</strong> les estructures per a les Obscurances en temps real<br />

• Navegació <strong>de</strong> l’escena<br />

o Recàlcul <strong>de</strong>ls polígons afectats pels moviments d’objectes en moviment.<br />

Per tal <strong>de</strong> treballar amb les Obscurances dins el Crystal Space explicarem a continuació<br />

el concepte <strong>de</strong> Lightmap.<br />

3.2.2.Lightmaps<br />

Per tal <strong>de</strong> realitzar la implementació <strong>de</strong> les Obscurances ens basarem en el concepte <strong>de</strong><br />

Lightmaps (mapes <strong>de</strong> llums). Cada superfície <strong>de</strong> l’escena en el <strong>motor</strong> gràfic Crystal<br />

Space, té una sèrie d’atributs: color, vèrtexs, Lightmaps, etc. Un Lightmap no és res més<br />

que una o més textures que guar<strong>de</strong>n informació <strong>de</strong> la il·luminació d’un polígon [22] que<br />

son aplica<strong>de</strong>s a la textura original <strong>de</strong>l polígon abans <strong>de</strong> ren<strong>de</strong>ritzar-se per pantalla.<br />

Po<strong>de</strong>m veure uns exemples a continuació:<br />

65


Textura Lightmap Textura +<br />

Original Lightmap<br />

Figura 3.2.2.2: Lightmaps<br />

Projecte<br />

Po<strong>de</strong>m <strong>de</strong>finir un Lightmap com a una matriu <strong>de</strong> valors, on cada element s’anomena<br />

Lumel (Luminosity element), po<strong>de</strong>m trobar l’element homònim en les textures: Texel<br />

(Texture element). Un Lightmap no té per que tenir la mateixa resolució que una textura,<br />

habitualment tenen dimensions inferiors però per aplicar correctament la superposició<br />

<strong>de</strong> Lightmap i textura, el Lightmap s’escala al tamany <strong>de</strong> la Textura (emprant<br />

interpolacions).<br />

Per tal <strong>de</strong> simplificar càlculs, consi<strong>de</strong>rarem que cada Lumel correspon a un Patch, <strong>de</strong> tal<br />

manera que po<strong>de</strong>m establir una relació directa entre Patchs i Lumels. La utilització <strong>de</strong>l<br />

Crystal Space ens facilita tot el procés <strong>de</strong> generació <strong>de</strong>ls Lightmaps <strong>de</strong> cada una <strong>de</strong> les<br />

superfícies <strong>de</strong> l’escena, per tant quan carreguem l’escena, ja tenim calculats els<br />

Lightmaps <strong>de</strong> cada superfície.<br />

L’algorisme per calcular els Lightmaps te dues parts: Trobar les coor<strong>de</strong>na<strong>de</strong>s u,v<br />

correctes per cada vèrtex en el Lightmap i calcular el contingut <strong>de</strong>l Lightmap, aquests<br />

càlculs son realitzats automàticament pel Crystal Space, però trobem adients comentarlos<br />

per tal <strong>de</strong> tenir clars els passos que realitza, per tal d’afegir la implementació <strong>de</strong> les<br />

Obscurances dins el <strong>motor</strong> gràfic.<br />

Primer pas, generació <strong>de</strong> les coor<strong>de</strong>na<strong>de</strong>s u,v correctes <strong>de</strong>l Lightmap<br />

1. Projectem el polígon contra un pla primari (XZ, XY o YZ), ja que hem <strong>de</strong> tenir en<br />

compte que un Lightmap té dues dimensions. Normalment aquesta <strong>de</strong>cisió és basa en la<br />

Normal. Per exemple, si els components <strong>de</strong> la normal té que la coor<strong>de</strong>nada Y és més<br />

dominant (la més gran) que XZ, llavors el pla XZ serà en el que farem la projecció.<br />

66


Projecte<br />

2. Trobem la caixa englobant <strong>de</strong>l polígon. Una textura té sempre la forma d’un<br />

rectangle. El proposit d’aquest pas està en <strong>de</strong>finir aquest rectangle i trobar les seves<br />

dimensions. Això es realitza trobant la caixa englobant que conté aquest polígon.<br />

Figura 3.2.2.3: Càlcul <strong>de</strong>l Bounding box<br />

Per realitzar això, el mínim i el màxim <strong>de</strong> les coor<strong>de</strong>na<strong>de</strong>s u,v son <strong>de</strong>termina<strong>de</strong>s, el<br />

següent algorisme calcula aquests valors:<br />

Assignem a les coor<strong>de</strong>na<strong>de</strong>s Max i min u i v les coor<strong>de</strong>na<strong>de</strong>s UV (x i z en aquest cas)<br />

<strong>de</strong>l primer vèrtex.<br />

Per cada vèrtex <strong>de</strong>l polígon<br />

Si max u < vèrtex u llavors max u = vèrtex u<br />

Si min u > vèrtex u llavors min u = vèrtex u<br />

Si max v < vèrtex v llavors max v = vèrtex u<br />

Si min v > vèrtex v llavors min v = vèrtex v<br />

Fper<br />

Algorisme 1<br />

Després d’aquest pas, la caixa englobant representa l’àrea <strong>de</strong>l Lightmap.<br />

3. Fem que totes les coor<strong>de</strong>na<strong>de</strong>s u, v siguin relatives a l’origen <strong>de</strong> la textura. L’origen<br />

<strong>de</strong> la textura és el Min u i Min V (punt A) en l’anterior figura. Per tal <strong>de</strong> fer totes les<br />

coor<strong>de</strong>na<strong>de</strong>s u,v relatives a aquest punt, simplement restem les Min u, Min V <strong>de</strong> les<br />

coor<strong>de</strong>na<strong>de</strong>s u,v <strong>de</strong>l Lightmap <strong>de</strong> cada vèrtex <strong>de</strong>l polígon<br />

4. Escalem totes les coor<strong>de</strong>na<strong>de</strong>s u,v <strong>de</strong>l Lightmap en el rang 0.0 a 1.0. Per fer això<br />

hem <strong>de</strong> conèixer les dimensions <strong>de</strong> la textura (normalment son conegu<strong>de</strong>s). Per<br />

<strong>de</strong>terminar l’amplada: max u – min u, similar per trobar l’alçada: max v – min v.Ara<br />

dividim la coor<strong>de</strong>nada u <strong>de</strong> cada vèrtex per l’amplada <strong>de</strong> la textura i dividim la<br />

coor<strong>de</strong>nada v <strong>de</strong> cada vèrtex per l’alçada <strong>de</strong> la textura.<br />

En aquest moments tenim les correctes coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong>l Lightmap per cada vèrtex <strong>de</strong>l<br />

polígon. Les dimensions d’aquest Lightmap son també conegu<strong>de</strong>s. El pròxim pas està<br />

67


Projecte<br />

en generar el Lightmap. És molt important dir que les textures son <strong>de</strong>fini<strong>de</strong>s en un<br />

espai <strong>de</strong> textures en dues dimensions. El polígon al que se l’hi aplicarà té un espai <strong>de</strong><br />

mon (coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> mon) en tres dimensions. Quan la textura es generada, és recorre<br />

lumel a lumel utilitzant dos bucles anidats. Quan el valor d’un <strong>de</strong>terminat lumel s’ha <strong>de</strong><br />

<strong>de</strong>terminar, el lumel s’ha <strong>de</strong> projectar <strong>de</strong> dues dimensions a unes coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> mon<br />

en tres dimensions. Aquest pas és necessari per assegurar que la orientació <strong>de</strong> la font <strong>de</strong><br />

llum és correcte així que el càlcul <strong>de</strong> la il·luminació serà correcte.<br />

Segon pas, generació <strong>de</strong>l Lightmap<br />

Figura 3.2.2.4: Generació Lightmaps<br />

La figura anterior és la mateix figura vista en el primer pas per crear un Lightmap però<br />

amb informació afegida. Quan el contingut <strong>de</strong>l Lightmap es generat, la generació<br />

començarà en el punt A. El punt A està en coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> textura en dues dimensions,<br />

per tant s’hauran <strong>de</strong> calcular les coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong>l punt A en coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> mon (tres<br />

dimensions). En l’exemple el polígon ha estat projectat contra el pla ZX. Les<br />

coor<strong>de</strong>na<strong>de</strong>s z i z <strong>de</strong>l punt A es po<strong>de</strong>n calcular d’una manera simple ja que son les<br />

coor<strong>de</strong>na<strong>de</strong>s min u i min v respectivament. La coor<strong>de</strong>nada Y no es coneix, per tal <strong>de</strong><br />

trobar-la necessitem trobar l’equació <strong>de</strong>l pla <strong>de</strong>l polígon en el que resi<strong>de</strong>ix el Lighmap.<br />

Un cop trobada l’equació <strong>de</strong>l plà trobar la component Y és trivial.<br />

L’equació <strong>de</strong>l pla és:<br />

Ax + By + Cz + D = 0<br />

La component X i Z son conegu<strong>de</strong>s, així que l’equació ens donarà el valor <strong>de</strong> Y:<br />

y = - ( Ax + Cz + D ) / B<br />

El pròxim pas està en trobar els dos vectors que comencen en el punt A (un vector<br />

apuntant cap a la direcció d’un extrem <strong>de</strong> la textura, l’altre cap a l’altre) que serien els<br />

vectors marcats en la figura anterior com a B i C. Po<strong>de</strong>m <strong>de</strong>finir el vector B = D – A,<br />

però no és correcta ja que el punt D està en coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> textura (dues dimensions),<br />

en comptes d’això s’empra l’equació <strong>de</strong>l plà <strong>de</strong>l polígon per tal <strong>de</strong> <strong>de</strong>terminar la<br />

coor<strong>de</strong>nada Y <strong>de</strong>ls punts D i E.<br />

68


Els dos vectors son <strong>de</strong>finits com:<br />

B = D3D - A<br />

C = E3D – A<br />

Projecte<br />

On D3D i E3D fan referència als punts D i E projectats en les tres dimensions en les<br />

coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> mon.<br />

Un cop realitzats els passos anteriors, es realitza una interpolació entre els vectors B i C<br />

al llarg <strong>de</strong> la superfície <strong>de</strong>l Ligthmap, per tal <strong>de</strong> <strong>de</strong>terminar tota la informació necessària<br />

per generar el Lightmap. L’algorisme següent mostra com generar el Lightmap:<br />

Per ly = 0 a l’alçada <strong>de</strong>l Lightmap<br />

Per lx = 0 a l’amplada <strong>de</strong>l Lightmap<br />

Fiper<br />

Fiper<br />

LL = posició <strong>de</strong>l lumel L(lx, ly) en coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> mon (es<br />

troba a partir <strong>de</strong> la interpolació i el vector A).<br />

Il·luminació = calculem la il·luminació en LL.<br />

Guar<strong>de</strong>m la il·luminació en el Lightmap[lx][ly].<br />

Algorisme 2<br />

Figura 3.2.2.5: Calculant el Lightmap<br />

La figura anterior mostra els passos <strong>de</strong> l’algorisme anterior. Suposem que el bucle <strong>de</strong><br />

l’algorisme a arribat al lumel L. En la figura b es mostra el pla <strong>de</strong> projecció La figura c<br />

mostra el pla <strong>de</strong> projecció i la “transformació” en coor<strong>de</strong>na<strong>de</strong>s <strong>de</strong> mon (tres<br />

dimensions) on es pot veure la font <strong>de</strong> llum. Po<strong>de</strong>m també observar que tenim tota la<br />

informació necessària per calcular la il·luminació en el punt LL.<br />

Nr és el vector normal al polígon.<br />

D és el vector apuntat cap a la font <strong>de</strong> llum. G és la longitud d’aquest vector D.<br />

P és el polígon actual al que aplicarem el Lightmap. Qualsevol mo<strong>de</strong>l d’il·luminació pot<br />

ser aplicat per tal <strong>de</strong> <strong>de</strong>terminar la correcta il·luminació en LL. Cal remarcar que tots els<br />

càlculs son realitzats abans <strong>de</strong> ren<strong>de</strong>ritzar, per tal el mo<strong>de</strong>l d’il·luminació podria tenir un<br />

cost elevat, ja que és realitzar abans <strong>de</strong> que l’escena sigui visualitzada per pantalla.<br />

69


Projecte<br />

Aquest és el cas <strong>de</strong> les obscurances, que son calcula<strong>de</strong>s quan l’escena és carregada i<br />

preparada per visualitzar-se. El mèto<strong>de</strong> per calcular la i·luminació en el Crystal Space<br />

és:<br />

Intesitat × Terme_<br />

difus×<br />

( Nr×<br />

D)<br />

Il·luminació =<br />

γ<br />

Emprant aquesta equació la intensitat <strong>de</strong> la llum és inversament proporcional a la<br />

distància <strong>de</strong>l punt a la font <strong>de</strong> llum ja que γ serà més gran quan més lluny estigui el<br />

lumel projectet <strong>de</strong> la font <strong>de</strong> llum.<br />

Com hem comentat anteriorment aquest pas és realitzat automàticament pel Crystal<br />

Space, però necessitàvem saber com realitza el procés <strong>de</strong> generació <strong>de</strong> Lightmaps <strong>de</strong><br />

cada superfície per tal d’afegir el càlcul <strong>de</strong> les obscurances.<br />

3.2.3.Càrrega i Estructuració <strong>de</strong> l’escena: Voxels<br />

Per augmentar la velocitat, l’eficiència <strong>de</strong>l càlcul <strong>de</strong> les interseccions <strong>de</strong>ls raigs amb els<br />

plans que representen els Patchs / polígons, la’escena s’estructura mitjançant Voxels.<br />

Un Voxel és un element <strong>de</strong> volum (Volumen element) que habitualment es representa<br />

mitjançant un cub. Donada una escena, si es divi<strong>de</strong>ix tot l’espai en subespais en forma<br />

<strong>de</strong> cubs, obtenim una escena voxelitzada.<br />

Figura 3.2.3.1: Pasos a realitzar<br />

Figura 3.2.3.2: Voxels<br />

Quan és llegeixen les da<strong>de</strong>s d’un objecte, per cada un <strong>de</strong>ls patchs d’aquest (pels vèrtexs)<br />

és fa un petit càlcul per <strong>de</strong>terminar en quin voxel està el patch afegint-lo a la llista <strong>de</strong><br />

patchs <strong>de</strong>l voxel, <strong>de</strong>sprés sí el polígon al que pertany el patch no està en la llista <strong>de</strong><br />

polígons <strong>de</strong>l voxel, s’afegueix a aquesta llista. L’algorisme per realitzar aquest petit<br />

càlcul per saber en quin voxel està un vèrtex és:<br />

Caixa: és la caixa englobant <strong>de</strong> tota l’escena<br />

Num_voxels_x: nombre <strong>de</strong> voxels <strong>de</strong> l’escena en l’eix X ( el mateix per<br />

Y i Z)<br />

70


vèrtex.<br />

x − caixa.<br />

MinX<br />

X = PartEntera ( × num _ voxels _ x)<br />

caixa.<br />

MaxX − caixa.<br />

MinX<br />

vèrtex.<br />

y − caixa.<br />

MinY<br />

× num _ voxels _<br />

caixa.<br />

MaxY − caixa.<br />

MinY<br />

vèrtex.<br />

z − caixa.<br />

MinZ<br />

× num _ voxels _<br />

caixa.<br />

MaxZ − caixa.<br />

MinZ<br />

Y = PartEntera ( y )<br />

Z = PartEntera ( z)<br />

Voxel_al_que_va = X + Y * num_voxels_x + Z * num_voxels_x *<br />

num_voxels_y;<br />

Algorisme 3<br />

Projecte<br />

Resumint, dins <strong>de</strong> cada Voxel guar<strong>de</strong>m dues llistes, la primera llista amb els polígons<br />

que hi ha dins <strong>de</strong> cada Voxel, o bé el “traspassen”, i la segona llista amb els patchs que<br />

hi ha dins o traspassen el Voxel. Es guar<strong>de</strong>n dues llistes pel fet <strong>de</strong> que donat un polígon<br />

dins el voxel necessitem saber d’una manera ràpida els patchs <strong>de</strong>l polígons que hi ha<br />

dins el voxel <strong>de</strong>terminat, i sinó tinguéssim la segona llista no hi hauria una manera<br />

ràpida <strong>de</strong> saber quins son els patchs d’un polígon que que<strong>de</strong>n dins d’un voxel i quins<br />

que<strong>de</strong>n fora. A més la llista <strong>de</strong> polígons ens servirà per quan s’hagi <strong>de</strong> buscar la<br />

intersecció d’un raig amb l’escena (primer es comprova el raig contra cada polígon <strong>de</strong>l<br />

voxel actual) i <strong>de</strong>sprés es calcula el patch interceptat.<br />

Un esquema <strong>de</strong> l’estructura <strong>de</strong> les llistes <strong>de</strong>ls voxels és:<br />

Figura 3.2.3.3: Estructura <strong>de</strong> llista <strong>de</strong>ls voxels <strong>de</strong> l’escena<br />

S’ha triat aquesta estructuració <strong>de</strong> l’escena per la simplicitat a la hora d’implementar<br />

aquesta jerarquia contraposada al grau <strong>de</strong> dificultat que comporta una jerarquia <strong>de</strong>l tipus<br />

octree.<br />

3.2.4.Algorisme per calcular les Obscurances<br />

Tenint en compte l’estructura jeràrquica <strong>de</strong> l’escena en Voxels [2][10] l’esquema <strong>de</strong>l<br />

càlcul <strong>de</strong> les Obscurances és el següent:<br />

71


Figura 3.2.3.1: Pasos a realitzar<br />

I l’algorisme per calcular les Obscurances serà:<br />

Per Cada Voxel (v) en l’escena<br />

FPer<br />

Per Cada Patch (p) <strong>de</strong> la lista <strong>de</strong> Patch <strong>de</strong>l Voxel (v)<br />

FPer<br />

Per Cada Raig (r) aleatori que es llença <strong>de</strong>l Patch (p)<br />

Fper<br />

Calcular el patch d’intersecció<br />

Calcular i Acumular el valor <strong>de</strong> la obscurance<br />

Aplicar Obscurance al Patch (p)<br />

Algorisme 4<br />

Projecte<br />

Amb aquest algorisme el nombre d’objectes que s’han <strong>de</strong> comprovar és petit, ja que<br />

només comprovem el raig contra tots els objectes <strong>de</strong>l voxel actual, po<strong>de</strong>m estar segurs<br />

que si intercepta algun objecte <strong>de</strong>l voxel actual, aquest estarà molt pròxim, per tant no<br />

haurem <strong>de</strong> comprovar els altres voxels.<br />

Per cada patch que tractem es llancen n raigs. De cada raig calculem les Obscurances i<br />

les acumulem per quan acabem <strong>de</strong> llençar tots el raigs <strong>de</strong>l patch actual, po<strong>de</strong>r a partir<br />

<strong>de</strong>l valor <strong>de</strong> les Obscurances modificar el Lightmap <strong>de</strong>l polígon al que pertany el patch<br />

(en concret el Lumel corresponent al patch amb el valor <strong>de</strong> la Obscurance d’aquest)<br />

Voxel origen <strong>de</strong>l raig<br />

Quan un raig és generat <strong>de</strong>s d’un patch podria donar-se el cas que el patch estigués<br />

entre dos voxels. Per aquest motiu necessitem calcular quin és el voxel <strong>de</strong>s d’on<br />

72


Projecte<br />

s’origina ja que primer és tracta tots els objectes <strong>de</strong>l voxel originari. Per calcular el voxel<br />

<strong>de</strong>s d’on s’origina aplicarem el mateix procediment que per calcular el patch interceptat,<br />

però amb unes petites modificacions:<br />

Caixa: indica la caixa englobant <strong>de</strong> tota l’escena<br />

Num_voxels_x: indica el nombre <strong>de</strong> voxels en l’eix X (igualment per Y i<br />

Z).<br />

Punt_origen: indica el punt <strong>de</strong>s <strong>de</strong>l que s’origina el raig.<br />

X = PartEntera (<br />

Y = PartEntera (<br />

Z = PartEntera (<br />

( punt.<br />

x − caixa.<br />

MinX ) × num _ voxels _ x<br />

caixa.<br />

MaxX − caixa.<br />

MinX<br />

( punt.<br />

y − caixa.<br />

MinY ) × num _ voxels _ y<br />

caixa.<br />

MaxY − caixa.<br />

MinY<br />

( punt.<br />

z − caixa.<br />

MinZ)<br />

× num _ voxels _ Z<br />

caixa.<br />

MaxZ − caixa.<br />

MinZ<br />

voxel origen = X + Y * num_voxels_x + Z * num_voxels_x * num_voxels_y<br />

Llançament <strong>de</strong> raigs<br />

algorisme 5<br />

Per calcular les Obscurances necessitem llençar n raigs per cada un <strong>de</strong>ls patchs en que<br />

és subdivi<strong>de</strong>ix l’escena. Quan un raig intercepta un altre patch llavors apliquem la<br />

fòrmula <strong>de</strong> les obscurances per obtenir el valor final <strong>de</strong>l patch origen <strong>de</strong>l raig.<br />

Generació <strong>de</strong>l raig aleatori<br />

Cada raig que és genera segueix una distribució aleatòria <strong>de</strong>l tipus drand48 que retornar<br />

valors <strong>de</strong> 48 bits <strong>de</strong> doble precisió positius <strong>de</strong> coma flotant i uniformement distribuïts<br />

sobre l’interval [0.0, 1.0]. A partir d’aquests valors generem el punt on s’inicia el raig<br />

sobre <strong>de</strong>l patch i la direcció cap on es dirigeix.<br />

El raig aleatori segueix l’equació <strong>de</strong> la recta:<br />

On P0 és la posició on començar el raig.<br />

Direcció es el vector direcció <strong>de</strong>l raig.<br />

T és el temps.<br />

P0 + Direcció * t = 0<br />

)<br />

)<br />

)<br />

73


Projecte<br />

Per trobar la distància màxima fins la que el raig arribarà prenem t = Lmax per tant<br />

obtindrem:<br />

Po + Direcció * Lmax = 0<br />

Aquesta equació ens servirà per calcular la intersecció d’una recta amb un polígon, com<br />

veurem més endavant.<br />

Calcular el patch interceptat<br />

L’algorisme per calcular les intercepcions <strong>de</strong>ls raigs amb els objectes <strong>de</strong> l’escena per tal<br />

<strong>de</strong> calcular les Obscurances és simple. A continuació mostrem l’algorisme per trobar la<br />

intercepció <strong>de</strong>l raig amb l’escena:<br />

Calculem el Voxel on s’origina el raig<br />

Per cada Polígon (i) en la lista <strong>de</strong> Polígons <strong>de</strong>l Voxel actual<br />

fper<br />

Comprovem intersecció<br />

Si la intersecció està més aprop que l’anterior, guar<strong>de</strong>m<br />

l’actual.<br />

Si hi ha intersecció<br />

Calculamem el patch on es produeix la intersecció<br />

altrament<br />

Calculem el Voxel cap el que va el raig.<br />

S’apliquen els mateixos passos per el nou Voxel, exceptuant el<br />

pas 1 (càlcul <strong>de</strong>l Voxel origen, ja es coneix)<br />

fsi<br />

Algorisme 6<br />

Per comprovar si un raig intercepta amb un polígon, primer es comprova si el raig<br />

intercepta el pla que conté el polígon, si és així es comprova si el punt interceptat està<br />

dins el polígon que estem comprovant. L’algorisme per testeijar si el raig intercepta el<br />

pla <strong>de</strong>l polígon és:<br />

vu = raig.punt_final – raig.punt_inici;<br />

<strong>de</strong>nom = pla.normal * vu;<br />

Si <strong>de</strong>nom = 0 llavors //el raig i el pla son paral·lels<br />

Retornar fals<br />

distància =<br />

pla . normal * inici + pla.<br />

DD<br />

−<br />

<strong>de</strong>nom<br />

punt_interceptat = inici + distància * vu;<br />

Algorisme 7<br />

74


Projecte<br />

Si és passa el test (si el raig intercepta el pla) llavors fem un test per <strong>de</strong>tectar si el punt<br />

interceptat està dins el polígon, per fer això seguim l’algorisme:<br />

Projectem el polígon a 2D ( en el pla dominant, tal i com fèiem en el<br />

pas 1 <strong>de</strong>ls Lightmaps)<br />

Per i = 1 fins nombre_vertex fer<br />

i2 = i + 1;<br />

Si i = nombre_vertex llavors i2 = 0<br />

Si Determinant (vertex(i), vertex(i2)) < 0 llavors retornem fals<br />

Fper<br />

Retornem cert<br />

Algorisme 8<br />

Un cop <strong>de</strong>tectat si el raig intercepta un polígon en concret, hem <strong>de</strong> calcular el patch en<br />

el que intercepta, aquesta càlcul és resumeix a:<br />

Projectem el polígon sobre el pla dominant (2D), fem el mateix pel<br />

punt d’intersecció.<br />

X = PartEntera (<br />

Y = PartEntera (<br />

( punt _ int<br />

( punt _ int<br />

erceptat.<br />

x − poligon2d.<br />

MinX ) × Amplada _ lightmap<br />

poligon2d.<br />

MaxX − poligon2d.<br />

MinX<br />

erceptat.<br />

y − poligon2d.<br />

MinY ) × Alçada _lightmap<br />

poligon2d.<br />

MaxY − poligon2d.<br />

MinY<br />

Patch_interceptat = X + Y * amplada_Lightmap;<br />

Algorisme 9<br />

Per exemple, suposem que hem trobat que el raig originat en un patch ha interceptat el<br />

punt (2.5, 2.5, 0.0) i ens interessa trobar el patch al que pertany aquest punt.<br />

Figura 3.2.4.1: Exemple càlcul patch interceptat<br />

)<br />

)<br />

75


Projecte<br />

Suposem que el polígon interceptat <strong>de</strong> vèrtex inferior (0.0, 0.0, 0.0) i superior (4.0, 4.0,<br />

0.0), sabem també que la grandària <strong>de</strong>l Lightmap és <strong>de</strong> 4x4.<br />

Primer pas: Projectem el polígon a dos dimensions que en aquest cas és : (0.0, 0.0), (4.0,<br />

0.0), (4.0, 4.0) i (0.0, 4.0)<br />

Segon pas:<br />

( 2.<br />

5 − 0.<br />

0)<br />

× 4<br />

X = ≅ 2<br />

4.<br />

0 − 0.<br />

0<br />

( 2.<br />

5 − 0.<br />

0)<br />

× 4<br />

Y = ≅ 2<br />

4.<br />

0 − 0.<br />

0<br />

Patch interceptat = 2 + 2 x 4 = 10 com que la numeració comença en 1 (en comptes <strong>de</strong><br />

0) sumem un + 1. Per tant el patch final és el 11.<br />

Un cop és coneix el Patch amb el que intercepta el raig i coneixem el valor <strong>de</strong> la<br />

Obscurance po<strong>de</strong>m modificarel valor <strong>de</strong>l Lightmap a la posició corresponent.<br />

Calculant i aplicant les Obscurances al patch origen <strong>de</strong>l raig<br />

Un cop tenim les obscurances acumula<strong>de</strong>s per un patch en concret simplement<br />

apliquem aquest valor <strong>de</strong> la Obscurance al Lightmap <strong>de</strong>l polígon al que pertany el patch<br />

(modifiquem el Lumel <strong>de</strong>l Lightmap amb el valor <strong>de</strong> la Obscurance calculada que<br />

correspon al patch actual que estem tractant). L’algorisme que hem vist en l’apartat<br />

3.2.4 reflectia tot el procés <strong>de</strong> calcular les obscurances per tota l’escena, anem a centrarnos<br />

en la part <strong>de</strong> llançar els raigs d’un patch i calcular les Obscurances:<br />

Per num_raig = 0 fins a raigs_per_patch fer<br />

Raig = GenerarRaigAleatori();<br />

Voxel_origen = CalcularVoxelOrigen(Raig);<br />

Patch_<strong>de</strong>sti = LlençarRaig ( voxel_origen, raig);<br />

Si Patch_<strong>de</strong>sti llavors<br />

funcio =<br />

patch_<br />

<strong>de</strong>sti.<br />

dis tan cia<br />

L max<br />

Color_patch_<strong>de</strong>sti = patch_<strong>de</strong>sti->ObtenirColor();<br />

Color_patch_origen = patch_origen->ObtenirColor();<br />

Altrament<br />

funcio = 1;<br />

fsi<br />

oscur_origen = oscur_origen + funcio * color_patch_<strong>de</strong>sti;<br />

76


Fper<br />

oscur_origen =<br />

oscur _ origen<br />

raigs _ per _ patch<br />

Patch_origen->PosaObscuranceAlLumel (obscur_origen);<br />

;<br />

Algorisme 10<br />

Projecte<br />

Depenent <strong>de</strong>l tipus d’Obscurance calculem la Obscurance a partir <strong>de</strong> la llum ambient,<br />

la part directa, la obscurance mitjana, etc. En aquest cas hem triat el cas simple.<br />

Inicialització <strong>de</strong> les estructures per a les Obscurances en temps real<br />

Per po<strong>de</strong>r treballar amb les Obscurances en temps real, hem d’afegir dues llistes més,<br />

llista <strong>de</strong> patchs dinàmics i llista <strong>de</strong> polígons dinàmics. Ens serviran per guardar els<br />

patchs i polígons respectivament <strong>de</strong>ls objectes que estan en moviment.<br />

L’objetiu d’aquestes dos noves llistes és po<strong>de</strong>r controlar a cada quadre els patchs o<br />

polígons dinàmics que existeixen en l’escena en un instant <strong>de</strong>terminat. D’aquesta<br />

manera, quan es processi el següent quadre, po<strong>de</strong>m eliminar sense problemes aquestes<br />

dues llistas, per a posteriorment tornar o omplenar-les amb els nous patchs o polígons<br />

que es troben en aquest moment dins d’un voxel.<br />

L’algorisme per tractar les llistes <strong>de</strong> patchs i polígons inicial és:<br />

Per cada Patch (p) <strong>de</strong> l’escena<br />

Calculem Obscurances<br />

fper<br />

Si un raig intercepta un objecte en moviment<br />

Guar<strong>de</strong>m el patch (p) interceptat en la llista <strong>de</strong> patchs<br />

dinàmics.<br />

Altrament<br />

Si el raig s’origina en un patch d’un objecte en moviment<br />

Guar<strong>de</strong>m el patch interceptat en la llista <strong>de</strong> patchs<br />

dinàmics<br />

fsi<br />

Algorisme 11<br />

Un cop hem inicial les llistes <strong>de</strong> patchs dinàmics i polígons dinàmics, a cada quadre <strong>de</strong><br />

la navegació dins l’escena l’algorisme per processar aquestes llistes és el següent:<br />

Per cada Patch (p) <strong>de</strong>ls objectes en moviment fer<br />

Recalculem Obscurances<br />

Guar<strong>de</strong>m els patchs interceptats en una nova llista (2)<br />

Fper<br />

Per cada patch en la llista <strong>de</strong> patchs dinàmics fer<br />

Recalculem Obscurances<br />

77


Fper<br />

Si un raig intercepta un objecte en moviment<br />

Guar<strong>de</strong>m el patch en la nova llista(2)<br />

Fsi<br />

Esborrem la llista <strong>de</strong> patchs dinàmics<br />

Llista <strong>de</strong> patchs dinàmics = nova llista(2)<br />

3.2.5.Exemple pas a pas<br />

Algorisme 12<br />

Projecte<br />

Suposem que l’escena ja estat carregada a les estructures <strong>de</strong> voxels. Per tant cada voxel<br />

té una llista <strong>de</strong> patchs i una llista <strong>de</strong> polígons que els travessen.<br />

Per cada patch:<br />

Per cada raig <strong>de</strong>l patch:<br />

• Pas 1: es genera un raig aleatori en el patch actual (hem <strong>de</strong> generar n raigs<br />

per patch).<br />

Figura 3.2.5.1: pas 1 càlcul obscurances, generació <strong>de</strong>l raig<br />

• Pas 2: Calculem el Voxel origen <strong>de</strong>l raig.<br />

Figura 3.2.5.2: pas 2 càlcul obscurances, càlcul voxel origen <strong>de</strong>l raig<br />

78


Projecte<br />

• Pas 3: Comprovem el raig contra els polígons <strong>de</strong>l voxel on s’origina<br />

(calculem la intersecció)<br />

Figura 3.2.5.3: pas 3 càlcul obscurances, testeig raig contra els polígons <strong>de</strong>l voxel<br />

• Pas 4: suposem que el raig no intersecta avancem al següent voxel i<br />

comprovem el raig contra la llista <strong>de</strong> polígons <strong>de</strong>l nou voxel.<br />

Figura 3.2.5.4: pas 4 càlcul obscurances, avançar al següent voxel<br />

• Pas 5: Suposem que hi ha intersecció. Tenim el polígon interceptat i el punt<br />

interceptat, amb el que calcularem el patch <strong>de</strong>l polígon que ha rebut<br />

l’impacte.<br />

• Pas 6: Acumulem el valor <strong>de</strong> la Obscurance calculada per tots el raigos que<br />

és llancen <strong>de</strong>s <strong>de</strong>l patch actual, per tal <strong>de</strong> calcular la Obscurance final <strong>de</strong>l<br />

patch i po<strong>de</strong>r aplicar-la al Lightmap <strong>de</strong>l polígon.<br />

Per una escena amb objectes en moviment (dinàmics) és segueix els mateixos passos,<br />

que amb una escena estàtica, però s’afegeixen dues llistes noves, la llista <strong>de</strong> patchs i<br />

polígons <strong>de</strong>ls objectes en moviment. Per inicialitzar aquestes dues llistes és segueix<br />

l’algorisme 11 i per els successius recàlculs (successius quadres) es segueix l’algorisme<br />

12 que hem vist anteriorment.<br />

79


3.3. Implementació<br />

Per a una explicació <strong>de</strong>tallada <strong>de</strong> les classes consultar el manual tècnic.<br />

3.3.1 Relació entre classes<br />

Projecte<br />

Tal i com ja s’ha comentat, el programa està dividit en un conjunt <strong>de</strong> classes (per<br />

l’estructura <strong>de</strong> da<strong>de</strong>s), a més s'utilitzen classes propies <strong>de</strong>l Crystal Space versió 0.95.<br />

En l’esquema següent es veu clarament quina relació existeix entre cada classe i cada<br />

mòdul. Cal remarcar que només mostra les relacions principals entre les classes més<br />

importants. Per a més informació consultar el codi font.<br />

Figura 3.3.1.1: esquema <strong>de</strong> classes<br />

Raig: ens representa un raig en 3D. Aquesta classe utilitza les classes csIntersect3D i<br />

csPolygon3D per tal <strong>de</strong> comprovar i calcules les interseccion.<br />

Patch: ens representa una petita part <strong>d'un</strong> polígon, per simplificar hem consi<strong>de</strong>rat que<br />

un Patch correspont a un Lumel (element <strong>de</strong>l Lightmap <strong>d'un</strong> polígon).<br />

PatchList: Llista dinàmica on guardarem els Patchs.<br />

80


Projecte<br />

ObsPoly: Ens representa un polígon 3D <strong>de</strong> la escena, aquesta classe conté un objecte<br />

<strong>de</strong>l tipus csPolygon3D i csLightmap (per modificar el Lightmap amb les Obscurances)<br />

i la llista <strong>de</strong> patchs <strong>de</strong>l polígon PatchList.<br />

ObsPolyList: Llista que contè objectes <strong>de</strong>l tipus ObsPoly, ens servirà per<br />

emmagatzemar els polígons <strong>de</strong> l'escena.<br />

Voxel: Classe que representa una divisió <strong>de</strong> l'espai en forma <strong>de</strong> cub, dins d'aquest<br />

objecte tenim la llista <strong>de</strong> patchs que hi ha dins <strong>de</strong>l voxel (ObsPatchList) i la llista <strong>de</strong><br />

polígons que hi ha dins el voxel (ObsPolyList).<br />

VoxelList: Llista <strong>de</strong> voxels <strong>de</strong> l'escena, contè cada uns <strong>de</strong>ls voxels en que es subdivi<strong>de</strong>ix<br />

l'escena.<br />

Obscurance: Aquesta és la classe principal <strong>de</strong> la jerarquia. Aquesta classe conté la<br />

llista <strong>de</strong> Voxels (VoxelList) i la llista <strong>de</strong> polígons <strong>de</strong> l'escena (ObsPolyList).<br />

ObsCube: Ens representa els cubs en moviment <strong>de</strong> l’escena, guarda les da<strong>de</strong>s d’un<br />

objecte en moviment, en el nostre cas els objectes en moviment tenen una ruta <strong>de</strong><br />

moviment <strong>de</strong>terminat.<br />

csEngine: És la classe mare <strong>de</strong>l CS, sempre s’executa la primera, aquesta classe<br />

controla la creació <strong>de</strong> les Obscurances, com veurem en el següent apartat.<br />

iCommandLineParser: Interfície <strong>de</strong>l CS que s’encarrega <strong>de</strong> lleguir els paràmetres<br />

d’entrada <strong>de</strong> l’aplicació.<br />

iConfigManager: Ens ajudarà a lleguir els paràmetres <strong>de</strong>ls fitxers <strong>de</strong> configuració per<br />

tal <strong>de</strong> configurar els valors que s’utilitzen en les Obscurances (com en nombre <strong>de</strong><br />

voxels, nombre <strong>de</strong> raigs per patch, etc).<br />

csMapToLoad: La funció d’aquesta classe està en carregar l’escena.<br />

iMeshWrapper: Interfície encarregada <strong>de</strong> controlar els accessos a la geometria d’un<br />

objecte. A partir d’aquesta po<strong>de</strong>m accedir als polígons, vèrtexs, etc.<br />

csPath: Classe que s’encarrega <strong>de</strong> calcular a cada quadre “d’animació” la nova posició<br />

on es troben els objectes en moviment.<br />

Walktest: Classe encarregada d’inicialitzar l’aplicació walktest, la seva funció està en<br />

controlar la activació/<strong>de</strong>sactivació <strong>de</strong> les Obscurances per l’usuari i a més <strong>de</strong> controlar<br />

que és realitzi el càlcul <strong>de</strong> les Obscurances en temps real a cada quadre <strong>de</strong> l’animació.<br />

3.3.2 Seqüència d’execució bàsica<br />

L’esquema <strong>de</strong> la seqüència d’execució bàsica per el nostre projecte és:<br />

81


Figura 3.3.1.2: seqüència d’execució bàsica<br />

Projecte<br />

Primer <strong>de</strong> tot instanciem l’objecte walktest, que ens inicialitzarà tot el necessari per<br />

l’execució <strong>de</strong> l’aplicació. Aquest objecte ens llegeix els fitxers <strong>de</strong> configuració<br />

necessàris, com per exemple “autoexec.cfg” que ens indica l’associació <strong>de</strong> les tecles<br />

amb accions, tal i com veurem en el següent apartat. A continuació el control <strong>de</strong><br />

l’aplicació passa a la classe csEngine que llegirà el fitxer <strong>de</strong> configuració “engine.cfg”<br />

que conté en el nostre valors <strong>de</strong> configuració <strong>de</strong> les Obscurances (per exemple: nombre<br />

<strong>de</strong> voxels, nombre <strong>de</strong> raigs per patch, etc), acte seguit calcularà les Obscurances i<br />

modificarà els valors <strong>de</strong>ls Lightmaps <strong>de</strong>ls polígons i permetrà navegar l’escena. En el<br />

cas <strong>de</strong> les Obscurances en temps real la classe csEngine crida a cada quadre d’animació<br />

la funció setupframe <strong>de</strong> la classe walktest i és aquí on és realitzaran les accions<br />

necessàries.<br />

Anem a veure amb més <strong>de</strong>tall el que fa l’aplicació walktest.<br />

3.3.3 Aplicació walktest<br />

Per tal <strong>de</strong> <strong>de</strong>senvolupar el projecte, necessitem estudiar dues parts <strong>de</strong>l CS. Aquestes<br />

parts son l’aplicació walktest i la classe csEngine.<br />

L’aplicació walktest ens permet navegar per una escena, per tant po<strong>de</strong>m aprofitar-la<br />

com a punt <strong>de</strong> partida <strong>de</strong>l <strong>de</strong>senvolupament <strong>de</strong>l projecte.<br />

Anem llavors, a estudiar com funciona l’aplicació walktest.<br />

Aquesta aplicació com hem comentat anteriorment, ens permetrà navegar per una<br />

escena d’una manera còmo<strong>de</strong>, a més és molt configurable per a l’usuari (consultar el<br />

manual d’usuari). Aquesta aplicació és troba en el directori “apps/walktest/” <strong>de</strong>l CS.<br />

Les Obscurances és po<strong>de</strong>n activar o <strong>de</strong>sactivar, es a dir po<strong>de</strong>m veure com quedarien els<br />

Lightmap sense el càlcul <strong>de</strong> les Obscurances o amb el càlcul. Al igual que les<br />

Obscurances en temps real per objectes en moviment. Per realitzar això existeix un<br />

82


Projecte<br />

fitxer <strong>de</strong> configuració “data/config/autoexec.cfg” on s’associa a una combinació <strong>de</strong><br />

tecles la generació d’una comanda/event. Aquestes coman<strong>de</strong>s s’intercepten per<br />

l’aplicació walktest En el nostre cas el fitxer <strong>de</strong> configuració “autoexec.cfg” quedarà <strong>de</strong><br />

la següent manera:<br />

bind o obscurances toggle<br />

bind i rt_obscurances toggle<br />

Amb aquestes sentències indiquem que quan es premi la “o” es genera una comanda <strong>de</strong><br />

canvi <strong>de</strong>l valor <strong>de</strong> les Obscurances a true o false segons el cas, aquesta comanda<br />

s’intercepta per la funció commandhandler (dins el fitxer walkcmd.h <strong>de</strong> l’aplicació<br />

walktest) on és controlarà l’acció a realitzar:<br />

else if (!strcasecmp (cmd, "obscurances"))<br />

{<br />

csEngine *engine = (csEngine*)(Sys->Engine);<br />

csCommandProcessor::change_boolean (arg,<br />

&engine->use_obscurance, "obscurances");<br />

if (engine->use_obscurance) obs->ActivarObscurances();<br />

else obs->DesactivarObscurances();<br />

}<br />

else if (!strcasecmp (cmd, "rt_obscurances"))<br />

{<br />

csEngine *engine = (csEngine*)(Sys->Engine);<br />

if (engine->use_obscurance)<br />

{<br />

csCommandProcessor::change_boolean (arg,<br />

&engine->GetObscurance()->Realtime, "real time obscurances");<br />

}<br />

}<br />

Po<strong>de</strong>m observar com segons el cas (“o” o “i”) la acció a realitzar serà o bé s’activarà o<br />

és <strong>de</strong>sactivarà les Obscurances o bé s’activarà les Obscurances en temps real (objectes<br />

en moviment).<br />

En el cas <strong>de</strong> les Obscurances en temps real també cal afegir una sèrie <strong>de</strong> línies al fitxer<br />

“walktest.h” per tal <strong>de</strong> que a cada quadre <strong>de</strong> “l’animació” és calculin les Obscurances<br />

<strong>de</strong>ls patchs implicats.<br />

void WalkTest::SetupFrame ()<br />

{<br />

…<br />

csEngine *engine = (csEngine*)(Sys->Engine);<br />

}<br />

//the next step for the animate cube<br />

if (engine->GetObscurance())<br />

engine->GetObscurance()->Animate (elapsed_time);<br />

És a dir quan la classe csEngine prepari el següent quadre <strong>de</strong> l’animació per a ser<br />

mostrat en el següent quadre, el que farà serà cridar a la funció Walktest::SetupFrame<br />

i aquesta cridarà la funció Animate <strong>de</strong> la classe Obscurances.<br />

83


3.3.4 Classe csEngine<br />

Projecte<br />

La classe csEngine és el punt <strong>de</strong> partida <strong>de</strong> CS i la que s’encarrega <strong>de</strong> calcular la<br />

il·luminació <strong>de</strong> l’escena, per el que ens pot ser útil entendre el que fa.<br />

El principal pas a realitzar per el <strong>motor</strong> Crystal Space està en comprovar que el flag<br />

use_obscurance està actiu en el fitxer <strong>de</strong> configuració engine.cfg (en el directori<br />

“data/config/”). La classe csEngine llegeix aquest fitxer <strong>de</strong> configuració, consultar el<br />

manual d’usuari per a més informació.<br />

Aquest fitxer <strong>de</strong> configuració és llegeix <strong>de</strong>s <strong>de</strong> la classe csEngine, concretament en la<br />

funció ReadConfig i és on podrem inicialitzar els flags <strong>de</strong> les Obscurance:<br />

csEngine::use_obscurance = Config->GetBool<br />

("Engine.Lighting.Obscurance.Enable",<br />

csEngine::use_obscurance);<br />

if (csEngine::use_obscurance)<br />

{<br />

csObscurance::maxim = Config->GetFloat (<br />

"Obscurances.Maxim", csObscurance::maxim);<br />

}<br />

csObscurance::rays4patch = Config->GetInt (<br />

"Obscurances.Rays4patch", csObscurance::rays4patch);<br />

csObscurance::DimensionXBoxel = Config->GetInt (<br />

"Obscurances.XBoxels", csObscurance::DimensionXBoxel);<br />

csObscurance::DimensionYBoxel = Config->GetInt (<br />

"Obscurances.YBoxels", csObscurance::DimensionYBoxel);<br />

csObscurance::DimensionZBoxel = Config->GetInt (<br />

"Obscurances.ZBoxels", csObscurance::DimensionZBoxel);<br />

csObscurance::Sectors = Config->GetInt (<br />

"Obscurances.Sectors", csObscurance::Sectors);<br />

A partir d'aquí quan Crystal Space calculi la il·luminació en l'escena, es a dir, quan és<br />

cridi la funció ShineLight es farà:<br />

if (csEngine::use_obscurance)<br />

{<br />

obs_<strong>de</strong>bug = new csObscurance(this, meter);<br />

obs_<strong>de</strong>bug->DoObscurance();<br />

}<br />

El primer que fa aquest codi és comprovar si el flag <strong>de</strong> les Obscurances està actiu, si és<br />

el cas, instanciarà on objecte <strong>de</strong>l tipus Obscurance (prepara l'esctructuració en voxels <strong>de</strong><br />

l'escena, prepara els lightmaps, etc). El segon pas està en procedir a calcular les<br />

Obscurance.<br />

84


Projecte<br />

Un cop el càlcul <strong>de</strong> les Obscurances s'ha realitzat, tots els polígons <strong>de</strong> l'escena tenen en<br />

els seus Lightmaps els valors <strong>de</strong> les Obscurances calcula<strong>de</strong>s, per el que l'usuari podrà<br />

navegar sense cap problema per l'escena.<br />

3.3.5 Diagrama <strong>de</strong> seqüències: inicialització estructures<br />

Anem a veure <strong>d'un</strong>a manera simplificada el diagrama <strong>de</strong> seqüències:<br />

Figura 3.3.5.1: diagrama seqüències inicial<br />

La classe csEngine llegueix la configuració <strong>de</strong>l fitxer data/config/engine.cfg, a<br />

continuació i <strong>de</strong>sprés <strong>de</strong> carregar les da<strong>de</strong>s <strong>de</strong> l'escena crida, d'entre d'altres a la funció<br />

ShineLight que ens càlcula la llum <strong>de</strong> l'escena i l'aplica a cada un <strong>de</strong>ls Lightmaps <strong>de</strong>ls<br />

polígons que composen l'escena. En aquest punt, si el flag use_obscurance està activat<br />

llavors instancia un objecte <strong>de</strong>l tipus Obscurance.<br />

La classe Obscurance crea una llista <strong>de</strong> polígons <strong>de</strong> l'escena (<strong>de</strong>l tipus ObsPoly) i a<br />

continuació estructura l'escena en voxels, és a dir, inicialitza les estructures <strong>de</strong> da<strong>de</strong>s<br />

<strong>de</strong>ls Voxels (les llistes <strong>de</strong> patchs i les llistes <strong>de</strong> polígons <strong>de</strong> cada voxel).<br />

A continuació mostrem un diagrama <strong>de</strong> seqüència més <strong>de</strong>tallat <strong>de</strong>l càlcul <strong>de</strong> les<br />

Obscurances, no cal dir que és un esquema general.<br />

85


Càrrega <strong>de</strong> les da<strong>de</strong>s<br />

Projecte<br />

La implementació <strong>de</strong> la càrrega <strong>de</strong> les da<strong>de</strong>s amb el <strong>motor</strong> gràfic Crystal Space és la<br />

següent:<br />

bool csObscurance::LoadScene()<br />

{<br />

iSectorList * sec;<br />

iSector * s1;<br />

csSector * sec1;<br />

iMeshList * imeshes;<br />

iMeshWrapper * imesh;<br />

iThingState * thing;<br />

iPolygon3D * poly;<br />

csPolygon3D * p;<br />

csVector3 * vec;<br />

ObsPoly *op;<br />

register int i = 0, j = 0, k = 0, aux = 0, nv = 0;<br />

boundbox.StartBoundingBox(); //init the boundbox<br />

sec = engine->GetSectors (); //access to all the engine's sectors<br />

//l’objecte cube s’ha inicialitzat abans amb la mesh corresponent<br />

if (Cube)<br />

{<br />

//test the cube’s thing interface for return the id<br />

thing_cube = SCF_QUERY_INTERFACE(Cube->Mesh->GetMeshObject(), iThingState);<br />

}<br />

if (thing_cube)<br />

{<br />

poly = thing_cube->GetPolygon(k);<br />

pol_cube = poly->GetPrivateObject();<br />

ID_CUBE = pol_cube->GetParent()->GetID();<br />

}<br />

//for all the sectors in engine<br />

for (; i < sec->GetCount(); i++)<br />

{<br />

s1 = sec->Get(i); //acces to interface sector(i)<br />

sec1 = s1->GetPrivateObject(); //access to sector<br />

imeshes = sec1->GetMeshes(); //access to all sector's meshes<br />

for (j = 0; j < imeshes->GetCount(); j++)<br />

{<br />

imesh = imeshes->Get(j); //access to interface meshes(j)<br />

//access to thing interface of the mesh<br />

thing = SCF_QUERY_INTERFACE(imesh->GetMeshObject(), iThingState);<br />

if (thing)<br />

{<br />

//move trought all the thing's polygon<br />

for (k = 0; k < thing->GetPolygonCount(); k++)<br />

{<br />

poly = thing->GetPolygon(k); //access to polygon's interface(k)<br />

p = poly->GetPrivateObject(); //acces to polygon object<br />

if ((p->GetUnsplitPolygon() == NULL ) && //chech if polygons is not split<br />

p->GetLightMapInfo() && //and if it has a lightmap<br />

p->GetLightMapInfo()->GetPolyTex()->GetCSLightMap())<br />

{<br />

nv = p->GetVertices ().GetVertexCount();<br />

vec = new csVector3[nv];<br />

for ( aux = 0; aux < nv; aux++)<br />

{<br />

86


}<br />

}<br />

vec[aux] = p->Vwor(aux);<br />

//actualizen la caixa englobant <strong>de</strong> l’escena<br />

boundbox.AddBoundingVertex(vec[aux].x, vec[aux].y, vec[aux].z);<br />

<strong>de</strong>lete []vec;<br />

//creem un nou obspoly a partir <strong>de</strong>l polígon actual<br />

op = new ObsPoly(p);<br />

//afegim el cub a l’estructura <strong>de</strong> cubs dinàmnics<br />

if (((int)p->GetParent()->GetID() == ID_CUBE))<br />

Cube->InsertPolyCube(op);<br />

else<br />

//afegim el polygon a la llista <strong>de</strong> polygons <strong>de</strong> l'escena<br />

ObsPolyList->Insert (op);<br />

}//end if<br />

}//end for polygons<br />

thing->DecRef();<br />

}//end if thing<br />

}//end for meshes count<br />

}//end count sectors count<br />

return(true);<br />

Estructuració <strong>de</strong> l’escena en Voxels<br />

Projecte<br />

Per tal <strong>de</strong> crear la estructuració <strong>de</strong> l’escena en voxels tenim la següent implementació:<br />

bool VoxelList::CreateVoxels()<br />

{<br />

if (csObscurance::Config::voxelsx


voxel.SetBoundBox (&bound);<br />

list.push_back(voxel);<br />

} //end i loop<br />

} //end j loop<br />

} //end k loop<br />

3.3.6 Diagrama <strong>de</strong> seqüències: càlcul obscurances<br />

Figura 3.3.6.1: diagrama seqüències càlcul <strong>de</strong> les Obscurances<br />

Projecte<br />

Com hem comentat en l’esquema anterior, la classe obscurances crea una llista <strong>de</strong><br />

polígons <strong>de</strong> l'escena (<strong>de</strong>l tipus ObsPoly) i a continuació estructura l'escena en voxels, és<br />

a dir, inicialitza les estructures <strong>de</strong> da<strong>de</strong>s <strong>de</strong>ls Voxels (les llistes <strong>de</strong> patchs i les llistes <strong>de</strong><br />

polígons <strong>de</strong> cada voxel).<br />

Anem al cas mostrar en la figura anterior. Suposem que les da<strong>de</strong>s ja estan carrega<strong>de</strong>s i<br />

l’escena ja està “voxelitzada” i anem a calcular les Obscurances per un patch<br />

<strong>de</strong>terminat:<br />

1. La classe obscurances es situa en el primer voxel <strong>de</strong> l’escena.<br />

2. S’agafa el primer patch <strong>de</strong> la llista <strong>de</strong> patchs <strong>de</strong>l primer voxel.<br />

3. Es genera un raig.<br />

4. Es comprova el raig contra la llista <strong>de</strong> polígons <strong>de</strong>l voxel <strong>de</strong>s <strong>de</strong>l que s’origina el<br />

raig.<br />

5. Ens que<strong>de</strong>m amb la intersecció més pròxima.<br />

88


Projecte<br />

6. A partir <strong>de</strong>l polígon interceptat i el punt interceptat calculem el patch interceptat.<br />

7. Apliquem les fórmules <strong>de</strong> les Obscurances a partir <strong>de</strong>l color <strong>de</strong>l patch<br />

interceptat, la seva emitància, reflectància, etc.<br />

8. Apliquem les Obscurances al patch origen <strong>de</strong>l raig, hem <strong>de</strong> tenir en compte que<br />

normalment es llancen n raigs, per tant s’acumularia el valor <strong>de</strong> les Obscurances<br />

i al final s’aplica al Lightmap..<br />

Aplicar les Obscurances al patch<br />

Per tal d’aplicar les obscurances al patch corresponent tenim la funció<br />

ObsPoly::CopyColor2Lumel (int lumel, const csColor & value). Aquesta funció<br />

acce<strong>de</strong>ix a la posició (lumel representat pel patch) <strong>de</strong>l lightmap <strong>de</strong>l polígon i guarda el<br />

valor <strong>de</strong> la Obscurance en ell.<br />

void ObsPoly::CopyColor2Lumel(int lumel, const csColor & value)<br />

{<br />

int res;<br />

//the original value are in lm_c<br />

//agafem els valors <strong>de</strong>l lightmap original i li afegim<br />

//el color <strong>de</strong> la obscurance calculada i maxaquem<br />

//el resultat al lightmap<br />

csRGBpixel *lm_c = copy_lightmap->GetArray ();<br />

csRGBpixel *lm = lightmap->GetArray ();<br />

// Red<br />

res = QRound(lm_c[lumel].red * value.red);<br />

if (res > 255) res = 255;<br />

else if (res < 0) res = 0;<br />

lm[lumel].red = res;<br />

// Green<br />

res = QRound(lm_c[lumel].green * value.green);<br />

if (res > 255) res = 255;<br />

else if (res < 0) res = 0;<br />

lm[lumel].green = res;<br />

// Blue<br />

res = QRound(lm_c[lumel].blue * value.blue);<br />

if (res > 255) res = 255;<br />

else if (res < 0) res = 0;<br />

lm[lumel].blue = res;<br />

}<br />

89


3.4 Resultats i conclusions<br />

3.4.1 Captures <strong>de</strong> pantalla<br />

Projecte<br />

Room amb Obscurances i llum directe Room sense Obscurances i llum directe<br />

Infinite amb Obscurances i llum directe Infinite sense Obscurances i llum directe<br />

B4 planta, Obscurances i llum ambient B4 planta, sense Obscurances i llum ambiente<br />

90


Projecte<br />

B4 interior, Obscurances, llum ambient B4 interior, sense Obscurances, llum ambient<br />

P4, passadís, Obscurances i llum directe P4, passadís, sense Obscurances i llum directe<br />

P4, passadís, Obscurances i llum directe P4, passadís, sense Obscurances i llum directe<br />

91


3.4.2 Resultats<br />

Escena Poligons Patch Raigs Temps C. FPS FPS/TR<br />

Room 73 1423<br />

60 1,7 56 17<br />

80 2,2 56 14<br />

100 2,8 56 11,5<br />

4016<br />

Infinite 180 5508<br />

13824<br />

60 4,6 56 10,5<br />

80 5,9 56 8<br />

100 7,3 56 6,5<br />

60 6,4 40 -<br />

80 8,3 40 -<br />

100 10,3 40 -<br />

60 19,8 40 -<br />

80 20,7 40 -<br />

100 26,1 40 -<br />

Projecte<br />

Escenes Característiques: Room i Infinite, per a diferent número <strong>de</strong> patchs. La segona<br />

columna mostra el número <strong>de</strong> polígons, la tercera el número <strong>de</strong> patchs, la quarta el<br />

número <strong>de</strong> raigs llançats per patch per al càlcul <strong>de</strong> les obscurances, la cinquena és el<br />

temps <strong>de</strong> computació, la sexta el número <strong>de</strong> quadres per segon (FPS), y la última el FPS<br />

recalculant les Obscurances amb objectes en moviment dins <strong>de</strong> la escena.<br />

El sistema utilitzat per a la prova ha estat un AMD athlon 900 MHz, 768 MB RAM.<br />

Aquest ordinador és un PC <strong>de</strong> gamma baixa, i la implementació podria ser més eficient,<br />

tot i així els resultats han estat molt satisfactoris.<br />

3.4.3 Conclusions<br />

Els resultats <strong>de</strong>mostren l’assoliment <strong>de</strong>ls objectius. Volem remarcar que la màquina<br />

empreada és <strong>de</strong> gama baixa, però tot i així els resultats son satisfactoris. Si tenint en<br />

compte que la programació no ha estat <strong>de</strong>l tot eficient, po<strong>de</strong>m concluir que la velocitat<br />

<strong>de</strong>l càlcul <strong>de</strong> les Obscurances en temps real és excelent.<br />

3.5 Treballs futurs<br />

• Adaptar les Obscurances en temps real a les noves versions <strong>de</strong>l Crystal<br />

Space (actualment 0.98r003).<br />

92


Projecte<br />

• Adaptar la implementació al sistema <strong>de</strong> plugins, per tal d’in<strong>de</strong>penditzar al<br />

màxim les obscurances <strong>de</strong>l <strong>motor</strong> i po<strong>de</strong>r carregar-les/<strong>de</strong>scarregar-les en<br />

temps d’execució.<br />

• Millorar l’eficiència i permetre escenes/objectes més complexes.<br />

• Permetre més objectes en moviment.<br />

93


Annexes<br />

Annex 1: Història <strong>de</strong>ls Vi<strong>de</strong>ojocs/consoles<br />

Annexes<br />

La història <strong>de</strong>l vi<strong>de</strong>ojocs està molt lligada al sorgiment <strong>de</strong> la ciència <strong>de</strong>ls gràfics per<br />

computador.<br />

Anem a fer un petit d’historia sobre els vi<strong>de</strong>ojocs:<br />

Els principis<br />

1958 – Bill Nighinbottham creà (menys d’una setmana) el vi<strong>de</strong>ojoc tennis for two per a<br />

una fira cientìfica, però no el va registrar per que pensava que no el portaria enlloc.<br />

1972 – Nolan Bushnell fundà la companyia Atari publicant el joc <strong>de</strong> Bill Nighinbottham<br />

però sota el nom <strong>de</strong> pong.<br />

El primer vi<strong>de</strong>ojoc creat va se per Nolan Bushenll abans <strong>de</strong> crear Atari. S’anomenava<br />

Computer Space.<br />

1975 – Apareix el primer joc en color Indi 800 que permetia jugar fins a 8 jugadors<br />

simultaneament. Creat per Atari.<br />

1976 – Steve Jobs i Steve Wozniak, <strong>de</strong>senvolupen en Atari en joc Breakout. En 1978 els<br />

dos Steve van fundar Apple Computer.<br />

Però po<strong>de</strong>m retornar molt més endarrera d’aquesta època, l’any 1889.<br />

1889 – Un empresa japonesa fabricava cartes per el joc japonès Hanafunda (cartes fetes<br />

a ma molt <strong>de</strong>talla<strong>de</strong>s). Aquesta empresa era Nintendo fundada per Fusajiro Yamauchi.


Annexes<br />

1929 - Les cartes ja es distribueixen en terres americanes. Aviat van firmar acords amb<br />

Disney i altres companyies per po<strong>de</strong>r afegir nous dissenys.<br />

1975 – Nintendo s’associa amb Mitsubisi i comencen a crear vi<strong>de</strong>ojocs.<br />

1978 – Primers consoles <strong>de</strong> vi<strong>de</strong>ojocs anomena<strong>de</strong>s TV Game 15 i TV game 16 amb jocs<br />

típics <strong>de</strong> tennis, cotxes, etc.<br />

1980 – Es distribueixen les Game y Watch que eren les primeres consoles portàtils <strong>de</strong>l<br />

mon, precursores <strong>de</strong> Game Boy.<br />

Shigeru Miyamoto en Nintendo crea el clàssic Donkey konk. On apareix la<br />

mascota <strong>de</strong> Nintendo Mario.<br />

Evolució <strong>de</strong> les vi<strong>de</strong>oconsoles (1972-2001)<br />

1972 – La primera vi<strong>de</strong>oconsola <strong>de</strong> caràcter comercial veu la llum. El nom era<br />

Magnavox Odyssey i tenia 8 bits.<br />

1975 – Atari crea la seva consola Atari Pong, només era possible jugar al pong. Va tenir<br />

molt d’impacte cultural i va donar origen al impuls <strong>de</strong>ls vi<strong>de</strong>ojocs.<br />

1977 – Atari llança una nova consola: Atari 2600. Els jocs eren intercanviables i tenia<br />

un ampli catàleg.<br />

95


Annexes<br />

Al poc temps <strong>de</strong> sortir la consola va treure una nova versió la junior, que va permetre<br />

que la consola estigués en el mercat fins als anys 90. Per tant és la consola que més<br />

temps a estat en el mercat.<br />

1978 - Surt al mercat Magnavox-Odyssey2, però no va arribar a la popularitat <strong>de</strong> l’Atari<br />

2600. Era la primera en incorporar un teclat.<br />

1980 – Surt al mercat la consola Mattel Intellvision amb un <strong>motor</strong> gràfic <strong>de</strong> 16 bits, però<br />

al igual que els altres competidors <strong>de</strong> l’Atari no va tenir gaire èxit tot i tenir millors<br />

capacitats gràfiques. Fou la primera consola que va substituir els joysticks per mandos<br />

amb botons.<br />

1983 – La consola Nintendo Entertainment System, llançada al Japó en 1983 com la<br />

Famicom (Computadora familiar), marcà la segona era <strong>de</strong>ls vi<strong>de</strong>ojocs i el començament<br />

<strong>de</strong> la hegemonia <strong>de</strong> Nintendo en aquest mercat. La NES era un sistema <strong>de</strong> 8 bits amb 52<br />

colors i solament 2K <strong>de</strong> RAM. Fou un éxit total i es convertí en el sistema <strong>de</strong> vi<strong>de</strong>ojocs<br />

més venut <strong>de</strong>s <strong>de</strong> la Atari 2600. El jocs Súper Mario Bros. 3, llançat en 1988, va vendre<br />

més <strong>de</strong> set millons <strong>de</strong> copies. La popularitat <strong>de</strong> la NES convertí a Nintendo en la<br />

companyia japonesa més exitosa per 1990.<br />

96


Annexes<br />

1989 - La Turbografx-16 fou llançada en Japó en 1988. Tenia una CPU <strong>de</strong> 8 bits camb<br />

un chip per gràfics <strong>de</strong> 16 bits. Fou el primer sistema amb lector <strong>de</strong> CD incorporat. Però<br />

va sucumbir davant la Sega Genesis, <strong>de</strong>gut en part a la seva menor quantitat <strong>de</strong> jocs i a a<br />

la seva CPU menys potent.<br />

1991 – L’entrada <strong>de</strong> Nintendo en el mon <strong>de</strong>ls 16 bits va arribà <strong>de</strong> la mà <strong>de</strong>l jocs “Súper<br />

Mario World”. En un principi la seva popularitat fou inferior a la <strong>de</strong> la Sega Genesis,<br />

però va aconseguir remuntar el vol i va representar una forta competència amb el mo<strong>de</strong>l<br />

rival en una competència molt tancada. La Súper NES i Sega van compartir el li<strong>de</strong>rtage<br />

en el mercat <strong>de</strong>ls vi<strong>de</strong>jocs durant els cinc anys següents, fins l’arrivada <strong>de</strong>ls jocs <strong>de</strong> 32<br />

bits. Aquesta època <strong>de</strong> competència va tenir l’efecte d’augmentar la selecció <strong>de</strong> jocs<br />

disponibles, inclús amb productes <strong>de</strong> terces parts.<br />

1995 – Fou introduïda en el mercat en la primavera (boreal) <strong>de</strong> 1995 la consola Sega<br />

Saturn. Era un sistema <strong>de</strong> 32 bits amb molta més memòria RAM i un lector <strong>de</strong> CD.<br />

Amb els seus gràfics tridimensionals i so digital, la Saturn va tenir una gran arrancada i<br />

va arribar a vendre 100,000 unitats en els seus tres primers dies, segons Sega. Amb el<br />

temps no va tenir la <strong>de</strong>manda esperada i la PlayStation <strong>de</strong> Sony la va <strong>de</strong>sbancar un any<br />

més tard en Estats units.<br />

1995 – La PlayStation <strong>de</strong> Sony va començar la seva vida com un lector <strong>de</strong> CD que<br />

s’incorporava a la Súper NES. Nintendo i Sony no van conseguir posar-se d’acord sobre<br />

la comercialització <strong>de</strong>l nou aparell, per el que aquesta última <strong>de</strong>cidí <strong>de</strong>senvolupar més el<br />

seu producte fins convertir-lo en una consola. La PlayStation sorgí al mercat<br />

97


Annexes<br />

estadouni<strong>de</strong>ns en setembre <strong>de</strong> 1995, inaugurant l’era <strong>de</strong>ls 32 bits en aquesta àrea. Cap al<br />

maig <strong>de</strong>l 2000 un <strong>de</strong> cada quatre cases en Estats Units tenia una PlayStation.<br />

1996 - Nintendo va passar l’era <strong>de</strong>ls 32 bits, fent front a les amenaces <strong>de</strong> les consoles <strong>de</strong><br />

Sega i Sony mentre treballava en un aparell <strong>de</strong> nova generació. La N64, llençada en<br />

Estats Units en 1996, trasllada els èxits <strong>de</strong> la companyia a los 64 bits, enfatizant la<br />

sensació d’una tercera dimensió. La targeta gràfica <strong>de</strong> la N64 fou produïda per Silicon<br />

Graphics, la companyia <strong>de</strong> computadors que portar a les pantalles èxits cinematogràfics<br />

com “Jurassic Park”.<br />

1999 - La Dreamcast fou la primera consola <strong>de</strong> vi<strong>de</strong>ojocs amb arquitectura <strong>de</strong> 128 bits.<br />

Tenia un hardware que solament podia trobar-se en una po<strong>de</strong>rosa computadora personal.<br />

Disposava d’un processador a 200 MGhz, un chip <strong>de</strong> so <strong>de</strong> 64 canals i 26 MB <strong>de</strong><br />

RAM... i tot per jugar. Tot aquesta potència <strong>de</strong> hardware va <strong>de</strong>sembocar en gràfics més<br />

ràpids, més <strong>de</strong>tallats i amb major qualitat. També incorporava un mo<strong>de</strong>m <strong>de</strong> 56K per<br />

aprofitar la creixen popularitat <strong>de</strong>ls jocs en xarxa.<br />

2000 – Sony va llançar la consola PlayStation 2 amb un <strong>motor</strong> <strong>de</strong> 128 bits a 300 MGhz,<br />

lector <strong>de</strong> DVD, so Dolby surrond (AC-3) i memòria <strong>de</strong> 32 MB <strong>de</strong> RAM, un xip <strong>de</strong> so <strong>de</strong><br />

48 canals. Disponia també d’una expansió per afegir un disc dur i un adaptador <strong>de</strong> xarxa<br />

per accedir a internet. Té una arquitectura amb quatre processadors (Emotion engine<br />

que seria la CPU, graphic syntetizer que seria la GPU, sound processor, i/o processor),<br />

va ser quan es comença a parlar entre el paral·lelisme entre GPU i CPU.<br />

98


Annexes<br />

2001 – Microsoft treu al mercat la consola XBOX la primera consola amb una potència<br />

igual a un potent ordinador. Les seves característiques eren un processador a 700 MHz,<br />

amb 64 MB <strong>de</strong> RAM, port ethernet, disc dur <strong>de</strong> 8 GB, targeta gràfica <strong>de</strong> Nvidia ,suport<br />

per conectar 4 comandaments, 256 canals <strong>de</strong> so. Té tres processadors (CPU, la GPU <strong>de</strong><br />

nvidia, processador <strong>de</strong> so.)<br />

2001 – Nintendo produeix la Gamecube una altra consola <strong>de</strong> 128 bits. Amb un<br />

processador <strong>de</strong> 405 MGhz, 24 MB <strong>de</strong> ram, incorpora un nou format <strong>de</strong> Cd el mini-dvd<br />

per tal d’evitar la pirateria. Té tres processadors (CPU, la GPU “Gekko”, processador <strong>de</strong><br />

so.).<br />

Actualment estan en <strong>de</strong>senvolupament la Playstation 3, la Game Cube 2 i la Xbox 2,<br />

que aportaran una extraordinària potència gràfica als jocs, aportant experiències mai<br />

vistes.<br />

La dècada <strong>de</strong>ls clàssics (1978-1988)<br />

1978 – Sorgeix el vi<strong>de</strong>ojocs Space Inva<strong>de</strong>rs creat per Taito que permetia guardar la<br />

puntuació més alta.<br />

99


Annexes<br />

1979 – Atari creà Asteroids, va suposar una revolució ja que va donar forma a un nou<br />

entreteniment. Va aparèixer en la revista Newsweek.<br />

1980 – Namco realitza el joc Pacman, el joc més original <strong>de</strong>ls que havia sortit fins al<br />

moment.<br />

1981 – Aparaix Donkey kong per Atari, i <strong>de</strong> la ma <strong>de</strong> Namco: Miss Pacman (pacman 2)<br />

i Galaga.<br />

1982 – Els jocs que van sorgir foren: Super pacman, Moon Patrol, Donkey kong jr, Star<br />

Trek, Q’Bert, etc.<br />

1983 – Es el primer cop que s’utilitza un argument <strong>de</strong> pel·lícula en un vi<strong>de</strong>ojoc<br />

anomenat Tron. El van seguir els jocs <strong>de</strong> Star wars per atari, Dragon’s Lair (el primer<br />

en utilitzar la tecnologia Laser Disc).<br />

Nintendo creà Mario Bros, que era el primer cop que el protagonista <strong>de</strong> Donkey<br />

kong tenia el seu vi<strong>de</strong>ojoc. Aquest va tenir molt d’èxit per el que va passar a ser la<br />

mascota <strong>de</strong> Nintendo.<br />

Nintendo també creà primera consola in<strong>de</strong>pen<strong>de</strong>nt (abans ho feia amb empreses<br />

associa<strong>de</strong>s). La consola fou anomenada Nintendo.<br />

1984 – Apareix l’empresa Capsule Company (Capcom). Els jocs que apareixen aquest<br />

any son: Star Force, Pac-Land (on pacman <strong>de</strong>buta en jocs <strong>de</strong> plataformes), Kung fu<br />

Master, Paperboy, etc.<br />

1985 – Yamauchi (directori <strong>de</strong> Nintendo) encarrega a Miyamoto el joc Super Mario<br />

Bros que era el primer vi<strong>de</strong>ojoc llarg, ple <strong>de</strong> colors que va trencar esquemes.<br />

Al arribar la consola <strong>de</strong> Nintendo a Espanya va ser la consola que va <strong>de</strong>sbancar<br />

la consola Atari 2600. Els jocs més importants <strong>de</strong> la època foren: Pitfall 2, Indiana Josen<br />

and the Temple of Doom, Empire Strikes Back, Ghosts’N’Goblins.<br />

1986 – Surten els jocs com Outrun, Won<strong>de</strong>rboy, Arkanoid, Bubble Booble, Rygar)<br />

100


Annexes<br />

1987 – Destaquen tres companyies: Sega, Capcom i Taito amb jocs com: After Burner,<br />

Alien Syndrome, Shinobi, Heavyweight Champ y Won<strong>de</strong>r Boy In Monster Land. Però<br />

el joc amb més exit va ser Stree Fighter.<br />

1988 – Els jocs més importants <strong>de</strong>l perío<strong>de</strong> son la segona part <strong>de</strong>l Ghost and Ghost<br />

(Ghost and Goblins), Ninja gai<strong>de</strong>n. I el mític Tetris <strong>de</strong>l que a dia d’avui encara es fan<br />

diferents versions en 3D.<br />

101


Annex 2: Generes <strong>de</strong> vi<strong>de</strong>ojocs<br />

Aventures<br />

Annexes<br />

Els jocs d’aquest tipus son jocs basats en una història on habitualment s’han <strong>de</strong> resoldre<br />

diferents tipus <strong>de</strong> puzzles. Po<strong>de</strong>n ser basa<strong>de</strong>s en texte (com les primeres aventures <strong>de</strong><br />

Zork i PlanetFall) o gràfiques (la sèrie <strong>de</strong> King Quest, Grabiel Knight o Monkey Island)<br />

i és basen en seleccionar una acció i objecte <strong>de</strong> l’acció, es a dir, l’usuari selecciona una<br />

acció i <strong>de</strong>sprés l’objecte <strong>de</strong> l’acció. No solen ser jocs en temps real, és a dir mentre<br />

l’usuari fa una acció en el mon virtual no succeeix res.<br />

Acció<br />

King quest Monkey Island<br />

Son jocs en temps real en els que el jugador ha <strong>de</strong> reaccionar molt ràpidament al que<br />

passa en el mon virtual. Els jocs d’aquesta categoria el solen dominar jocs en primera<br />

persona, anomenats shooters (FPS: first person shooters), com el Quake i Unreal .<br />

També en aquesta categoria tenen cabuda jocs en tercera persona com per exemple<br />

Tomb Rai<strong>de</strong>r que son una mescla entre joc d’aventures i joc d’acció. Els enemigs <strong>de</strong>l<br />

jugador po<strong>de</strong>n ser o bé personatges controlats per Intel·ligència Artificial o altres<br />

jugadors a través <strong>de</strong> la xarxa.<br />

RPGs (Role-playing games)<br />

Unreal Tournament Quake 3<br />

En els jocs <strong>de</strong> rol el jugador dirigeix un grup <strong>de</strong> personatges en una sèrie d’aventures. El<br />

joc consisteix en gradualment incrementar les habilitats i força <strong>de</strong>ls personatges. Jocs<br />

d’aquest gènere son l’Ultima, Might and Magic, Final Fantasy i Baldur’s Gate. Aquest<br />

gènere sol tenir complexes sistemes <strong>de</strong> màgia i diferents races <strong>de</strong> personatges, a més<br />

d’una trama molt elavorada.<br />

102


Estratègia<br />

Baldur’s Gate Final Fantasy VIII<br />

Annexes<br />

Els jocs d’estratègia consisteixen en gestionar un conjunt limitat <strong>de</strong> recursos per tal<br />

d’obtenir èxits en les missions. El conjunt <strong>de</strong> recursos habitualment consisteix en<br />

<strong>de</strong>cidir quins tipus d’unitats s’han <strong>de</strong> crear i quan s’han <strong>de</strong> crear. D’aquest tipus <strong>de</strong> jocs<br />

n’hi ha <strong>de</strong> dos tipus, basats en torns i <strong>de</strong> temps real. Els primers consisteix en que el<br />

jugador <strong>de</strong>ci<strong>de</strong>ix quina és l’acció que realitzarà, i quan aquest acaba, li toca el torn al<br />

següent jugador/ordinador. En el segon cas, els jugadors/ordinadors po<strong>de</strong>n fer les<br />

accions encara que un jugador no estigui preparat. Els jocs d’estratègia <strong>de</strong> temps real<br />

substitueixen els oponents humans per la intel·ligència artificial. Jocs d’aquest tipus son<br />

Command & conquer, Age of empires, Praetorians i Cossacks.<br />

Simulació<br />

Comand & conquer Praetorians<br />

Emulen les condicions <strong>de</strong>l mon real i la maquinaria complexe, és el cas <strong>de</strong>ls simuladors<br />

<strong>de</strong> vols, en els que el jugador abans <strong>de</strong> començar han d’estudiar el manual<br />

d’instruccions per saber com funciona l’avió, tank, tren, etc. Po<strong>de</strong>m trobar en aquest<br />

gènere jocs <strong>de</strong>l tipus Flight Simulator.<br />

Flight Simulator 2002<br />

103


Esports<br />

Annexes<br />

Son jocs que fan participar al jugador en un esport concret, com po<strong>de</strong>n ser el futbol,<br />

bàsquet, golf, tennis, etc. Reprodueixen les regles i estratègies <strong>de</strong> l’esport d’una manera<br />

acurada. Sovint, sobretot en els jocs <strong>de</strong> futbol hi ha diferents rols: Entrenador d’un<br />

equip (ha <strong>de</strong> gestionar l’alineació, contractar nous jugadors, etc) o jugador d’un equip<br />

(simplement juga els partits). Uns exemples clàssics son les sèries Fifa o Nba Live.<br />

Lluita<br />

Fifa 2004 Nba Live 2003<br />

Els jocs <strong>de</strong> lluita son jocs <strong>de</strong> dos jugadors en els que el jugador controla un personatge<br />

en la pantalla i utilitza combinacions <strong>de</strong> moviments per atacar al oponet i <strong>de</strong>fensar-se<br />

<strong>de</strong>ls seus atacs. Generalment es veuen <strong>de</strong>s <strong>de</strong> la vista d’alçat (<strong>de</strong>l costat), tot i que cada<br />

cop més s’han introduït jocs en 3D. Els jocs que trobem en aquest gènere son el<br />

Soulcalibur 2, Street fighter<br />

Jugar a ser Deu<br />

SoulCalibur 2 Street Fighter Alpha 3<br />

Son jocs en els que l’usuari representa el <strong>de</strong>u <strong>de</strong>l univers <strong>de</strong>l joc i en el que pot crear<br />

objectes, moure muntanyes, etc. Son jocs d’aquest estil per exemple RollerCoaster<br />

Tycoon, Black’n’white, etc.<br />

Black’n’white Roller Coaster Tycoon<br />

104


Jocs online<br />

Annexes<br />

Po<strong>de</strong>m incloure en aquesta categoria els altres gèneres que disposin <strong>de</strong> la possibilitat <strong>de</strong><br />

multijugador a través <strong>de</strong> la xarxa. Al voltant d’aquest gènere neixen grans comunitats <strong>de</strong><br />

jugadors com és el cas <strong>de</strong>ls jocs Ultima Online o Everquest.<br />

Educatius<br />

Ultima Online<br />

Son pensats per a que el jugador aprengui mentre s’entretén. Son jocs pensats per a nens<br />

petits per tal <strong>de</strong> que aprenguin. El disseny d’aquests jocs necessita <strong>de</strong> gent experta en el<br />

camp educatiu per tal <strong>de</strong> saber si els continguts son apropiats per als nens.<br />

Puzzles<br />

Aquest tipus <strong>de</strong> gènere està pensat per a que els jugadors resolguin problemes utilitzant<br />

la intel·ligència. Trobem jocs com The Increible Machine i The <strong>Cas</strong>tle of Dr. Brain.<br />

Jocs <strong>de</strong> casualitat<br />

S’inclouen en aquest gènere els jocs que son adaptacions <strong>de</strong> jocs tradicionals com els<br />

escacs, el solitari, etc. També s’inclouen jocs a través <strong>de</strong> web <strong>de</strong>l tipus Poker,<br />

Concentracio, o bé adaptacions <strong>de</strong> programes <strong>de</strong> televisió <strong>de</strong> l’estil <strong>de</strong> la roda <strong>de</strong> la<br />

fortuna o Qui vol ser milionari ?. En general son jocs molt fàcils <strong>de</strong> jugar on les parti<strong>de</strong>s<br />

duren poc.<br />

105


Annex 3: Mercat <strong>de</strong>ls vi<strong>de</strong>ojocs<br />

Annexes<br />

Actualment el mercat <strong>de</strong>ls vi<strong>de</strong>ojocs és una indústria que mou molts diners <strong>de</strong>gut al seu<br />

gran grau d’innovació i creativitat tecnològica. Però per què tenen tant d’èxit els<br />

vi<strong>de</strong>ojocs ?. la resposta està clara: les persones necessitem divertir-se, passar el temps<br />

lliure, fugir <strong>de</strong> la realitat, conèixer gent, per el que busquen la sortida en els vi<strong>de</strong>ojocs<br />

que aporten una manera ràpida <strong>de</strong> fer-ho.<br />

A continuació mostrem una gràfica <strong>de</strong>l creixem <strong>de</strong>ls vi<strong>de</strong>ojocs.<br />

%<br />

80<br />

70<br />

60<br />

50<br />

40<br />

30<br />

20<br />

10<br />

0<br />

A continuació mostrem una taula (Regne unit) <strong>de</strong>l nombre <strong>de</strong> pc, i consoles.<br />

Platform<br />

PC<br />

% Households with children who have<br />

vi<strong>de</strong>o games/PCs/online access<br />

1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000<br />

Sony PS2<br />

Nintendo Gamecube<br />

Microsoft Xbox<br />

2002<br />

11,000,000<br />

2,415,000<br />

139,000<br />

157,500<br />

2003<br />

12,870,000<br />

3,067,050<br />

176,530<br />

200,025<br />

2004<br />

15,057,900<br />

3,895,154<br />

224,193<br />

254,031<br />

Vi<strong>de</strong>o Games<br />

PC<br />

Online Access<br />

106


Annex 4: Format d’escenes <strong>de</strong> CS<br />

Annexes<br />

El format estàndard comprensible directament per Crystal Space 0.95 és un format<br />

ASCII pur, dividit en diferents bloc:<br />

• Bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong>l mon o escena.<br />

• Bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> textures.<br />

• Bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> materials.<br />

• Bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> malles.<br />

• Bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> sectors.<br />

• Bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> sector inicial.<br />

Amb aquests blocs en fem prou per a <strong>de</strong>finir la nostra escena. Passem a explicar d’una<br />

manera <strong>de</strong>tallada els components que formen cada part.<br />

Definició textures<br />

La primer part dins el fitxer és el bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> textures, que relaciona una nom<br />

lògic amb el fitxer físic que conté la imatge. Aquest fitxer d’imatge o bé ha d’estar dins<br />

el fitxer comprimit en format ZIP <strong>de</strong>l nostre projecte o dins el fitxer <strong>de</strong> textures <strong>de</strong><br />

Crystal Space, per a més informació consultar l’annex sobre Crystal Space i el manual<br />

d’usuari.<br />

Les textures s’apliquen als diferents objectes dins els sectors, com és comenta en el bloc<br />

<strong>de</strong> <strong>de</strong>finició <strong>de</strong> sectors.<br />

Un exemple <strong>de</strong> codificació seria:<br />

TEXTURES (<br />

TEXTURE 'andrew_wood' (FILE (/lib/stdtex/andrew_wood.jpg))<br />

)<br />

On la part <strong>de</strong>finida per FILE i<strong>de</strong>ntifica el nom <strong>de</strong>l fitxer dins el fitxer comprimit en ZIP<br />

en el primer cas, i en el segon especifica que la imatge és trobar en el fitxer <strong>de</strong> textures<br />

<strong>de</strong> CS. Es a dir dins el fitxer comprimit haurem <strong>de</strong> tenir també les textures, o bé afegirles<br />

al fitxer <strong>de</strong> textures <strong>de</strong> Crystal Space.<br />

Definició materials<br />

La <strong>de</strong>finició <strong>de</strong>ls materials és una manera <strong>de</strong> po<strong>de</strong>r renombrar els noms <strong>de</strong> les textures.<br />

La sintaxis és la següent:<br />

MATERIALS (<br />

107


)<br />

MATERIAL 'wood' (TEXTURE ('andrew_wood'))<br />

…<br />

Definició Malles<br />

Annexes<br />

En la part <strong>de</strong> <strong>de</strong>finició <strong>de</strong> malles simplement s’especifica els objectes, en aquest cas per<br />

exemple és crea una caixa (una pota d’una taula) amb la textura <strong>de</strong> fusta<br />

(“andrew_wood”).<br />

MESHFACT 'tableP' (<br />

PLUGIN ('thingFact')<br />

PARAMS (<br />

VERTEX (-.05,.85,.05) VERTEX (.05,.85,.05)<br />

VERTEX (-.05,.85,-.05) VERTEX (.05,.85,-.05)<br />

VERTEX (-.05,0,.05) VERTEX (.05,0,.05)<br />

VERTEX (-.05,0,-.05) VERTEX (.05,0,-.05)<br />

)<br />

)<br />

MATERIAL ('andrew_wood') TEXLEN (1)<br />

POLYGON 'n' (VERTICES (1,0,4,5))<br />

POLYGON 'e' (VERTICES (3,1,5,7))<br />

POLYGON 's' (VERTICES (2,3,7,6))<br />

POLYGON 'w' (VERTICES (0,2,6,4))<br />

D’aquesta manera po<strong>de</strong>m <strong>de</strong>finir una malla i afegir-la a posteriori en un sector tans cops<br />

com ens interessi <strong>de</strong> la següent manera:<br />

MESHOBJ 'tableP1' (<br />

PLUGIN ('thing')<br />

PARAMS (FACTORY ('tableP'))<br />

HARDMOVE (V (-2.4,-1,2.9))<br />

)<br />

on hardmove ens <strong>de</strong>termina la nova posició <strong>de</strong> l’objecte.<br />

També és possible <strong>de</strong>finir una malla directament en dins un sector, tal i com veurem a<br />

continuació.<br />

Definició sectors<br />

La segona part, i la / les part / parts més important / importants dins el fitxer és el bloc<br />

on s’especifica cada un <strong>de</strong>ls sectors que formen part <strong>de</strong> l’escena. Ve precedit <strong>de</strong>l terme<br />

SECTOR i el seu interior engloba tots els polígons, objectes, portals, textures, etc., que<br />

formen part <strong>de</strong>l sector. El seu ús és pot apreciar en l’exemple:<br />

SECTOR 'nom_sector1’<br />

(<br />

;especifiquem un cub que serà possible moure’l<br />

108


)<br />

MESHOBJ 'cubterra'<br />

(<br />

PLUGIN ('thing')<br />

PARAMS (<br />

MOVEABLE (TRUE) ; aquest cub podrà<br />

; estar en moviment<br />

)<br />

VERTEX (-.5,-.5,.5) VERTEX (.5,-.5,.5)<br />

VERTEX (-.5,-.5,-.5) VERTEX (.5,-.5,-.5)<br />

VERTEX (-.5,.5,.5) VERTEX (.5,.5,.5)<br />

VERTEX (-.5,.5,-.5) VERTEX (.5,.5,-.5)<br />

MATERIAL ('red') TEXLEN (1)<br />

POLYGON 'up' ( VERTICES (4,5,7,6) )<br />

POLYGON 'down' ( VERTICES (2,3,1,0) )<br />

POLYGON 'front' ( VERTICES (6,7,3,2) )<br />

POLYGON 'back' ( VERTICES (5,4,0,1) )<br />

POLYGON 'left' ( VERTICES (4,6,2,0) )<br />

POLYGON 'right' ( VERTICES (7,5,1,3) )<br />

)<br />

HARDMOVE (V (0.9,0,-3)); posició on estarà el cub<br />

Annexes<br />

Dins d’aquests blocs s’especifiquen les malles <strong>de</strong> vèrtexs i polígons que en formen part,<br />

així com els polígons que representen portals que comuniquen amb altres sectors,<br />

textures que s’apliquen a cada polígon, les llums, etc.<br />

Definició inicial <strong>de</strong> l’escena<br />

Aquest mon engloba tots els blocs anteriors, ja que <strong>de</strong>termina tota l’escena, i és<br />

necessària per a que el Motor Gràfic i<strong>de</strong>ntifiqui correctament tots els sectors que en<br />

formen part.<br />

La seva <strong>de</strong>finició en format CS és:<br />

WORLD(<br />

)<br />

Exemple <strong>de</strong> fitxer en format CS<br />

WORLD( Definim l’inici <strong>de</strong> l’escena.<br />

TEXTURES ( Definim l’inici <strong>de</strong>l bloc <strong>de</strong> <strong>de</strong>finció <strong>de</strong> textures<br />

Textura <strong>de</strong> les parets, terra i sostre.<br />

TEXTURE 'paret.gif' (FILE(/lib/stdtex/floors_1_d1n__128.jpg))<br />

...<br />

) Fi <strong>de</strong>l bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong> textures<br />

MATERIALS ( Definim l’inici <strong>de</strong>l bloc <strong>de</strong> <strong>de</strong>finció <strong>de</strong> materials<br />

MATERIAL 'marble_08_ao___128' (TEXTURE (paret.gif')<br />

109


)<br />

MESHFACT 'tableP' ( Definim un bloc que serà una malla<br />

PLUGIN ('thingFact')<br />

PARAMS (<br />

VERTEX (-.05,.85,.05) VERTEX (.05,.85,.05)<br />

VERTEX (-.05,.85,-.05) VERTEX (.05,.85,-.05)<br />

VERTEX (-.05,0,.05) VERTEX (.05,0,.05)<br />

VERTEX (-.05,0,-.05) VERTEX (.05,0,-.05)<br />

)<br />

)<br />

MATERIAL ('andrew_wood') TEXLEN (1)<br />

POLYGON 'n' (VERTICES (1,0,4,5))<br />

POLYGON 'e' (VERTICES (3,1,5,7))<br />

POLYGON 's' (VERTICES (2,3,7,6))<br />

POLYGON 'w' (VERTICES (0,2,6,4))<br />

Annexes<br />

Definició <strong>de</strong>l sector inicial, la camera començarà al sector 19 a la posició X, Y i Z.<br />

START (sector19, -7.6, 3.8, 0.0)<br />

Inici <strong>de</strong>l bloc <strong>de</strong> <strong>de</strong>finició <strong>de</strong>ls sectors que formen l’escena.<br />

SECTOR 'sector19' Definició d’un sector<br />

(<br />

MESHOBJ 'cubterra' Definició d’una malla dins el sector<br />

(<br />

PLUGIN ('thing')<br />

PARAMS (<br />

MOVEABLE (TRUE) ; aquest cub podrà<br />

; estar en moviment<br />

)<br />

)<br />

)<br />

VERTEX (-.5,-.5,.5) VERTEX (.5,-.5,.5)<br />

VERTEX (-.5,-.5,-.5) VERTEX (.5,-.5,-.5)<br />

VERTEX (-.5,.5,.5) VERTEX (.5,.5,.5)<br />

VERTEX (-.5,.5,-.5) VERTEX (.5,.5,-.5)<br />

MATERIAL ('red') TEXLEN (1)<br />

POLYGON 'up' ( VERTICES (4,5,7,6) )<br />

POLYGON 'down' ( VERTICES (2,3,1,0) )<br />

POLYGON 'front' ( VERTICES (6,7,3,2) )<br />

POLYGON 'back' ( VERTICES (5,4,0,1) )<br />

POLYGON 'left' ( VERTICES (4,6,2,0) )<br />

POLYGON 'right' ( VERTICES (7,5,1,3) )<br />

)<br />

HARDMOVE (V (0.9,0,-3)); posició on estarà el cub<br />

MESHOBJ 'tableP1' ( Definició d’una malla que serà copia <strong>de</strong> la que hem<br />

<strong>de</strong>finit previament.<br />

PLUGIN ('thing')<br />

PARAMS (FACTORY ('tableP'))<br />

HARDMOVE (V (-2.4,-1,2.9))<br />

)<br />

110


Annex 5: Classes funcions principals<br />

Annexes<br />

Cal dir que les especificacions <strong>de</strong> les funcions, amb les seves explicacions, estàn<br />

pensa<strong>de</strong>s per complimentar-se amb els comentaris adjunts amb el codi font <strong>de</strong>l<br />

programa.<br />

Segons hem vist en la memòria en la part d’implementació la relació entre classes és la<br />

següent:<br />

Per tal <strong>de</strong> implementar les llistes <strong>de</strong> patchs, voxels i polígons hem utilitzat les STL per<br />

tal <strong>de</strong> no haver d’implementar-les nosaltres, a més les STL son unes llibreries molt<br />

eficients i estables.<br />

Per tant a continuació anem a explicar cada una <strong>de</strong> les classes.<br />

Classe raig<br />

Ens representa un raig en 3D. Aquesta classe utilitza les classes csIntersect3D i<br />

csPolygon3D per tal <strong>de</strong> comprovar i calcules les interseccion.<br />

La <strong>de</strong>finició <strong>de</strong> la classe és la següent:<br />

111


class Ray<br />

{<br />

public:<br />

};<br />

Ray();<br />

~Ray();<br />

void Print();<br />

Annexes<br />

csVector3 start, end, dir; //the start/end and direction of the ray<br />

Patch *patch; //origin patch<br />

long int voxel_origin; //ray's origin voxel<br />

float distance2point; //distance from origin to intersect point<br />

bool IntersectRay (csPolygon3D *, csVector3 &point, float &dist);<br />

//return true if the ray intersect with the plane<br />

bool IntersectRayPlane (csPlane3, csVector3 &point, float &dist);<br />

//return true if the ray will intersect the polygon<br />

bool IntersectPolygon3D (csPolygon3D *);<br />

Les funcions més importants <strong>de</strong> la classe son:<br />

Bool IntersectRay (csPolygon3D *, csVector3 &point, float &dist);<br />

La seva tasca consisteix en passat un polígon <strong>de</strong>terminar si hi ha intersecció entre el raig<br />

i el polígon, si és el cas retornar true i en els paràmetres point i dist retornar el punt<br />

d’intersecció i la distància d’intersecció.<br />

Classe Patch<br />

Representa una petita part <strong>d'un</strong> polígon, per simplificar hem consi<strong>de</strong>rat que un Patch<br />

correspont a un Lumel (element <strong>de</strong>l Lightmap <strong>d'un</strong> polígon).<br />

class Patch<br />

{<br />

public:<br />

Patch();<br />

~Patch();<br />

unsigned int GetId() const { return id; }<br />

//set the id lumel relative to polygon's lightmap<br />

void SetIdLumel(unsigned int i);<br />

//return the id lumel of patch relative to polygon's lightmap<br />

unsigned int GetIdLumel () const { return idlumel;}<br />

//return the specified vector (one patch have 2 vertors)<br />

//set/get the coords of the lumel in x and y<br />

112


void SetCoord (unsigned int xx,unsigned int yy);<br />

void GetCoord (unsigned int &xx, unsigned int &yy);<br />

void SetObsPoly (ObsPoly *poly);<br />

ObsPoly * GetObsPoly() { return obspoly; }<br />

csVector3 *GetVertex (int ); //return the vertex i of patch<br />

void Print(); //print<br />

Annexes<br />

Ray *McrGenerateLocalLine(double *xi); //generate a random ray<br />

};<br />

Les funcions més importants son:<br />

Ray *McrGenerateLocalLine(double *xi);<br />

Retornar un raig aleatori generat en el patch que crida la funció.<br />

unsigned int GetIdLumel () const { return idlumel;}<br />

retornar el i<strong>de</strong>ntificador <strong>de</strong>l lumel dins el lightmap <strong>de</strong>l polígon al que pertany el match.<br />

Classe PatchList<br />

Llista dinàmica on guardarem els Patchs. Té les funcions per recórrer la llista <strong>de</strong> patchs.<br />

class PatchList<br />

{<br />

public:<br />

PatchList();<br />

PatchList(unsigned int);<br />

~PatchList();<br />

};<br />

//return the pointer to the list of patches<br />

std::vector * GetList() { return &list;}<br />

//return the path(i)<br />

Patch * GetPatch (int);<br />

bool InsertPatch (Patch *);<br />

int GetSize() { return list.size(); }<br />

Patch *GetNext(); //return the next patch in the list<br />

Classe ObsPoly<br />

113


Annexes<br />

Ens representa un polígon 3D <strong>de</strong> la escena, aquesta classe conté un objecte <strong>de</strong>l tipus<br />

csPolygon3D i csLightmap (per modificar el Lightmap amb les Obscurances) i la llista<br />

<strong>de</strong> patchs <strong>de</strong>l polígon PatchList.<br />

class ObsPoly<br />

{<br />

public:<br />

ObsPoly();<br />

ObsPoly(csPolygon3D *poly);<br />

~ObsPoly();<br />

ObsPoly(const ObsPoly&);<br />

unsigned int GetId() const { return id; }<br />

//return the id<br />

csPolygon3D * GetPolygon3D () const { return polygon; }<br />

//return the original polygon in engine<br />

csVector3 GetLumelOrigin() { return lumel_origin; }<br />

csVector3 GetLumelX() { return lumel_x_axis; }<br />

csVector3 GetLumelY() { return lumel_y_axis; }<br />

PatchList * GetPatchList() { return &patchlist; }<br />

//return the patchlist<br />

std::bit_vector * GetTreaty() { return &treaty; }<br />

//return the treaty list<br />

std::vector *GetRayList(): //return the ray list<br />

unsigned int GetRays (unsigned int i) const;<br />

bool SetRays(unsigned int lumel, unsigned int rays);<br />

bool GetTreaty (unsigned int i ) const; //get if the patch(i)<br />

//is treaty<br />

bool SetTreaty (unsigned int i, bool s = true); //set the patch<br />

//(i) treaty<br />

int GetSizePatchList(); //return the patch number<br />

bool SaveLightMap(); //save the lightmap into copy_lightmap<br />

bool RestoreObsLightMap(); //restore the original lightmap<br />

(copy_lightmap into<br />

//lightmap), and store the lightmap into<br />

copy_lightmap<br />

bool RestoreOriginLightMap();<br />

void Setup(); //Calcule the lumel_origen, lumel_x_axis and<br />

//lumel_y_axis from the obspoly and create all the<br />

//patches<br />

void ResetTreaty(); //reset/set the treaty vector<br />

void SetTreaty();<br />

void ResetRays(); //reset/set the raylist to 0 in all the patches<br />

Patch * GetNextPatch(); //return pointer to next patch<br />

void ResetIn<strong>de</strong>x(); //reset the in<strong>de</strong>x (previus to GetNextPatch()<br />

Patch * CalculateIntersectedPatch(csVector3 *); //return the<br />

//patch intersected in csVector3<br />

114


void Print();<br />

Annexes<br />

void CopyColor2Lumel(int lumel, const csColor & color); //set the<br />

//lumel with the color<br />

csColor GetObscuranceLumel (int lumel); //return the obscurance of<br />

//the lumel/patch<br />

};<br />

void TestPatchs(const csColor &); //set all the patchs in polygon<br />

//with one color, for testing<br />

//purpose only<br />

bool PointonPolygon(csVector3 *); //return true if vertex is in<br />

//polygon<br />

csColor GetFlatColor() ; // return the flat color value<br />

Les funcions principals son:<br />

void Setup();<br />

Calcula on comença l’origen <strong>de</strong>ls lumels I els increments respecte x i respecte y.<br />

Patch * CalculateIntersectedPatch(csVector3 *);<br />

Donat un punt d’intersecció dins el polígon retorna el patch interceptat .<br />

void CopyColor2Lumel(int lumel, const csColor & color);<br />

Donat un i<strong>de</strong>ntificador <strong>de</strong>l lumel/patch li assigna al Lightmap el color correspon<strong>de</strong>nt.<br />

Classe ObsPolyList<br />

Llista que contè objectes <strong>de</strong>l tipus ObsPoly, ens servirà per emmagatzemar els polígons<br />

<strong>de</strong> l'escena.<br />

class ObsPolyList<br />

{<br />

public:<br />

ObsPolyList();<br />

ObsPolyList(unsigned int); //set the maximum capacity of the vector<br />

~ObsPolyList();<br />

//return the pointer to the list of obspoly<br />

std::vector * GetList() { return &list; }<br />

int GetSizeObsPolyList() const { return list.size(); }<br />

//return the obspoly<br />

ObsPoly * GetObsPoly (int);<br />

115


insert te obspoly into the list<br />

bool InsertObsPoly (ObsPoly *);<br />

//return the next obspoly in the list<br />

ObsPoly * GetNext();<br />

};<br />

Classe Voxel<br />

Annexes<br />

Classe que representa una divisió <strong>de</strong> l'espai en forma <strong>de</strong> cub, dins d'aquest objecte tenim<br />

la llista <strong>de</strong> patchs que hi ha dins <strong>de</strong>l voxel (ObsPatchList) i la llista <strong>de</strong> polígons que hi<br />

ha dins el voxel (ObsPolyList).<br />

class Voxel: public csObject,csBox3<br />

{<br />

public:<br />

Voxel(csBox3 &box);<br />

Voxel();<br />

Voxel(const Voxel &);<br />

~Voxel();<br />

//the unique ID from CS<br />

CS_ID GetID() const { return csid; }<br />

//the real voxel's id from scene, for in<strong>de</strong>xing purpose<br />

unsigned long int GetIdVoxel() const { return idvoxel; }<br />

//return the number of polygons in the voxel<br />

int GetSizePolygonList() const { return list_id_obspoly.size(); }<br />

//return pointer to list_id_obspoly;<br />

std::vector * GetIdObsPolyList()<br />

{ return &list_id_obspoly; }<br />

//set the boundbox of the voxel<br />

void SetBoundBox(csBox3 *);<br />

void Print(); //print patch's data<br />

Patch * GetNextPatch(); //return the pointer to next patch in the<br />

//voxel<br />

long int GetNextObsPoly(); //return the id to next obspoly in the<br />

//voxel<br />

bool AddPatch (Patch *); //add one patch (only the id) to<br />

//list_id_patch<br />

bool AddObsPoly (ObsPoly *); //add one obspoly (only the if ) to<br />

//list_id_obspoly<br />

int RaysGoTo (Ray *); //return the face that the ray trought to<br />

};<br />

Destaquem les següents funcions:<br />

int RaysGoTo (Ray *);<br />

116


Annexes<br />

Donat un raig (<strong>de</strong>l que sabem el voxel origen <strong>de</strong>l raig) retorna la cara cap a la que va, els<br />

valors possibles son:<br />

#<strong>de</strong>fine VOXEL_FACE_LEFT 0<br />

#<strong>de</strong>fine VOXEL_FACE_RIGHT 1<br />

#<strong>de</strong>fine VOXEL_FACE_BEHIND 2<br />

#<strong>de</strong>fine VOXEL_FACE_FRONT 3<br />

#<strong>de</strong>fine VOXEL_FACE_UNDER 4<br />

#<strong>de</strong>fine VOXEL_FACE_OVER 5<br />

#<strong>de</strong>fine VOXEL_NO_FACE -1<br />

Classe VoxeList<br />

Llista <strong>de</strong> voxels <strong>de</strong> l'escena, contè cada uns <strong>de</strong>ls voxels en que es subdivi<strong>de</strong>ix l'escena.<br />

class VoxelList<br />

{<br />

public:<br />

VoxelList();<br />

VoxelList(csBox3 *);<br />

std::vector * GetList() { return &list;} //return the pointer<br />

//to the list of voxels<br />

bool SetBoundBox (csBox3 *); //set the boundbox<br />

csBox3 * GetBoundBox() { return &boundbox; } //return pointer<br />

//to boundbox of scene<br />

int GetSize() const { return list.size(); } //return the<br />

//number of elements of list<br />

Voxel * GetVoxel (unsigned int ); //return pointer to voxel(i)<br />

void Print() ; //print stats<br />

bool AddPatch2Voxel(Patch *); //add patch to voxels<br />

//this function also add the obspoly to voxels<br />

int CalculateVoxel(csVector3 *); //calculate the voxel that vertex<br />

//go into, called by AddPatch2Voxel<br />

int RaysGoTo(Ray *); //return the next voxel that rays go to<br />

};<br />

bool SetBoundBox (csBox3 *);<br />

Assigna a l’estructura <strong>de</strong> voxels la caixa englobant passada per paràmetre, d’aquesta<br />

manera dividirà l’espai en voxels.<br />

int CalculateVoxel(csVector3 *);<br />

117


Retorna el voxel on està un vèrtex <strong>de</strong>terminat.<br />

bool AddPatch2Voxel(Patch *);<br />

Donat un patch l’afegueix al voxel corresponent a partir <strong>de</strong> la funció anterior.<br />

int RaysGoTo(Ray *);<br />

Retornar donat un raig el voxel cap el que va.<br />

Classe Obscurance<br />

Annexes<br />

Aquesta és la classe principal <strong>de</strong> la jerarquia. Aquesta classe conté la llista <strong>de</strong> Voxels<br />

(VoxelList) i la llista <strong>de</strong> polígons <strong>de</strong> l'escena (ObsPolyList) i s’encarrega <strong>de</strong> calcular les<br />

Obscurances <strong>de</strong> l’escena, tant la inicial com la <strong>de</strong>ls objectes en moviment (obscurances<br />

en temps real).<br />

class csObscurance<br />

{<br />

bool LoadScene(); //load the scene into the ObsPolyList, and set<br />

//boundbox called by constructor csObscurance<br />

bool PrepareVoxels(); //create all the voxels from scene<br />

//called by DoObscurance<br />

bool CalculateObscurances(); //calculate the obscurances<br />

bool CalculateObs4Voxel( unsigned int i); //calculate the<br />

//obscurances for one voxel<br />

Patch * ShootRay (Ray *ray); //shoot one ray from one patch,<br />

//return the patch intersected (null if no)<br />

bool CalculateObs4Patch(Patch *); //calculate the obscurances for one<br />

//patch<br />

/// Does the whole obscurance thing. This is the one to call.<br />

void DoObscurance();<br />

void RecalculateObscuranceCube();<br />

//calculate one frame of the "animation"<br />

void Animate (csTicks elapsedTime);<br />

Destaquem les següents funcions:<br />

void LoadScene();<br />

Carrega l’escena dins les estructures internes <strong>de</strong> les obscurances preparant tots els<br />

polígons, lightmaps, patchs, etc.<br />

118


ool CalculateObscurances();<br />

Annexes<br />

Funció principal que s’encarrega <strong>de</strong> calcular totes les Obscurances <strong>de</strong> cada uns <strong>de</strong>ls<br />

voxels i patchs <strong>de</strong> l’escena.<br />

bool CalculateObs4Voxel( unsigned int i);<br />

Calcula les Obscurances per un voxel <strong>de</strong>terminat.<br />

Patch * ShootRay (Ray *ray);<br />

Retornar el patch interceptat per un raig, null si no intercepta cap.<br />

bool CalculateObs4Patch(Patch *);<br />

Calcula les Obscurances per un patch <strong>de</strong>terminat.<br />

void RecalculateObscuranceCube();<br />

Modifica les llistes <strong>de</strong>ls patchs i polígons dinàmics <strong>de</strong> l’escena a les noves posicions a<br />

la que es mouen els objectes dinàmics i recalcula les obscurances.<br />

void Animate (csTicks elapsedTime);<br />

Aquesta funció és crida a cada quadre <strong>de</strong> “l’animació” i és la responsable <strong>de</strong> el recalcul<br />

<strong>de</strong> les obscurances en temps real. Dins d’aquesta funció és calculen les noves posicions<br />

<strong>de</strong>ls objectes en moviment.<br />

Classe ObsCube<br />

Ens representa els cubs en moviment <strong>de</strong> l’escena, guarda les da<strong>de</strong>s d’un objecte en<br />

moviment, en el nostre cas els objectes en moviment tenen una ruta <strong>de</strong> moviment<br />

<strong>de</strong>terminat.<br />

class csObsCube<br />

{<br />

//Pointer to the Path that the cube along to<br />

csPath *Path;<br />

csObsCube();<br />

~csObsCube();<br />

void InitPath();<br />

void InitPath2();<br />

};<br />

void InitPath();<br />

119


Inicialitza els paràmetres <strong>de</strong>l moviment <strong>de</strong>l cub 1 quan es mogui.<br />

void InitPath2();<br />

Inicialitza els paràmetres <strong>de</strong>l moviment <strong>de</strong>l cub 2 quan es mogui.<br />

Classe csEngine<br />

Annexes<br />

És la classe mare <strong>de</strong>l CS, sempre s’executa la primera, aquesta classe controla la creació<br />

<strong>de</strong> les Obscurances, com veurem en el següent apartat.<br />

Veure la documentació <strong>de</strong>l Crystal Space.<br />

Classe Walktest<br />

Classe encarregada d’inicialitzar l’aplicació walktest, la seva funció està en controlar la<br />

activació/<strong>de</strong>sactivació <strong>de</strong> les Obscurances per l’usuari i a més <strong>de</strong> controlar que és<br />

realitzi el càlcul <strong>de</strong> les Obscurances en temps real a cada quadre <strong>de</strong> l’animació.<br />

Veure la documentació <strong>de</strong>l Crystal Space.<br />

120


Annex 5: Creció d’una aplicació en Crystal Space<br />

Per crear una aplicació en CS s’han <strong>de</strong> tenir en compte una sèrie <strong>de</strong> coses:<br />

La utilitat SCF (Shared class facility)<br />

Annexes<br />

Aquest sistema és el cor <strong>de</strong>l framework que controla la memòria <strong>de</strong> Crystal Space.<br />

L’hem d’inicialitzar abans que qualsevol altre subsistema <strong>de</strong>clarant en l’aplicació:<br />

csInitializer::InitializeSCF()<br />

Contador <strong>de</strong> referències<br />

És un sistema que controla les referències que es creen en CS d’un objecte. Quan un<br />

objecte és vol <strong>de</strong>struir es crida a la funció DecRef() i si no hi ha cap punter que tingui la<br />

seva referència, la memòria és alliberada.<br />

Registre d’objectes<br />

Aquest registre és el repositori central d’objectes d’aquest <strong>motor</strong>. Qualsevol element<br />

dins CS l’utilitzarà per obtenir punters als objectes que l’interessin en tot moment. Per<br />

tal <strong>de</strong> crear aquest registre s’ha <strong>de</strong> incloure en el codi la comanda<br />

csInitializer::CreateObjectRegistry() o bé csInitializer::CreateEnviorement().<br />

Gestor <strong>de</strong> Plugin<br />

Aquest sistema s’encarrega <strong>de</strong> carregar o <strong>de</strong>scarregar els plugins. Un plugin és una<br />

llibreria compartida que es carrega dinàmicament en temps d’execució. En entorns Unix<br />

tenen l’extensió “.so” mentre que en Windows tenen extensions “.dll”. Gairebé tot en<br />

Crystal Space és un plugin. Aquest sistema es crea a partir <strong>de</strong><br />

csInitializer::CreatePluginManager() o bé csInitializer::CreateEnviorement().<br />

Cua d’events<br />

CS és un framework orientat a events, per el que aquest sistema s’encarrega <strong>de</strong> controlar<br />

la cua <strong>de</strong> missatges i enviar cada missatge al receptor corresponent. Cada mòdul o<br />

plugin pot implementar la interfície iEventHandler i d’aquesta manera pot registrar-se<br />

en la cua d’events i així obtenir notificació <strong>de</strong> quan succeeix un <strong>de</strong>terminat event. La<br />

cua d’events es crea a partir <strong>de</strong> csInitializer::CreateEventQueue() o bé<br />

csInitializer::CreateEnvironment().<br />

Una aplicació que es <strong>de</strong>senvolupi en CS haurà <strong>de</strong> crear un subsistema que s’encarregi<br />

<strong>de</strong> gestionar els events per tal <strong>de</strong> po<strong>de</strong>r processar els events que sorgeixin, com po<strong>de</strong>n<br />

ser per exemple el ren<strong>de</strong>ritzat <strong>de</strong> la pantalla o bé guardar les pulsacions <strong>de</strong>l teclat o<br />

ratolí. Per tal <strong>de</strong> posar a punt el sistema que gestiona els events es crida a la funció<br />

csInitializer::SetupEventHandler()<br />

121


Commandline Parser<br />

Annexes<br />

És el responsable <strong>de</strong> comprovar les opcions que es passen per la línia <strong>de</strong> coman<strong>de</strong>s. Si<br />

s’han inicialitzat correctament els arguments “argc” i “argv” llavors es po<strong>de</strong>n consultar<br />

les opcions que hem passat per paràmetre. Molts plugins i mòduls <strong>de</strong> CS comproven els<br />

paràmetres així que és important iniciar aquest sistema correctament. Per crear-lo farem<br />

csInitializer::CreateCommandLineParser() o bé<br />

csInitializer::CreateEnviorement().<br />

Gestor <strong>de</strong> Configuracions<br />

S’encarrega <strong>de</strong> llegir les opcions <strong>de</strong>ls fitxers <strong>de</strong> configuració. Molts <strong>de</strong>ls plugins i<br />

mòduls <strong>de</strong>l CS po<strong>de</strong>n llegir les opcions que s’especifiquen en els fitxers <strong>de</strong><br />

configuració.<br />

Per crear un gestor <strong>de</strong> configuració farem: csInitialitzer::CreateConfigManager() o<br />

bé csInitializer::CreateEnviorement. Si volem especificar un gestor <strong>de</strong> configuració<br />

ho farem amb csInitializer::SetupConfigManager()<br />

Input Drivers<br />

S’encarrega <strong>de</strong> controlar els dispositius d’entrada com el teclat, ratolí o joystick. Per tal<br />

<strong>de</strong> crear aquest sistema es fa via csInitializer::CreateInputDrivers() o bé<br />

csInitializer::CreateEnviorement(). Cada event que es generi per un controlador serà<br />

encuat a la cua d’events per a que sigui atès.<br />

Classe csInitializer<br />

Aquesta classe ens ajuda a iniciar els diferents elements per a que les aplicacions<br />

funcionin correctament.<br />

Anem a veure un exemple <strong>de</strong> creació d’una petita aplicació utilitzant Crystal Space:<br />

Fitxer: simple.h<br />

#ifn<strong>de</strong>f __SIMPLE_H__<br />

#<strong>de</strong>fine __SIMPLE_H__<br />

#inclu<strong>de</strong> <br />

struct iEngine;<br />

struct iLoa<strong>de</strong>r;<br />

struct iGraphics3D;<br />

struct iKeyboardDriver;<br />

struct iSector;<br />

struct iView;<br />

struct iVirtualClock;<br />

struct iObjectRegistry;<br />

struct iEvent;<br />

class Simple<br />

122


{<br />

private:<br />

iObjectRegistry* object_reg;<br />

csRef engine;<br />

csRef loa<strong>de</strong>r;<br />

csRef g3d;<br />

csRef kbd;<br />

csRef vc;<br />

float rotX, rotY;<br />

public:<br />

Simple (iObjectRegistry* object_reg);<br />

~Simple ();<br />

};<br />

bool Initialize ();<br />

void Start ();<br />

static bool SimpleEventHandler (iEvent& ev);<br />

bool HandleEvent (iEvent& ev);<br />

#endif // __SIMPLE_H__<br />

Annexes<br />

Aquesta class anomenada “simple” conté una sèrie <strong>de</strong> referències a objectes importants.<br />

Els mèto<strong>de</strong>s a <strong>de</strong>stacar son Initialize() que ens inicialitza tots els plugins necessaris per<br />

l’aplicació i el mèto<strong>de</strong> Start() que inicia el gestor d’events.<br />

Fitxer: simple.cpp<br />

#inclu<strong>de</strong> "cssys<strong>de</strong>f.h" //necessari en tot els fitxers<br />

#inclu<strong>de</strong> "csutil/sysfunc.h"<br />

#inclu<strong>de</strong> "iutil/vfs.h"<br />

#inclu<strong>de</strong> "csutil/cscolor.h"<br />

#inclu<strong>de</strong> "cstool/csview.h"<br />

#inclu<strong>de</strong> "cstool/initapp.h"<br />

#inclu<strong>de</strong> "simple.h"<br />

#inclu<strong>de</strong> "iutil/eventq.h"<br />

#inclu<strong>de</strong> "iutil/event.h"<br />

#inclu<strong>de</strong> "iutil/objreg.h"<br />

#inclu<strong>de</strong> "iutil/csinput.h"<br />

#inclu<strong>de</strong> "iutil/virtclk.h"<br />

#inclu<strong>de</strong> "iengine/sector.h"<br />

#inclu<strong>de</strong> "iengine/engine.h"<br />

#inclu<strong>de</strong> "iengine/camera.h"<br />

#inclu<strong>de</strong> "iengine/light.h"<br />

#inclu<strong>de</strong> "iengine/texture.h"<br />

#inclu<strong>de</strong> "iengine/mesh.h"<br />

#inclu<strong>de</strong> "iengine/movable.h"<br />

#inclu<strong>de</strong> "iengine/material.h"<br />

#inclu<strong>de</strong> "imesh/thing.h"<br />

#inclu<strong>de</strong> "imesh/object.h"<br />

#inclu<strong>de</strong> "ivi<strong>de</strong>o/graph3d.h"<br />

#inclu<strong>de</strong> "ivi<strong>de</strong>o/graph2d.h"<br />

#inclu<strong>de</strong> "ivi<strong>de</strong>o/texture.h"<br />

#inclu<strong>de</strong> "ivi<strong>de</strong>o/material.h"<br />

#inclu<strong>de</strong> "ivi<strong>de</strong>o/fontserv.h"<br />

#inclu<strong>de</strong> "igraphic/imageio.h"<br />

#inclu<strong>de</strong> "imap/parser.h"<br />

123


#inclu<strong>de</strong> "ivaria/reporter.h"<br />

#inclu<strong>de</strong> "ivaria/stdrep.h"<br />

#inclu<strong>de</strong> "csutil/cmdhelp.h"<br />

#inclu<strong>de</strong> "csutil/event.h"<br />

CS_IMPLEMENT_APPLICATION<br />

// The global pointer to simple<br />

Simple* simple = 0;<br />

Simple::Simple (iObjectRegistry* object_reg)<br />

{<br />

Simple::object_reg = object_reg;<br />

}<br />

Simple::~Simple ()<br />

{<br />

}<br />

bool Simple::Initialize ()<br />

{<br />

//fem una petició <strong>de</strong>ls plugins que volem carregar<br />

if (!csInitializer::RequestPlugins (object_reg,<br />

CS_REQUEST_VFS,<br />

CS_REQUEST_OPENGL3D,<br />

CS_REQUEST_ENGINE,<br />

CS_REQUEST_FONTSERVER,<br />

CS_REQUEST_IMAGELOADER,<br />

CS_REQUEST_LEVELLOADER,<br />

CS_REQUEST_REPORTER,<br />

CS_REQUEST_REPORTERLISTENER,<br />

CS_REQUEST_END))<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"Can't initialize plugins!");<br />

return false;<br />

}<br />

Annexes<br />

// Check for commandline help.<br />

//comprava si s’ha especificat per línia <strong>de</strong> coman<strong>de</strong>s l’opció “—help”<br />

if (csCommandLineHelper::CheckHelp (object_reg))<br />

{<br />

csCommandLineHelper::Help (object_reg);<br />

return false;<br />

}<br />

// The virtual clock.<br />

vc = CS_QUERY_REGISTRY (object_reg, iVirtualClock);<br />

if (!vc)<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"Can't find the virtual clock!");<br />

return false;<br />

}<br />

// Find the pointer to engine plugin<br />

engine = CS_QUERY_REGISTRY (object_reg, iEngine);<br />

if (!engine)<br />

124


{<br />

}<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"No iEngine plugin!");<br />

return false;<br />

loa<strong>de</strong>r = CS_QUERY_REGISTRY (object_reg, iLoa<strong>de</strong>r);<br />

if (!loa<strong>de</strong>r)<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"No iLoa<strong>de</strong>r plugin!");<br />

return false;<br />

}<br />

g3d = CS_QUERY_REGISTRY (object_reg, iGraphics3D);<br />

if (!g3d)<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"No iGraphics3D plugin!");<br />

return false;<br />

}<br />

kbd = CS_QUERY_REGISTRY (object_reg, iKeyboardDriver);<br />

if (!kbd)<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"No iKeyboardDriver plugin!");<br />

return false;<br />

}<br />

//indiquem quina es la funció que tractarà els events<br />

if (!csInitializer::SetupEventHandler(<br />

object_reg, SimpleEventHandler))<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"Can't initialize event handler!");<br />

return false;<br />

}<br />

// Open the main system. This will open all the previously<br />

// loa<strong>de</strong>d plug-ins.<br />

if (!csInitializer::OpenApplication (object_reg))<br />

{<br />

csReport (object_reg, CS_REPORTER_SEVERITY_ERROR,<br />

"crystalspace.application.simple",<br />

"Error opening system!");<br />

return false;<br />

}<br />

csReport (object_reg, CS_REPORTER_SEVERITY_NOTIFY,<br />

"crystalspace.application.simple",<br />

"Simple Crystal Space Application version 0.1.");<br />

return true;<br />

Annexes<br />

125


}<br />

bool Simple::HandleEvent (iEvent& ev)<br />

{<br />

if (ev.Type == csevKeyboard &&<br />

csKeyEventHelper::GetEventType (&ev) == csKeyEventTypeDown &&<br />

csKeyEventHelper::GetCookedCo<strong>de</strong> (&ev) == CSKEY_ESC)<br />

{<br />

csRef q (CS_QUERY_REGISTRY (object_reg,<br />

iEventQueue));<br />

if (q)<br />

q->GetEventOutlet()->Broadcast (cscmdQuit);<br />

return true;<br />

}<br />

return false;<br />

}<br />

//aquesta és la funció que tracta els events<br />

bool Simple::SimpleEventHandler (iEvent& ev)<br />

{<br />

return simple ? simple->HandleEvent (ev) : false;<br />

}<br />

void Simple::Start ()<br />

{<br />

csDefaultRunLoop (object_reg);<br />

}<br />

/*---------------*<br />

* Main function<br />

*---------------*/<br />

int main (int argc, char* argv[])<br />

{<br />

//creem el register d’objectes<br />

iObjectRegistry* object_reg =<br />

csInitializer::CreateEnvironment (argc, argv);<br />

if (!object_reg) return -1;<br />

}<br />

//creem un objecte <strong>de</strong> la clase que hem creat<br />

simple = new Simple (object_reg);<br />

if (simple->Initialize ())<br />

simple->Start ();<br />

<strong>de</strong>lete simple;<br />

simple = 0;<br />

csInitializer::DestroyApplication (object_reg);<br />

return 0;<br />

Annexes<br />

Aquesta aplicació és la més sencilla que es pot crear amb el CS. El que fa l’aplicació és<br />

el següent:<br />

• Obre una finestra.<br />

• Controla el tamany <strong>de</strong> la finestra a partir <strong>de</strong>ls paràmetres d’entrada per la línia<br />

<strong>de</strong> comman<strong>de</strong>s (-mo<strong>de</strong>).<br />

126


Annexes<br />

• Carrega els següents plugins: engine, 3D ren<strong>de</strong>rer, canvas, reporter, reporter<br />

listener, font server, image loa<strong>de</strong>r, level loa<strong>de</strong>r, and VFS.<br />

Po<strong>de</strong>m observar en el codi la inclusió <strong>de</strong> la macro CS_IMPLEMENT_APPLICATION.<br />

Aquesta és necessària per tal <strong>de</strong> comprovar que la funció main() està correctament<br />

linkada i que és crida correctament en cada plataforma<br />

La rutina principal (main), primer crida a csInitializer::CreateEnviornment() per tal<br />

d’assegurar que el SCF, el registre d’objectes, la lectura <strong>de</strong> la línia <strong>de</strong> coman<strong>de</strong>s i<br />

multitud d’utilitats (gestor <strong>de</strong> plugins, cua d’events, ...) s’inicien correctament. A<br />

continuació la rutina principal crea una instància <strong>de</strong> la classe “simple”. Aquesta<br />

instància està emmagatzemada en una variable global per tal <strong>de</strong> facilitar l’accés. El<br />

següent pas està en iniciar l’aplicació (mèto<strong>de</strong> Initialization).<br />

Cal remarcar que s’utilitza la funció csReport per tal d’enviar missatge al plugin <strong>de</strong><br />

notificació (d’error). Aquesta té un funcionament semblant a la funció printf()<br />

exceptuant que s’han d’indicar el nivell <strong>de</strong> l’error i un i<strong>de</strong>ntificador per tal <strong>de</strong> que sigui<br />

fàcil <strong>de</strong>tectar <strong>de</strong>s d’on es produeix la notificació.<br />

La funció csInitializer::RequestPlugin() utilitza un fitxer <strong>de</strong> configuració per tal <strong>de</strong><br />

saber quins son els plugins disponibles.<br />

Per acabar és crida la funció csInitializer::OpenApplication() que s’encarrega d’enviar<br />

l’event ‘cscmdSystemOpen’ a tots els objectes en la cua d’events. D’aquesta manera per<br />

exemple el ren<strong>de</strong>ritzador 3D obrirà una finestra on és mostrarà l’escena. I l’últim pas<br />

està en cridar Simple::Start() on no és finalitzarà fins que s’enviï un event <strong>de</strong> fi<br />

d’aplicació.<br />

127


BIBLIOGRAFIA<br />

Bibliografia<br />

La bibliografia ha estat citada segons la notació MLA (Mo<strong>de</strong>rn Language Association<br />

of America.: www.mla.org<br />

REFERÈNCIES<br />

[1] A.Iones, A. Krupkin, M. Sbert, S. Zhukov<br />

Fast realistic lighting for vi<strong>de</strong>o games<br />

Article <strong>de</strong> recerca, 2003.<br />

[2] Alex Mén<strong>de</strong>z, Mateu Sbert, Jordi Catà<br />

Real Time Obscurances<br />

Graphics Group of Girona (GGG), Article <strong>de</strong> recerca, Abril 2003.<br />

[3] Andrew Rollings and Ernest Adams<br />

Andrew Rollings and Ernest Adams on Game Design<br />

New Ri<strong>de</strong>rs Publishing, maig 2003<br />

[4] Bob Bates<br />

Game Design: The art & business of creating games<br />

Prima Tech’s Game Developement series, Abril 2001<br />

[5] Chris Crawford<br />

Chris Crawford on Game Design<br />

New Ri<strong>de</strong>rs Publishing, juny 2003<br />

[6] Daniel Sánchez-Crespo Dalmau<br />

Core Techniques and Algorithms in Game Programming<br />

New Ri<strong>de</strong>rs Publishing, Setembre 2003<br />

[7] David H. Eberly<br />

3D Game Engine Design, A practical aproach to Real-Time computer<br />

Morgan Kaufmann Publishers ,2001<br />

[8] Donato Piccinno<br />

E-Opportunity in the Computer Game Industry<br />

MBA 2002 Dissertation<br />

[9] Isma Garcia, Francisco Gonzalez<br />

Comparativa Técnica: PS2, GameCube, Xbox<br />

Graphics Group of Girona (GGG), Report intern, 2003.<br />

[10] Jordi Catà <strong>Cas</strong>tillo, Alex Mén<strong>de</strong>z, Mateu Sbert<br />

Implementació <strong>de</strong>l mèto<strong>de</strong> <strong>de</strong> les obscurances en temps real<br />

Graphics Group of Girona (GGG), Article <strong>de</strong> recerca, Abril 2003.<br />

[11] Jordi Catà <strong>Cas</strong>tillo, Alex Mén<strong>de</strong>z<br />

128


Comparativa <strong>de</strong> <strong>motor</strong>es gràficos para vi<strong>de</strong>ojuegos<br />

Graphics Group of Girona (GGG), report intern, Abril 2002.<br />

Bibliografia<br />

[12] Jordi Catà <strong>Cas</strong>tillo<br />

Recorregut interactiu d’escenes arquitectòniques.<br />

Projecte Fi <strong>de</strong> Carrera, Enginyeria Tècnica en Informàtica <strong>de</strong> Gestió,<br />

Escola Politècnica Superior, Universitat <strong>de</strong> Girona, abril 2002.<br />

[13] Jorrit Tyberghein<br />

The portal technique for Real-time 3D Engines<br />

[14] Margarita García i Teixidor<br />

Implementació i millora <strong>de</strong>l mèto<strong>de</strong> d’il·luminació global mitjançant<br />

obscurances.<br />

Projecte Fi <strong>de</strong> Carrera, Enginyeria Tècnica en Informàtica <strong>de</strong> sistemes,<br />

Escola Politècnica Superior, Universitat <strong>de</strong> Girona, juliol 2001.<br />

[15] Tomas Möller, Eric Haines<br />

Real Time ren<strong>de</strong>ring<br />

A. K. Peters, Natick, Massachusetts, 1999<br />

[16] Rudy Rucker<br />

Software Engineering and Computer Games<br />

Addison Wesley, Desembre 2002<br />

[17] John R. Hall<br />

Programming Linux Games<br />

Loki software, Inc, 2001<br />

[18] Roger S. Pressman<br />

Ingenieria <strong>de</strong>l Software, un enfoque <strong>pràctic</strong>o, quarta edició<br />

McGraw-hill, 1999<br />

[19] Steve McConnell<br />

Rapid Development<br />

Microsoft press, 1996<br />

[20] Steve McConnell<br />

Software Project survival gui<strong>de</strong><br />

Microsoft press, 1998<br />

[21] Steve McConnell<br />

Professional software <strong>de</strong>velopment<br />

Addison Wesley, 2003<br />

[22] Tomasz Zaniewski<br />

Using Texture Mapping Techniques to Simulate Lights and Shadows in<br />

Real Time Computer Graphics<br />

Tesis Doctoral, Rho<strong>de</strong>s University, 2000<br />

129


WEB<br />

• Motors gràfics i llibreries:<br />

[WEB1] http://www.3<strong>de</strong>ngines.net/<br />

[WEB2] http://crystal.sourceforge.net<br />

[WEB3] http://www.ogre3d.org/<br />

[WEB4] http://openscenegraph.sourceforge.net<br />

[WEB5] http://www.nebula<strong>de</strong>vice.org/<br />

[WEB6] http://irrlicht.sourceforge.net/<br />

[WEB7] http://www.hawksoft.com/hawknl/<br />

[WEB8] http://www.rakkarsoft.com/<br />

[WEB9] http://www.libsdl.org/<br />

[WEB10] http://www.clanlib.org/<br />

[WEB11] http://www.openal.org/<br />

[WEB12] http://cal3d.sourceforge.net/<br />

[WEB13] http://openil.sourceforge.net/<br />

• Pàgines sobre gràfics per computador i vi<strong>de</strong>ojocs:<br />

http://realtimeren<strong>de</strong>ring.com<br />

www.gamasutra.com<br />

www.flipco<strong>de</strong>.com<br />

http://www.gamespp.com<br />

http://www.programmersheaven.com<br />

http://www.masda.vxu.se/~npamasda/GameLinkCollection.htm<br />

http://www.game-culture.com/newssites.html<br />

http://www.mcvuk.com<br />

Bibliografia<br />

130


AGRAÏMENTS<br />

Agraïments<br />

Voldria agrair i <strong>de</strong>dicar el projecte a un conjunt <strong>de</strong> persones que m’han ajudat d’una<br />

manera o una altra a la realització d’aquest projecte que és l’últim pas per assolir la<br />

titulació d’Enginyer Informàtic. Entre aquestes persones vull <strong>de</strong>stacar:<br />

• Mònica Izquierdo. La meva dona, per donar-me un suport moral, <strong>de</strong> comprensió,<br />

revisió i resums durant el <strong>de</strong>senvolupament.<br />

• Josep Catà. El meu germà per donar-me un altre punt <strong>de</strong> vista sobre temes<br />

d’implementació i presionar-me per que entregues el projecte a temps.<br />

• Concepció <strong>Cas</strong>tillo i Pere Catà. Els meus pares, sense ells no estaria en aquest<br />

mon i no hagués arribat fins aquí. I a més, per ensenyar-me el sentit <strong>de</strong> la vida i<br />

a lluitar per el que és vol.<br />

• Mateu Sbert. Per permetrem presentar com a projecte part <strong>de</strong> la meva feina en el<br />

Grup <strong>de</strong> Gràfics <strong>de</strong> la Universitat <strong>de</strong> Girona i sofrir les meves absències.<br />

131

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!