Progettazione e Sviluppo Di Un Repository Di Oggetti SL
-
Upload
giovanni-giuaninho-cannizzaro -
Category
Documents
-
view
232 -
download
1
Transcript of Progettazione e Sviluppo Di Un Repository Di Oggetti SL
Università degli Studi di Salerno
Facoltà di Scienze Matematiche, Fisiche e Naturali
TESI DI LAUREA IN INFORMATICA
Progettazione e sviluppo di un repository out-world di oggetti Second Life
ANNO ACCADEMICO 2007 – 2008
Relatore: Candidato: Prof. Rita Francese Cannizzaro Giovanni Dott. Ignazio Passero Matr. 556/000253
2
A mia madre e mia sorella, che mi hanno sempre appoggiato e sostenuto.
A mio padre ed al mio migliore amico Giuseppe,
che da lassù mi guardano e proteggono.
3
SOMMARIO
INTRODUZIONE ............................................................................ 6
1. SECOND LIFE : UN UNIVERSO TRIDIMENSIONALE .......... 9
1.1 Che cos’è Second life ........................................................ 9
1.2 Le Sim ................................................................................ 13
1.3 L’economia di Second Life ........................................... 17
1.4 Cosa può fare un avatar in Second Life.................... 20
2. STATO DELL’ARTE: LA COSTRUZIONE DI OGGETTI IN
SECOND LIFE ................................................................................ 22
2.1 I Prim .................................................................................... 22
2.2 Manipolazione dei Prim ...................................................25
2.3 Gli Sculpted-Prim .............................................................. 30
3. TECNOLOGIE UTILIZZATE .................................................... 32
3.1 Breve panoramica sull’ LSL............................................ 32
3.2 Costruire sculpted prim con Wings3D ........................ 36
4
3.3 Realizzare oggetti Second Life offline in Blender..... 40
4. IL SISTEMA PROPOSTO : slBackup .................................... 49
4.1 Idea di Base e componenti principali.......................... 49
4.2 Funzioni Utilizzate............................................................. 53
4.3 Database impiegato ......................................................... 56
4.5 Funzionamento del sistema........................................... 58
5. USO DEL SISTEMA.................................................................. 63
5.1 Modalità di backup ........................................................... 67
5.1.1 Single-Backup.............................................................. 68
5.1.2 Area-Backup................................................................. 69
5.1.3 Sfera-Backup ............................................................... 72
5.2 Ricostruzione degli oggetti ............................................. 74
5.2.1 SingleRezz .................................................................... 75
5.2.2 ProjectRezz .................................................................. 78
6. SVILUPPI FUTURI E CONCLUSIONI ..................................... 81
APPENDICE .................................................................................... 88
5
A1. Requisiti di Sistema.......................................................... 88
A2. Listati.................................................................................... 90
BIBLIOGRAFIA ............................................................................ 108
6
INTRODUZIONE
Second Life è uno dei fenomeni telematici che ha fatto più
discutere negli ultimi tempi, milioni di persone infatti
costituiscono la popolazione di questo vero e proprio universo
virtuale.
SecondLife è : “un mondo virtuale 3D online immaginato, creato e
posseduto dai suoi residenti” e la sua più grande caratteristica è la
possibilità da parte degli utenti di creare i contenuti di questo
ambiente immersivo 1.
Gli avatar 2 (la nostra controparte in SL) possono quindi creare di
tutto, dagli edifici ai mezzi di trasporto, dagli abiti agli accessori.
Una volta creato il nostro oggetto possiamo riporlo nel nostro
inventario e farlo riapparire ogniqualvolta ne avremo bisogno, a
meno che non ci capiterà di trovarci in aree in cui siamo privi dei
permessi necessari alla costruzione.
Second Life possiede inoltre un proprio linguaggio di scripting, il
Linden Script Language.
Gli script sono set di istruzioni posizionabili all'interno di un
qualsiasi oggetto, o in un qualsiasi accessorio indossato dagli
1 Ambiente immersivo : un ambiente artificiale, interattivo, creato al computer, un mondo entro il quale un utente può immergersi. 2 Avatar: un'immagine scelta per rappresentare la propria utenza in una community, luoghi di aggregazione, discussione, o di gioco on-line.
7
avatar, con i quali possiamo implementare animazioni, effetti, o
altro ancora come ad esempio far comunicare entità in-world 3
con web-server esterni.
Uno dei limiti di Second Life è di avere per ogni land 4 un numero
ridotto di oggetti rappresentabili, raggiunta tale quota, non
potremo posizionarne altri, per poter quindi rezzare 5 un nuovo
oggetto dovremo eliminarne qualcheduno per fare spazio. Anziché
cancellare un oggetto, possiamo, come detto in precedenza,
posizionarlo nel nostro inventario, ma anche quest’ultimo ha una
grandezza prefissata.
Per ovviare a tali inconvenienti, si è scelto di sviluppare un
sistema di memorizzazione esterno per gli oggetti di Second Life.
Oggetto di studio di questa tesi è stato la realizzazione di
slBackup, un sistema completo, ideato e progettato per l’uso in
SL, il quale ci permette di memorizzare e conseguentemente
ricostruire dei prim 6.
SlBackup combina alcune funzioni del LSL, all’uso di pagine PHP
ed a un Database MYSQL usato come data repository.
3 In world : ambiente 3D di Second Life. 4 Land: termine con il quale ci si riferisce ad una porzione di regione su SL. 5 Rezzare : si “materializza” un oggetto sul terreno. 6 Prim : forma primitiva alla base delle costruzioni in Second Life
8
Il sistema fornisce tre tipi distinti di backup :
• Il Single-Backup, ossia la memorizzazione di singoli oggetti.
• Lo Sfera-Backup, ossia la memorizzazione di un singolo
oggetto o di un gruppo di oggetti contenuti in un’area di
dimensione sferiche, la cui dimensione è selezionata
dall’utente.
• L’Area-backup, ossia la memorizzazione di un singolo oggetto
o di un gruppo di oggetti contenuti in un’area delimitata da
due cursori posizionati dall’utente.
Simmetricamente è possibile ricreare gli oggetti salvati, vi sono
due tipi di Rezzing:
• Il Sigle-Rezz, ossia la materializzazione di un singolo oggetto.
• Il Project-Rezz, ossia la materializzazione di un singolo
oggetto o di una serie di oggetti facenti parte di un progetto
specifico.
Queste funzionalità costituiscono una suite completa che
permette all’utente finale di eseguire in maniera rapida e intuitiva
il backup e la ricostruzione di oggetti SL.
9
1. SECOND LIFE : UN UNIVERSO TRIDIMENSIONALE
1.1 Che cos’è Second life
Second Life(SL) è un mondo virtuale tridimensionale multi-utente,
inventato nel 2003 dalla società americana Linden Lab fondata nel
1999 da Philip Rosedale. Fin dalla sua apertura ha catturato
l’interesse di molti utenti, tuttavia il suo successo internazionale è
stato raggiunto solo tra il 2006 e l'inizio del 2007, quando tutti i
media hanno notato le potenzialità di questo grande progetto.
La sua crescita è stata così rapida e inattesa, che il world è oggi
abitato da un totale di 15,262,5067 persone (utenti?) provenienti
da tutto il mondo.
Diversi termini, come simulated reality8 or immersive
environment9 sono stati coniati per descrivere Second Life,
nonostante le sue varie definizioni, il modo migliore di descriverla
è fornito da Linden Lab sul suo sito ufficiale. I suoi creatori
affermano che: "Second Life è un mondo virtuale 3-D interamente
costruito e posseduto dai suoi residenti"; questa breve frase
racchiude in poche parole le caratteristiche principali del world.
7 Dato aggiornato al 25/09/08, in questo dato sono inclusi anche utenti con più avatar. 8 Simulated Reality: Realtà Simulata, una simulazione al computer a un livello prossimo alla "vera" realtà. 9 Immersive Environement: Ambiente immersivo, un ambiente artificiale, interattivo, creato al computer, un mondo entro il quale un utente può immergersi.
10
Second Life nasce come M.M.O.R.P.G. (Massively Multiplayer
On-line Role Playing Game)10, rispettando così, la caratteristica
principale di questo genere ludico, ossia i mondi virtuali
persistenti: il giocatore può abbandonare il gioco in qualunque
momento, ma il mondo circostante continuerà ad evolversi anche
in sua assenza. Second life è però un MMORPG che si discosta
dagli altri poiché incorpora in sé una principale ed innovativa
differenza che gli permette di distinguersi: gli utenti possono
creare i contenuti.
Il sistema infatti, fornisce ai suoi utenti (chiamati "residenti") gli
strumenti per aggiungere e creare nel "mondo virtuale" nuovi
contenuti: oggetti, fondali, fisionomie dei personaggi, contenuti
audiovisivi, ecc.
La peculiarità di questo mondo virtuale è appunto quella di
lasciare agli utenti la libertà di usufruire dei diritti d'autore sugli
oggetti che essi creano, che possono essere venduti e scambiati
utilizzando una moneta virtuale (il Linden Dollar) convertibile in
valute reali come dollari o euro. Gli incontri al suo interno
appaiono come reali scambi tra esseri umani attraverso la
mediazione "figurata" degli avatar.
10 Esempi di MMORPG sono: World of Worcraft, Ultima On-line, Star Wars Galaxies, Ragnarock On-line
11
Il sistema si serve di Internet per permettere ai client (disponibili
per Win, Mac e Linux), tutti scaricabili gratuitamente da
secondlife.com, di connettersi alla Second Life Grid,
l’infrastruttura tecnologica su cui si poggia SL e attraverso questi
client (disponibili anche in versioni non ufficiali open-source) i
“residenti” possono entrare in-world. Ogni utente assume
un’identità, l’avatar, cui sono attribuite svariate capacità, le più
note sono: cambiare aspetto, costruire o possedere edifici ed
oggetti (anche programmabili con un linguaggio di script),
acquistare e/o vendere proprietà con i Linden$, che sono utilizzati
anche come compenso per chi lavora “dentro” questa economia
virtuale.
A differenza dei videogame on-line, Second Life non ha uno
scopo, un obiettivo finale da raggiungere, ma si presenta come
piattaforma per una svariata serie di applicazioni: collaborazione
in ambiente immersivo, ottimizzazione del commercio virtuale,
formazione ed insegnamento, sperimentazione artistica, culturale
ed architettonica, intrattenimento, divulgazione e creazione di reti
sociali e politiche.
12
Vi sono due forme di accesso possibili: basic (gratuito) e
premium, cioè a pagamento (con il quale si ottengono svariati
vantaggi).
13
1.2 Le Sim
Second Life è un vero e proprio mondo virtuale, la Main Grid
rappresenta lo spazio su cui sono ospitate le Sim (isole), in cui è
suddivisa, può pertanto essere comparata al mappamondo o
all’atlante terrestre.
FIGURA 1: La Main Grid
Essendo degli appezzamenti di terra, le Sim vengono vendute e/o
affittate. L'acquisto di una Sim (entire region, 'intera regione'), in
cui si possono creare varie tipologie di scenari integrandoli dal
14
punto di vista ambientale e urbanistico, corrisponde a 1.675
dollari una tantum e il suo mantenimento (fee) a 295
dollari/mese. Nel caso in cui sia dimostrabile che il progetto svolto
dal proprietario della regione è a scopo educativo o no profit, i
costi di acquisto e della tassa di mantenimento mensile
beneficiano del 50% di sconto: il costo di una Sim è quindi di
837,50 dollari una tantum e quello del mantenimento pari a
147,50 dollari/mese.
SIM Superficie Land Numero Prim Costo una
tantum
Tassa Mensile
Sim privata
PG/mature
65.536 mq 15.000 1.675 USD (~ 1.231,39 €)
295 USD
(~ 216,97 €)
Sim no
profit
educational
65.536 mq 15.000 837,50 USD
(~ 615,69 €)
147,50 USD
(~ 108,45 €)
Tabella 1 : Costi delle Sim
Le tipologie base di sim disponibili sono quattro:
Figura 2 :Tipi di SIM
15
Le sim scontate al 50% sono di due tipi: educational e no-profit, e,
non c'è la possibilità di richiedere altre forme, al contrario, è
possibile acquistarle di vario tipo in forma normale.
Comunque, è possibile modificare le caratteristiche fisiche di
qualsiasi sim, mediante gli strumenti di terraforming e le
funzionalità di Edit terrain che consentono di ampliare o ridurre i
confini, creare colline e montagne così come pianure e laghi, ecc.
Per le sim private PG e mature, invece, c'è la possibilità aggiuntiva
di inviare un file .raw per personalizzare la forma dell'isola.
Naturalmente i progetti possono essere ampliati aggiungendo una
o più sim alla prima isola acquistata. Due o più sim possono
essere unite per realizzare uno spazio terrestre contiguo
eliminando il confine acquatico su un lato. Nessuno può
acquistare una sim confinante lungo uno dei quattro lati con una
sim preesistente senza il permesso del proprietario (owner) di
quest'ultima. Ciò significa che, oltre a dovere eventualmente
chiedere l'autorizzazione al proprietario di un'isola per essere
'vicini di sim', si può quindi valutare e selezionare eventuali
confinanti, decidendo perfino di non avere sim adiacenti. A ogni
sim si può dare la denominazione desiderata per renderla
immediatamente riconoscibile, i nomi devono contenere al
16
massimo tre parole per un totale inferiore a 20 caratteri
alfanumerici, spazi inclusi, senza segni di punteggiatura, non si
possono usare le stringhe 'Second Life', 'SL' o 'Linden Lab' né i
nomi di località reali (es. Firenze, Florence) o denominazioni già in
uso in-world.
In fase di acquisto, si può specificare il posizionamento della
nuova sim nella piattaforma Second Life.
Per procedere all'acquisto di una sim occorre inoltre disporre di
un account Premium .
17
1.3 L’economia di Second Life
Second Life possiede una economia autonoma e vera.
Questa economia si fonda su un libero mercato fra i residenti, e,
si possono acquistare e vendere servizi e beni virtuali.
I servizi includono camping11, lavoro nei negozi, gestioni aziendali,
divertimento (addirittura intrattenimento per adulti), la creazione
di contenuti personalizzati e altri servizi personali.
I beni virtuali comprendono gli edifici, i veicoli, i dispositivi di tutti
i tipi, animazioni, abbigliamento, pelle, capelli, gioielli, la flora e la
fauna, e le opere d'arte.
La valuta del word è il Linden Dollar, termine che viene
solitamente abbreviato con L$. I L$ si possono guadagnare tramite
lavori oppure si possono comprare. I L$ si possono anche
acquistare sia sul sito ufficiale di SL, sia in-world utilizzando una
qualunque carta di credito. Il reale valore del cambio è
consultabile su https://secondlife.com/currency/.
Figura 3 :L$/US$
11 Camping: letteralmente campeggio, verrà descritto in seguito.
18
Per fare soldi in Second Life, si devono trovare i clienti che sono
disposti a pagare per i servizi o i prodotti che si è in grado di
fornire, proprio come nella vita reale. Come spiegato nel paragrafo
precedente vista l'esistenza di terreno virtuale, vi è un attivissimo
mercato immobiliare, originariamente tutto il terreno proviene da
Linden Lab ma dopo che si è acquistato, la compravendita è
molto simile a quella reale. Molti residenti guadagnano o hanno
guadagnato grandi somme di denaro (non solo virtuale) da questo
mercato immobiliare. Alcuni residenti ricevono un piccolo
stipendio settimanale, a seconda del tipo di account che
possiedono, e da quanto tempo hanno aderito a Second Life.
Vi è anche un'equivalente del minimo salario virtuale e delle
organizzazioni che cercano di introdurre nuovi residenti alla
consumer economy12.
Un'altra opzione per fare soldi in Second Life è il "camping".
In tutto il world vi sono luoghi in cui i membri possono
guadagnare da una postazione, posizionandosi su di essa e
svolgono attività come la danza o la pittura, o altre azioni simili; il
pagamento è offerto in base al tempo trascorso (L'importo di
Linden$ pagato per l'intervallo di tempo varia da luogo a luogo).
12 Consumer Economy: un'economia che punta tutto sulla domanda diretta ai consumatori finali.
19
Poiché questa opzione potrebbe portare alcuni utenti a lasciare i
loro avatar in "camping" per giorni, accumulando migliaia di L$, la
maggior parte delle land13 ha alcune opzioni di campo per limitare
la quantità di denaro che può essere guadagnato su di una
postazione per un lasso di tempo, e la durata del camping.
13 Land: termine con il quale ci si riferisce ad una porzione di regione su SL.
20
1.4 Cosa può fare un avatar in Second Life
Non essendo il classico gioco in cui il personaggio di turno segue
una trama per raggiungere un obiettivo, si può partecipare a SL
anche senza avere uno scopo preciso. Non si collezionano punti,
non ci sono percorsi obbligati, ogni giocatore stabilisce da sé la
propria strategia, spaziando dal business alla poesia passando per
qualsiasi cosa gli venga in mente, tutto è possibile, o quasi.
Si può mirare a raggiungere la ricchezza o semplicemente a fare il
turista (costa sicuramente meno che non nella RL14). Gli unici
limiti sono dettati dal rispetto degli altri residenti. Infatti il
giocatore deve accettare le condizioni di servizio15 definite dalla
Linden lab, pena l’espulsione dal gioco.
Brevemente le regole, che deve seguire chiunque voglia utilizzare
Second Life si basano sui seguenti semplici concetti:
• Tolleranza
• Non molestare
• Non aggredire
• Protezione della vita privata
• Decenza
• Pace e tranquillità
14 RL: Real Life vita reale 15 http://secondlife.com/corporate/tos.php
21
Ogni residente può decidere di appartenere ad un gruppo.
Un gruppo è un’associazione di due o più residenti che
condividono obiettivi e/o interessi comuni.
L’avatar che vuole appartenere ad un gruppo può decidere di
unirsi ad uno già formato oppure formarne uno tutto suo, dando la
possibilità ad altri residenti di parteciparvi. In ogni caso
l’appartenenza ad un gruppo è vantaggiosa perché si socializza
con gli altri membri, si collabora per gli stessi interessi e si
condividono le stesse opinioni.
In generale, la maggior parte dei residenti appartiene almeno ad
un gruppo, e quelli che non appartengono a nessuno sono di
solito nuovi utenti che da poco hanno creato un account.
Uno strumento messo a disposizione dell’avatar sicuramente da
non sottovalutare e che vale la pena citare è la valigia (o
inventory) dove è possibile immagazzinare tutte le nostre
creazioni, tutti gli oggetti che racimoliamo o compriamo durante la
nostra esplorazione del mondo virtuale e che possiamo rezzare
in-world al momento opportuno.
22
2. STATO DELL’ARTE: LA COSTRUZIONE DI
OGGETTI IN SECOND LIFE
2.1 I Prim
La creazione di oggetti è sicuramente uno degli aspetti più
interessanti e affascinanti di Second Life, tutte le cose che
vediamo in-world quali gli edifici, i veicoli ecc. sono costituite da
prims.
I Prim o primitives sono l'unità di misura che indica i blocchi di
costruzione su Second Life, sono delle forme creata con i build
tools che possono essere combinate o unite.
Esistono sette forme principali di prims: cubo, prisma (tetraedro),
cilindro, sfera, toro (o ciambella), tubo e anello; da queste forme
basilari si possono ottenere elaborandole altre più complesse, che
analizzeremo una per una.
• IL CUBO - Il cubo è il prim principale e forse quello più utile. I
cubi possono essere usati per costruire di tutto, da travi e
archi, a muri. Svuotati e tagliati possono essere usati per
costruire stanze da 1 prim quasi perfette, necessitanti solo di
tetto e pavimento. Le forme secondarie dei cubi disponibili
23
nella dialog di creazione sono il CUNEO e la PIRAMIDE.
Entrambe queste forme sono delle variazioni del cubo
ottenute aggiustando i livelli di Top Size che si trovano nella
scheda Object del dialog Edit.
• IL PRISMA (Tetraedro) - Il tetraedro è una piramide a base
triangolare. E’ molto difficile da allineare in una costruzione
ma è quasi imbattibile per creare decorazioni. Sebbene il
tetraedro sia la seconda famiglia di forme nella dialog
Creation (dopo il CUNEO e la PIRAMIDE, che sono cubi
alterati), è forse la famiglia che dà più problemi per quanto
riguarda il suo utilizzo nelle costruzioni. Il tetraedro ha la
superficie più estesa in rapporto al suo volume più di ogni
altro solido in 3D, non ha forme derivate.
• IL CILINDRO - Una forma molto utile, in pratica è una scatola
rotonda. Il cilindro ha a disposizione gli stessi strumenti di
editing che hanno i cubi e i prismi ed è facile da allineare
come i cubi.
24
• LA SFERA - Un'altra forma estremamente utile, come il cubo e
il cilindro. La sfera ha la superficie meno estesa di ogni altro
solido in 3D in rapporto al suo volume. E’ simile alla famiglia
del cubo per quanto riguarda l’editing, tranne che per il
tapering (affusolarsi) e lo shearing (tranciare).
• IL TORO (o ciambella) - E’ una delle forme più strane ma
certamente la più versatile. Il Toro offre più possibilità di
regolare la propria forma di ogni altro prim in SecondLife. E’
fatto però di molti poligoni e crea più lag16 delle altre forme.
• IL TUBO - Un tubo assomiglia esattamente ad un cilindro cavo,
ma è molto particolare. Il suo comportamento è molto simile
ad un toro dalle pareti piatte.
• L’ANELLO - L’anello è un prim molto particolare: è
approssimativamente come un tubo con entrambe le
estremità affusolate e non ha una facciata superiore Z. Una
volta imparato ad usarlo è molto utile. Può essere fantastico
per le decorazioni.
16 Lag : ritardo, nel nostro caso il ritardo fra il tempo in cui noi modifichiamo l’oggetto ed il tempo in cui vedremo la modifica su video.
25
2.2 Manipolazione dei Prim
Dopo aver visto le categorie dei prims possiamo descrivere la
parte più complessa, ossia il building vero e proprio. Come detto
in precedenza alla base del Building vi sono i prims,
manipolandoli potremmo ottenere quasi ogni tipo di oggetto.
Quando si crea un oggetto o se ne modifica (edit) uno
preesistente, il dialogue dell'editing appare in Modalità
Posizionamento, Tre linee penetreranno il centro geometrico del
prim e ogni linea avrà due maniglie a forma di cono. Questi coni
sono orientati verso la direzione positiva del prim sul suo asse X,
Y o Z. Per il posizionamento degli oggetti Second Life segue le
regole delle coordinate cartesiane, se si guarda la parte destra
della finestra di Edit, si nota la Modalità Righello (Ruler Mode) con
un menù a tendina che offre tre possibilità : World (Mondo) mostra
l'orientamento XYZ del mondo intero e la posizione del nostro
prim in relazione ad esso; Local (Locale) mostra l'orientamento
XYZ del prim o dell'oggeto che si sta manipolando in relazione al
suo asse locale; Reference (Riferimento) si usa un altro prim come
riferimento. Un'altra modalità è quella di rotazione, per accedere
alla Modalità Rotazione (Rotate), basta selezionare un prim o un
oggetto e premere il tasto CTRL sulla tastiera e apparirà un globo
26
intorno all'oggetto selezionato, o dentro di esso se è molto grande
o molto vicino. Sul globo ci sono tre anelli colorati che ci
permetteranno di ruotare il nostro oggetto solo nella direzione
desiderata. Gli anelli, tirati uno alla volta, fanno ruotare l'oggetto
su di un solo asse, mentre con il globo si possono ruotare su vari
assi alla volta. Inoltre si può sempre stabilire la rotazione grazie
all'editing dialogue nella scheda Object. In effetti, quest'ultima
interfaccia è la più affidabile, ma, se si devono ruotare delle
strutture molto estese e non collegate tra di loro, non vi resta che
l'interfaccia di rotazione. Fortunatamente c'è un indicatore di
rotazione in cima allo schermo, che ci indica esattamente cosa
stiamo facendo nel momento in cui lo facciamo. In questo modo
possiamo evitare di andare avanti per tentativi quando dobbiamo
ruotare le cose manualmente. Naturalmente oltre allo spostare e
ruotare vi è la possibilità di ridimensionare i prims, questa
modalità è chiamata "stretching". Nell'interfaccia di SL si accede
tenendo contemporaneamente premuti i tasti SHIFT e CTRL. Sulle
facciate e agli angoli del nostro prim appariranno dei piccoli cubi,
questi sono in effetti le maniglie di ridimensionamento e sono
colorate a seconda dell'asse. Il rosso indica la dimensione X; il
verde la dimensione Y e il blu la dimensione Z. Noteremo anche
27
che il nostro cursore cambierà , diventando una scatola con
dentro una freccia, alla destra della freccia principale, per indicare
che siamo in modalità ridimensionamento. Anche la finestra di
Edit indicherà che siamo in modalità Stretch (CTRL-SHIFT) e nella
parte alta del nostro schermo vedremo un indicatore di
dimensione che mostra le dimensioni X, Y e Z dell'oggetto
selezionato. Tutte queste operazioni si possono effettuare anche
usando i size spinners (campi di input) nella finestra di Edit,
bisogna però sapere che quando si immettete una dimensione il
prim verrà ridimensionato uniformemente da entrambi i lati. Se si
vuole ridimensionare un lato solo, bisognerà farlo "a mano" tramite
l'interfaccia di costruzione e non tramite la finestra di Edit. La
griglia può essere d'aiuto in questo caso, ma saranno certamente
più utili le informazioni in cima allo schermo.
A volte può essere un vantaggio mantenere regolari le dimensioni
dei prim, questo rende più semplice applicare una texture che
avrà una base regolare sulla quale appoggiarsi, inoltre sarà anche
più agevole calcolare misure e distanze degli elementi della
costruzione. Si possono applicare colori e texture a lati diversi
dello stesso prim. L'opzione Select Texture in cima alla finestra di
Edit permette di selezionare solo le facciate di un prim (o di un
28
gruppo di prim) alle quali desiderate applicare una texture. Ciò
significa che si possono specificare fino a 9 texture per ogni
primitives. Ci sono due modi per selezionare i prim: il metodo
della "selezione cliccata" e la "selezione di massa", il primo si
realizza se teniamo premuto il tasto SHIFT mentre clicchiamo su
altri prim in modalità Edit, selezioneremo altri prim in sequenza; il
secondo se clicchiamo su di una superficie (terra, acqua, un
grande prim... o persino il cielo) e trasciniamo il cursore tenendo
premuto il tasto sinistro del mouse, vedremo apparire un
rettangolo dorato che includerà tutti i prim sul suo percorso .
Dal momento che tutte le costruzioni si fanno con i prim, è
necessario poter collegare uno o più prims per formare una serie,
in modo da ottenere delle forme particolari per modellare o
costruire.
Su Second Life non è possibile creare un oggetto dettagliato
formato da un solo prim usando le mesh come in 3D Studio
Max.(vedremo in seguito come). In modalità Edit, clicciamo su
due prim e poi premiamo CTRL-L per linkarli, oppure entrariamo
nel menù Tools e selezioniamo Link. Per scollegarli, clicchiamo
sull'uno o sull'altro e teniamo premuti CTRL-SHIFT-L oppure
facciamolo dal menù Tools.
29
Si possono linkare in serie fino a 256 prim ordinari e fino a 31
prim fisici. Due prim si possono linkare fino ad una certa distanza,
quest’ultima dipende in parte dalla grandezza dei prim da linkare.
30
2.3 Gli Sculpted-Prim
Oltre ai normali prim, ne esiste un altro tipo molto speciale, lo
Sculpted Prim (o Sculptie), che è un oggetto la cui forma è
determinata da una texture; queste textures vengono chiamate
Sculpt Textures o Sculpt Maps.
Lo Sculpted prim può essere usato per creare forme più
complesse, che non sono realizzabili con il semplice sistema dei
prims. Una Sculpt Texture è una mappa (bitmap) che contiene le
informazioni per rappresentare l’oggetto nello spazio, andando nel
tecnico: i canali RGB17 dell’immagine rappresentano (invece che i
colori) le coordinate spaziali; le informazioni R, G, e B sono in
realtà le coordinate in tre dimensioni, negli assi X, Y, e Z. Perchè è
così importante poter modellare una forma? Per due motivi: il
primo è la penuria di primitive utilizzabili in ogni land; il secondo
è la necessità di usare molte primitive per realizzare oggetti
complessi. Con un "prim sculpted" si ottiene un oggetto complesso
fatto da una sola primitiva. Per poter lavorare su questo tipo di
textures si devono però usare software di terze parti. La diffusione
planetaria di Second Life ha favorito lo svilupparsi di programmi o
di tool aggiuntivi (per sistemi già esistenti) dedicati a questa
17 RGB : modello di colori di tipo additivo e si basa sui tre colori Rosso(Red), Verde (Green) e Blu(Blue).
31
caratteristica, basti pensare che piattaforme come Zbrush, Maya,
3D Studio Max o Light Wave 3D hanno aggiunto funzionalità per gli
sculpted prim, oltre a questi software a pagamento anche la
comunità open-source18 si è data da fare sfornando tool per i vari
Blender o Wings3D(Entrambi usati in questo lavoro di tesi).
Ognuno dei software che abbiamo menzionato sviluppa il suo
lavoro in modo differente, ma il principio di base è simile fra tutti,
ossia creare l’oggetto 3D e poi salvarlo in un formato compatibile
supportato da SL.
Una volta salvata la texture contenente le coordinate per
riprodurre l’oggetto da noi accuratamente creato dovremo
caricarla in-world, però se vogliamo importare la nostra texture su
Second Life dovremo sborsare qualche L$, per raggiungere il
nostro obiettivo pagheremo la cifra irrisoria di 10 L$.
18 Open-Source: software rilasciato con un tipo di licenza per la quale il codice sorgente è lasciato alla disponibilità di eventuali sviluppatori.
32
3. TECNOLOGIE UTILIZZATE
3.1 Breve panoramica sull’ LSL
LSL è l'acronimo di Linden Scripting Language, un linguaggio di
programmazione strutturalmente simile a C e Java con cui sono
scritti tutti gli scripts in Second Life.
Gli scripts in Second Life sono set di istruzioni posizionabili
all'interno di un qualsiasi oggetto, o in qualsiasi accessorio
indossato dagli avatars e possono essere scritti con un
Editor/compilatore integrato in-world.
La cosa che rende l’LSL adatto alla programmazione di SL è il forte
utilizzo di "Stati" e di "Eventi", infatti questo linguaggio è
event-driven19.
Una porta può essere "aperta" o "chiusa" e una luce "accesa" o
"spenta": molti oggetti reali hanno degli "stati" e la stessa cosa può
essere emulata in programmi LSL, ad ogni modo ogni script ha
sempre uno stato iniziale: quello di default. Gli eventi non sono
definiti dal programmatore in Second Life ma sono interni all’LSL
ed ognuno di essi può essere interpretato come un "Trigger”, cioè
come un “grilletto” che risponde con una certa azione allo
19 Event-driven programming: è un paradigma di programmazione in cui il flusso del programma è guidato da sensori o azioni degli utenti o messaggi da altri programmi.
33
scatenarsi di un certo avvenimento: ad esempio l’evento
Touch_start() eseguirà il codice al suo interno quando l'oggetto
che contiene lo script viene toccato dall’avatar. Quindi uno script
LSL deve avere almeno uno stato con un evento al suo interno.
Nella figura seguente è illustrato un semplice programma che può
facilmente essere tradotto come: "Quando sono nello stato di
default, e vengo toccato, visualizzo a video la scritta HELLO
WORLD".
Figura 4:editor/compilatore LSL
Ma cosa si può fare con gli scripts? Gli scripts rappresentano
l’anima degli oggetti. Gli oggetti virtuali possono assumere un
qualsiasi comportamento analogo di un oggetto reale:
un’automobile può viaggiare, un aereo può volare, una palla può
rotolare e/o cadere dall’alto, una lampada può emanare un fascio
34
di luce, un proiettore può trasmettere filmati video e/o visualizzare
slide per presentazioni, una finestra può aprirsi e chiudersi e lo
stesso vale per una qualsiasi porta che si trova in un qualunque
edificio o casa, un microfono può ascoltare le parole pronunciate
da un avatar e trasmetterle ad un registratore; è anche possibile
riprodurre un mare agitato con le onde, insomma qualsiasi oggetto
del mondo reale che ha determinati comportamenti lo si può
simulare nell’identica maniera, con gli stessi comportamenti,
all’interno di Second Life.
Ma le potenzialità dell’LSL vanno oltre queste particolarità, tramite
script si può comunicare con web-server esterni a SL ed effettuare
varie operazioni sfruttando pagine PHP (cosa fatta in questa tesi).
Ci sono più di 300 funzioni di libreria disponibili20, gli utenti
possono inoltre definire funzioni aggiuntive. LSL è un linguaggio
fortemente tipizzato21, che è stato compilato bytecode prima di
essere eseguito su di una macchina virtuale in uno dei server
Linden Lab.
20 http://wiki.secondlife.com/wiki/Category:LSL_Functions 21Fortemente tipizzato : l'espressione forte tipizzazione (strong typing) può essere usata per caratterizzare il tipo di regole che un determinato linguaggio di programmazione impone, a livello sintattico o semantico, circa la tipizzazione dei dati e all'uso dei dati in relazione al loro tipo
35
Per il primo trimestre del 2006 era prevista una versione riveduta
di questo sistema di scripting ma è stata rinviata a data da
destinare.
Linden Lab è tutt’oggi in fase di sviluppo, come evidenziano le
numerose dimostrazioni presentate a Microsoft. Il nuovo motore di
esecuzione degli script utilizza Mono (l'implementazione open
source di Microsoft. NET Framework), come virtual machine per gli
script in esecuzione sul server.
Il 29 gennaio 2008, Linden Lab ha rilasciato il mono VM su
diverse Sims nella Second Life Beta Grid, per testarne
ampiamente la compatibilità con il codice esistente. Il 20 agosto
dello stesso anno, Linden Lab ha dichiarato che il mono VM sarà
installato su diverse Sim nella nuova produzione delle Second Life
Grid22; Il 29 agosto, l'intera catena di produzione è stata
aggiornata per essere in grado di utilizzare il mono VM.
Il linguaggio di scripting LSL rimane lo stesso, ma l'esecuzione su
Mono fornisce le funzionalità per incrementare la velocità fino a
220 volte. Un ulteriore vantaggio di questo cambiamento è che
qualsiasi linguaggio che viene compilato attraverso il mono Virtual
Machine può essere caricato ed eseguito in Second Life.
22 http://blog.secondlife.com/2008/08/20/mono-launch/
36
3.2 Costruire sculpted prim con Wings3D
Wings 3D è un modellatore 3D open-source con una attiva
comunità di utenti. Il suo potenziale è abbastanza alto, con un po’
di pratica si riesce a equiparare il dettaglio e la qualità di progetti
realizzati con software di alto livello a pagamento, nonostante sia
un programma semplice e privo della moltitudine di funzionalità
offerte dai vari 3DS Max e Maya.
Wings 3D può essere utilizzato quindi per creare modelli
tridimnesionali complessi, e attraverso un plug-in è possibile
esportare il modello come sculpted map compatibile con Second
Life.
Quando si costruisce uno sculpty in Wings, non è possibile
utilizzare alcune delle caratteristiche del programma, in
particolare, non si possono aggiungere o eliminare i vertici,
spigoli, facce al nostro modello.
Ora vedremo passo passo come si crea uno sculpted con
Wings3D:
1. Facciamo partire Wings. Possiamo iniziare da uno dei
modelli standard di SL (sfera, cilindro, toro) rintracciabili sui
forum, oppure creando un oggetto da zero, per questa
opzione, creiamo una sfera, la dimensione consigliata per
37
l’oggetto è 32x31. L’oggetto che stiamo per creare dovrà
mantenere lo stesso numero di vertici, altrimenti il nostro
sculpty non verrà visualizzato correttamente.
Figura 5: Sfrera 32x31 su Wings 3D
2. Realizziamo il nostro oggetto, come se dovessimo modellare
una massa di creta, teniamo d'occhio il messaggio sulla
barra nella parte inferiore della finestra che ci dirà quale
strumento si sta usando, e in che modo è possibile
modificare il comportamento degli strumenti.
3. La tecnica di base è quella di selezionare alcuni vertici,
spigoli, o facce, e quindi trasformare l’oggetto in vari modi:
38
- Selezione: ci sono numerosi strumenti per la selezione
dei gruppi di vertici, bordi, e di facce. Nella parte
superiore della finestra, è possibile selezionare diverse
modalità, come ad esempio Vertex o Face.
- Ottimizzazione: In modalità ottimizzazione, è possibile
afferrare un vertice, un bordo, e, muoversi intorno
all’oggetto.
- Magnetismo: Se si attiva il magnetismo, le
trasformazioni si ripercuotono sui vertici vicini.
Figura 6: Modello di Satellite realizzato con Wings 3D
4. Una volta completato il nostro oggetto selezioniamo
Menu>File>Export e utilizziamo il Second Life plug-in,
39
esportando la sculpt map. Sarà creato un file bmp.
Carichiamo quindi il file bmp su Second Life e applichiamo
la texture map ad uno sculpted prim. Visualizzeremo così il
nostro oggetto.
Figura 7: Sculpted prim importato su SL
40
3.3 Realizzare oggetti Second Life offline in Blender
Un altro software utilizzato durante questo lavoro di tesi è Blender.
Blender è un programma open-source per la modellazione e il
rendering di immagini ed animazioni tridimensionali.
Può essere utilizzato anche per lo sviluppo di oggetti 3D (UV
unwrapping), simulazioni di fluidi, di rivestimenti, di particelle,
altre simulazioni non lineari e creazione di applicazioni/giochi 3D.
Da quando è stato rilasciato il suo sorgente, Blender è stato
notevolmente migliorato e il codice di base ha subito numerose
modifiche, soprattutto al fine di poter inserire nuove funzionalità
con maggiore facilità.
Sebbene Blender (fino alla versione 2.36) abbia sempre cercato di
raggiungere i software 3D proprietari e adesso permetta di
realizzare praticamente ogni cosa possibile nell'ambito 3D,
differisce ancora da programmi come Autodesk Maya, Softimage
XSI o Cinema 4D.
Manca ancora in esso, un sistema NLA (Non Linear Animation) più
ricco e flessibile, con la possibilità di unire armature (può solo
essere emulato con un uso esteso dei vincoli), esportare in
formato non binario, un sistema migliorato per gestire le
41
misurazioni e, soprattutto a causa dello sviluppo rapido di
Blender, una documentazione coerente e sempre aggiornata.
In questa tesi si è adoperato un tool che permette la costruzione
di prims su questa piattaforma software, in seguito i prims creati
possono essere importati su Second Life grazie ad un prim
importer.
Ora vedremo come si creano degli oggetti offline utilizzando
questo tool di Blender:
1. Lanciamo il tool (il nome del file è Prim.Blender.Blend),
subito dopo si aprirà Blender con un pannello a sinistra
contenente del testo; per poter cominciare basterà cliccare
col tasto destro del mouse all'interno del pannello col testo
e selezionare Execute Script.
42
Figura 8: Avvio Blender e esecuzione dello script
2. Comparirà così il pannello con gli oggetti che si possono
costruire su Second Life ed un cubo di default. Per inserire
gli oggetti desiderati basterà fare doppio clic sulla relativa
icona (cubo, sfera, cilindro ecc.) e modificarli dal pannello
SL, se invece volete modificare un oggetto che avevate già
posizionato basta riselezionarlo cliccandoci su col tasto
destro del mouse e modificare i parametri desiderati dal
pannello. Per poter lavorare correttamente con i prims
all'interno di Blender la modalità di lavoro dovrà restare
sempre su Object Mode, e non passare mai ad altre
modalità di lavoro.
43
Figura 9: Finestra di lavoro
3. Adesso siamo pronti per lavorare: per cancellare un oggetto
lo si seleziona cliccandoci col tasto destro - canc e di
seguito Invio per confermare, per selezionare più di un
oggetto si seleziona il primo con il tasto destro del mouse, si
tiene premuto Shift e si selezionano gli altri cliccandoci su
col tasto destro. Per spostare/ruotare/scalare gli oggetti lo si
può fare attivando il modificatore con CTRL-Space e di
seguito selezionare il modificatore che si desidera usare.
Una volta finito di creare ciò che volevamo fare salviamo
tramite il pulsante Save posto in basso a sinistra del
pannello oggetti. L'unico neo di creare gli oggetti in Blender
44
è che non si possono assegnare né materiali né flexibles,
questa operazione può essere fatta solo all'interno di
Second Life.
Figure 10-11: Operazioni di modifica
Figura 12: Oggetto completo in Blender
45
4. Ora per poter importare il nostro oggetto all'interno di
Second Life ci occorre copiare il contenuto del file che
abbiamo appena salvato aprendolo con il blocco note. In
pratica il File che abbiamo appena aperto è un file di testo
che contiene tutti i prims con le proprietà elencate così
come li abbiamo realizzati. Ora non ci resta che Selezionare
tutto il testo tramite la voce Modifica – Seleziona Tutto del
Blocco Note. E Copiarlo nella Clipboard Tramite Modifica –
Copia.
5. Ora è arrivato il momento di collegarci a Second Life e
importare il tutto. Apriamo la nostra inventory e Clicchiamo
su Create – New Note e incolliamo il file blender che
abbiamo copiato in precedenza e di seguito cliccando sul
pulsante Save per salvarla.
46
Figura 13: Notecard
6. Ora per poter fare in modo che vengano ricreati gli stessi
oggetti del nostro file Blender dobbiamo procurarci una
copia dell'Offline Builder Importer. In pratica si tratta di un
piccolo box con all'interno tutti gli script necessari a
convertire la nostra notecard negli oggetti SL rappresentanti
il nostro oggetto. Per completare l'operazione dobbiamo
recarci in una Sandbox23 (o in una zona dove possiamo
costruire). Adesso prendiamo l'Offline Builder Importer e
rezziamolo a terra. Ora prendiamo la notecard che abbiamo
creato e trasciniamola nel box dell'Offline Builder Importer.
23 Sandbox: luogo in second life dove si può costruire liberamente
47
Dopo qualche secondo cominceremo a vedere comparire i
primi oggetti, che progressivamente andranno ad
autoposizionarsi. Dopo qualche istante vedremo l'oggetto
che abbiamo realizzato in Blender ricostruito dinanzi ai
nostri occhi (per un oggetto composto da 30 prims il tempo
medio per ricostruirsi in Second Life è di circa 1 minuto).
Figura 14: Offline Builder importer in funzione
7. Infine non ci resta che assegnare i materiali, settare i colori
e le textures e il nostro oggetto è pronto.
48
Figura 15: Oggetto completo
49
4. IL SISTEMA PROPOSTO : slBackup
4.1 Idea di Base e componenti principali
Uno dei grandi limiti di Second Life è di poter inserire in ogni land
un numero prefissato di prim, una volta raggiunto tale numero,
per poter creare o materializzare dei nuovi oggetti dovremo prima
eliminare qualche prim. Invece di eliminare qualche oggetto
potremo riporlo nel nostro inventario, ma anche quest’ ultimo ha
una grandezza limitata.
Per ovviare a questi inconvenienti, si è scelto di sviluppare un
sistema di memorizzazione esterno per gli oggetti di Second Life.
Il lavoro di tesi culminato con la realizzazione di slBackup, ha
prodotto un sistema completo, ideato e progettato per l’uso in SL,
il quale ci permette di memorizzare e conseguentemente
ricostruire degli oggetti.
Il sistema combina alcune funzioni del LSL, all’uso di pagine PHP
ed a un Database MYSQL usato come data repository.
50
Le entità che compongono il nostro sistema sono quattro:
1. Un “satellite”, che ci fornisce un’interfaccia per scegliere i
tipi di backup e di Rezzing disponibili, in oltre è questa entità
a inviare le richieste alle pagine PHP per memorizzare o
ricostruire i prim.
Figura 16: Satellite
2. Uno script chiamato slBackupFinal, che sarà inserito in ogni
oggetto che noi vorremo salvare, il quale contiene le funzioni
necessarie per ottenere le caratteristiche del prim e l’invio
delle informazioni raccolte al satellite.
51
Figura 17: Oggetto contenente lo script
3. Un paletto(in realtà saranno due) il quale verrà impiegato in
una delle modalità di backup per delimitare un’area dentro
la quale preleveremo le caratteristiche dei prim al suo
interno.
Figura 18: Paletto
4. Un prim particolare che chiameremo Rezzer, sarà questo tipo
di prim, che tramite uno script al suo interno, denominato
Transformer, riprodurrà l’oggetto richiesto.
52
Figura 19: Rezzer
5. Delle pagine PHP attraverso le quali effettueremo l’invio e la
richiesta dei dati al Database.
6. Un Database, il quale conterrà i dati dei prim inviati.
53
4.2 Funzioni Utilizzate
Ogni elemento del sistema utilizza delle funzioni del Linden script
Language, ora visualizzeremo e analizzeremo le più importanti.
llDialog (key id, string message, list buttons, integer
chat_channel)
Questa funzione è utilizzata per ottenere l’interfaccia che guida
l’utente alle funzionalità del programma. Visualizza un menù
contenente dei tasti, a ogni tasto corrisponde un comando
predefinito, selezionandolo si esegue il comando.
llListen (integer channel, string name, key id, string msg)
Questa funzione è utilizzata per rimanere in ascolto su di un
canale prefissato, una volta ricevuto il messaggio su questo canale
possiamo utilizzare il messaggio ricevuto.
llListenControl (integer number, integer active)
Questa funzione è utilizzata per chiudere il canale di ascolto da
noi utilizzato, al fine di poterlo successivamente riutilizzare.
54
llSay (integer channel, string text)
Tramite questa funzione inviamo una stringa ad uno specifico
canale di comunicazione.
llGetPrimitiveParams (list params)
Tramite questa funzione, riusciamo ad ottenere i parametri che ci
occorrono dal prim che la esegue, i parametri da selezionare
vengono immessi nel campo params.
llSetPrimitiveParams (list rule)
Questa funzione svolge l’esatto contrario di quella precedente,
ossia, data una lista di parametri, trasforma in base ai dati ricevuti
il prim che la esegue.
llHTTPRequest (string url, list parameters, string body)
Grazie a questa funzione comunichiamo con un web-server
esterno a Second Life.
http_response (key request_id, integer status, list
metadata, string body)
55
Tramite questa funzione possiamo gestire i dati inviatici dal web-
server esterno.
llRezObject (string inventory, vector pos, vector vel,
rotation rot, integer param)
Questa funzione materializza un prim, prendendolo dall’inventario
dell’oggetto che la esegue.
llSetTimerEvent (float sec)
Utilizziamo questa funzione per innescare un altro metodo dopo
aver atteso per un certo numero di secondi.
56
4.3 Database impiegato
Il database utilizzato dal nostro sistema si chiama slBackup ed è
stato realizzato usando phpMyAdmin, uno strumento scritto in PHP
destinato a gestire l'amministrazione di MySQL sul Web.
Il DBMS24 con cui gestiamo il nostro DB25 è MYSQL.
La nostra base di dati è costituita da due tabelle:
• Object, questa tabella è utilizzata per memorizzare i nomi
degli eventuali progetti creati dal nostro sistema, e ad
assegnare ad ogni progetto uno specifico identificativo(ID).
Figura 20: Struttura della Tabella Object
• Storage, questa tabella contiene le caratteristiche di ogni
singolo prim, con
l’aggiunta di un ID per il singolo oggetto, ed eventualmente
l’identificativo del progetto di cui fa parte.
24 DBMS: Database Management System, ossia, sistemi per la gestione di basi di dati. 25 DB: abbreviazione per data base
57
Figura 21: Struttura Tabella Storage
Figura 22: Schema del Database slBackup
58
4.5 Funzionamento del sistema
Come menzionato nel primo paragrafo il sistema usa alcune
funzioni dell’LSL. Sono stati realizzati quindi degli script, per
permettere sia la raccolta delle informazioni riguardante i prim, e
l’invio di queste ad un web-server e conseguentemente al DB.
Ogni componente del sistema utilizza uno o più script.
Il satellite utilizza ben quattro script:
• Menù : questo script fornisce l’interfaccia con la quale
l’utente sceglierà le varie operazioni da eseguire.
• Ascolta : questo script rimane in ascolto su due canali di
conversazione, uno serve per raccogliere i dati che
successivamente invierà al web-server, l’altro per ottenere le
posizioni dei paletti ed inviare tale dato agli oggetti per
l’Area-Backup.
• SetProjectName : questo script rimane in ascolto su un
determinato canale, aspettando di ricevere il nome che verrà
assegnato ad un progetto, manda questo nome al web-server
59
che gli restituirà l’identificativo corrispondente a tale
progetto, ottenuto l’ID questo sarà inviato a tutti gli oggetti .
• MultiRezz : questo script rimane in ascolto su un determinato
canale, aspettando di ricevere il nome del progetto da
materializzare, una volta ottenuto questo dato, invia la
richiesta al web server per ottenere la lista degli oggetti che
compongono il progetto, ricevuta la richiesta, inizia a rezzare
i prim.
Oltre ad utilizzare quattro script, il satellite tiene al suo interno
anche due oggetti: il paletto ed il rezzer ; che a loro volta sono
forniti di script.
Paletto :
• AreaBackup: questo script viene utilizzato per la funzionalità
di Area-Backup, invia al satellite i dati riguardanti la sua
posizione, il quale la ritrasmetterà ai prim.
60
Rezzer :
• Transformer: questo script rimane in ascolto su un
determinato canale, in attesa dell’oggetto da rezzare.
Ottenuta questa informazione si trasforma nel prim richiesto,
eseguita la trasformazione chiude il canale di ascolto
rendendolo nuovamente utilizzabile.
Infine l’ultimo script, quello che andrà inserito in ogni oggetto che
vorremo memorizzare.
Generic Prim :
• SlBackupFinal: questo script gestisce i tre tipi di invio dei
parametri, quello singolo, lo Sfera-Backup e l’Area-Backup.
Per il primo tipo basta toccare il prim e questo invierà i dati
al satellite, per quanto riguarda gli altri due, lo script rimane
in ascolto su due canali, in base al canale su cui riceve un
messaggio effettua di conseguenza delle operazioni, e in
base al risultato invia o meno i dati al satellite.
61
Per quanto riguarda le pagine PHP che girano sul web-server, ne
sono state scritte quattro:
• storeProject : riceve il nome del progetto da memorizzare nel
database dallo script SetProjectName; effettua due query26,
una per memorizzare il nome del progetto, l’altra per
ottenere l’id corrispondente al dato appena inserito,
successivamente invia il dato ottenuto allo script.
• primStore : riceve dallo script Ascolta i dati da inserire nel
database, effettua la query di inserimento dei dati, se
l’inserimento è andato a buon fine restituisce un messaggio
di conferma, altrimenti uno di errore.
• returnProject : riceve dallo script MultiRezz il nome del
progetto da cercare, effettua una query al DB per ricercare
l’ID corrispondente al progetto selezionato, successivamente
effettua un’altra query per trovare tutti gli oggetti che hanno
lo stesso identificativo e che quindi fanno parte del
medesimo progetto.
26 Query: interrogazione di un database in modo da ottenere dei dati contenuti in uno o più database. Solitamente una query viene passata al DBMS in linguaggio SQL.
62
• getPrimParam : riceve dallo script Transformer il nome del
prim, effettua una query per prendere tutti i parametri relativi
all’oggetto, e li restituisce.
Figura 23: Schema riassuntivo di slBackup.
63
Figura 23-A: Schema Sfera-Backup. Selezionato il range di Azione il satellite invia
questa informazione ai prim, se questi si trovano nell’area di rilevamento inviano i
propri dati.
64
Figura 23-B: Schema Area-Backup. I paletti inviano la propria posizione al satellite,
il quale comunicherà questi dati ai prim in ascolto. Se gli oggetti si trovano
nell’area delimitata comunicheranno le proprie caratteristiche al Satellite.
65
5. USO DEL SISTEMA
Ora verrà descritto come usare correttamente slBackup.
Per un corretto funzionamento del sistema, oltre ad un client
Second Life, è necessario possedere un web-server con installata
un’istanza di phpMyAdmin per il database, e dove far risiedere le
nostre pagine PHP.
Entriamo in Second Life.
Figura 24: Schermata di Login di Second Life
66
Dopo aver effettuato con successo il login27 appariremo
nell’ultima zona da noi visitata, se è questa la location in cui
vogliamo lavorare possiamo cominciare, altrimenti ci
teletrasporteremo in un’altra zona.
Presa posizione nella parte di land che ci interessa possiamo
iniziare con il materializzare sul terreno l’entità principale del
nostro sistema ossia il satellite, in seguito inseriamo nei prim che
vorremo memorizzare lo script slBackupFinal.
Svolta anche questa operazione possiamo iniziare a utilizzare
slBackup, tocchiamo il satellite, apparirà dinanzi a noi un menù
con le funzionalità del sistema.
Figura 25: Menù Principale di slBackup
27 Login : procedura di accesso ad un sistema o un'applicazione informatica.
67
5.1 Modalità di backup
Le prime funzionalità che andremo a visionare saranno quelle di
backup, una volta fatta questa scelta, ci apparirà un sottomenù
che ci elenca i tipi di memorizzazione possibili.
Figura 26: Menù della modalità Backup.
68
5.1.1 Single-Backup
Selezionando SBackup accederemo alla modalità di Single-
Backup, questa funzionalità del sistema ci permette di
memorizzare un prim per volta, per far partire il processo di
backup basterà semplicemente toccare l’oggetto desiderato.
Figura 27: single-Backup
69
5.1.2 Area-Backup
Selezionando invece Area, accederemo alla modalità Area-Backup,
apparirà dinanzi a noi una nuova finestra che ci indicherà come
assegnare il nome ad un progetto.
Figura 28: Messaggio per la creazione del progetto
Attiveremo quindi la chat e scriveremo il nome del nostro progetto
sul canale 80, ad esempio per creare il progetto “scala” digiteremo
/80 scala.
Figura 29: Immissione del nome del progetto
Una volta assegnato il nome al nostro progetto possiamo
selezionare il tasto “continue”, dopo averlo fatto, appariranno
70
dinanzi al satellite due paletti, che useremo per delineare l’area
dentro la quale selezioneremo i prim da memorizzare.
Figura 30: Paletti per L’Area-Backup
Ora prendiamo i paletti e posizioniamoli in modo da formare un’
area ben definita, guardiamo la figura per capire meglio (le linee
gialle sono immaginarie), per far partire il processo di backup
tocchiamo prima il paletto A e poi quello B.
71
Figura 31: Area-Backup
72
5.1.3 Sfera-Backup
Selezionando Sfera, accederemo alla modalità Sfera-Backup,
anche in questo caso ci apparirà un messaggio che ci indica come
assegnare il nome al nostro progetto.
Figura 32: Messaggio per la creazione del progetto
Attiveremo quindi la chat e a scriveremo il nome del nostro
progetto sul canale 80, ad esempio per creare il progetto “sfera”
digiteremo /80 provaSfera.
Figura 33: Immissione del nome del progetto
Dopo aver digitato il nome del nostro progetto ci apparirà un altro
sottomenù attraverso il quale potremo selezionare il campo di
azione (range) del nostro Sfera-Backup.
73
Figura 34: Selezione del campo d’azione dello Sfera-Backup
Effettuata la nostra scelta, tutti gli oggetti in ascolto indicheranno
la propria posizione, se la loro distanza è minore o uguale al range
da noi selezionato, questi prim verranno memorizzati.
Figura 35: Sfera-Backup
74
5.2 Ricostruzione degli oggetti
Dopo aver visto le modalità di backup, ora vedremo il
funzionamento delle modalità di Rezzing, ossia di quelle di
ricostruzione degli oggetti. Selezionando Rezz ci apparirà questo
sottomenù.
Figura 36: Menù della modalità Rezz
75
5.2.1 SingleRezz
Premendo il tasto Single entreremo nella modalità SingleRezz,
effettuata questa scelta apparirà di fianco al satellite lo speciale
prim Rezzer.
Figura 37: Prim Rezzer
Apparirà anche a video un messaggio che ci indica il modo in cui
ricostruire il prim che vogliamo materializzare, ossia digitare sulla
chat /95 NomeOggetto. Attiviamo quindi la chat e inseriamo il
nome di un oggetto, ad esempio il cilindro usato nell’esempio
della modalità di Single-Backup, il suo nome era “cilindroz”.
Figura 38: Immissione del nome dell’oggetto da ricostruire.
76
Una volta digitato il nome del prim, il rezzer si trasformerà
nell’oggetto selezionato e si ubicherà nella medesima posizione
dell’oggetto di cui ha preso le sembianze (onde evitare che i due
oggetti si sovrapponessero l’originale è stato spostato).
77
Figure 39-40-41: Sequenza di Rezzing di un oggetto
78
5.2.2 ProjectRezz
Selezionando il tasto project entreremo nella modalità
ProjectRezz, anche in questo caso ci verrà suggerito tramite un
messaggio il modo in cui agire, per materializzare un progetto
dovremo aprire la chat e digitare /93 NomeProgetto. Per esibire le
caratteristiche di slBackup mostreremo il rezzing sia di un progetto
Area-Backup, sia di un progetto Sfera-Backup.
Digitiamo il nome del progetto scala.
Figura 42: Immissione nome progetto
Appena fatta questa operazione vedremo apparire un rezzer che si
andrà a trasformare in un prim, questo avverrà finché tutti gli
oggetti che compongono il progetto non saranno materializzati
(anche in queste immagini sposteremo l’oggetto base per evitare
sovrapposizioni).
79
Figura 43: Rezzing del progetto Scala
Figura 44: Risultato finale del rezzing del progetto Scala
Digitiamo ora il nome del progetto provaSfera
Figura 45: Immissione nome progetto
80
Figura 46: Rezzing del progetto provaSfera
Figura 47: Risultato Finale del rezzing del progetto provaSfera
81
6. SVILUPPI FUTURI E CONCLUSIONI
Attualmente slBackup ha qualche restrizione, il nostro sistema non
può memorizzare infatti né i prim linkati 28, né gli sculpted prim,
queste limitazioni sono dovute ad alcuni limiti tecnici del Linden
Script Language.
Il linguaggio di script non ci permette di prendere le
caratteristiche di tutto il gruppo di prim linkati, né tanto meno di
ricreare questi collegamenti.
Per quanto riguarda gli sculpted non è attualmente supportata la
loro materializzazione via script.
Linden Lab ha recentemente sviluppato, un nuovo motore di
esecuzione degli script, che utilizza Mono (l'implementazione
open source di Microsoft. NET Framework).
Il linguaggio di scripting LSL rimane lo stesso, ma l'utilizzo di
Mono fornisce le funzionalità per incrementare sensibilmente la
velocità di esecuzione.
Un ulteriore vantaggio di questo cambiamento è che qualsiasi
linguaggio che viene compilato attraverso il Mono Virtual Machine
può essere caricato ed eseguito in Second Life, quest’ ultimo dato
ci fa ben sperare per un miglioramento e ampliamento di questo
28 Linkati: collegati
82
linguaggio che si augura ovvierà alle limitazioni precedentemente
menzionate.
83
Conclusioni
Il grande successo che Second Life sta riscuotendo sta portando
molti professionisti informatici a pensare che esso rappresenti
addirittura l'evoluzione di internet che passa dal Web 2.0 al Web
3.0.
SL è comunque un framework abbastanza recente e non è chiaro
se manterrà questa leadership anche in futuro.
Infatti, sull'onda del grande successo di SL i competitor industriali
della Linden Labs propongono altre forme di "vita virtuale", quali
ad esempio, Google Lively o Home per PlayStation3 di Sony.
In ogni caso la "creatura" di Linden Labs continua la sua
evoluzione e il suo miglioramento, ed è molto vivo l'interesse dei
mass-media (anche non prettamente informatici) che analizzano i
vari aspetti di questo mondo virtuale capace di coinvolgere fino ad
oggi circa 15 milioni di utenti. Menzionando il rimpianto Lucio
Battisti...lo scopriremo solo vivendo".
84
RINGRAZIAMENTI
Giunto al termine di questo lavoro desidero ringraziare ed
esprimere la mia riconoscenza a tutte le persone che, in modi
diversi, mi sono state vicine e hanno permesso ed incoraggiato sia
i miei studi che la realizzazione e stesura di questa tesi.
Ringrazio la mia famiglia e gli amici che mi sono stati molto vicini
in tutti questi anni “da studente”, che oltre ad avermi sempre
“supportato” mi hanno più di tutto “sopportato”:
• Mia madre Grazia, e mia sorella Lucia, senza il loro aiuto non
avrei mai raggiunto questa meta. I miei due punti di
riferimento. Grazie per non avermi mai fatto mancare niente.
Vi sono davvero grato per tutto. Se sono diventato quello
che sono lo devo a voi. Mi auguro che tutti i sacrifici spesi
saranno, almeno in parte, ripagati.
• Mio padre Guglielmo, spero che da lassù tu mi possa
guardare e che tu sia orgoglioso di me.
• Il mio migliore amico Giuseppe, più che un amico un
fratello, anche lui lontano da questo mondo.
• La mia cara nonna Carolina, scomparsa anche lei, per il suo
affetto e la sua dolcezza.
85
• Mimmo e Bruna, per tutto l’affetto dimostratomi, siete per
me come un altro papà ed un’altra mamma.
• Il mio padrino Marcello che mi è sempre stato vicino nei
momenti di bisogno.
• Valentino e Paolo, due persone che ho la fortuna di chiamare
amici.
• Domenico, amico sempre presente.
• Simona, per essermi stata vicino nei momenti difficili.
• Tutti i ragazzi del “Catoju” per le belle esperienze vissute
fino a oggi.
• La mia “sorellina” Chiara, per la sua dolcezza ed il suo
infinito affetto.
• Flora, per la sua grande amicizia.
• Mirko, per le bellissime estati (e non solo) trascorse insieme.
• Franco, Ornella, Mauro, Savina e Nicola per i bei momenti
passati insieme.
• Fabio (Yoshimitsu), per il suo appoggio ed i suoi preziosi
insegnamenti.
• Noemi, che in quest’ ultimo e tribolato periodo mi ha sempre
spronato e incoraggiato.
86
• Tutti quelli del “Circolo il Delfino” per il loro affetto e per
considerarmi il loro “capo ultrà”.
• Tutti i compagni di università conosciuti durante questo
percorso accademico per i bei momenti vissuti insieme.
• I ragazzi della LAU (Lega Appartamenti Universitari) per tutte
le belle e avvincenti partite disputate.
• Francesco e Pietro, non solo coinquilini ma amici che mi
hanno sostenuto e incoraggiato durante questi ultimi mesi.
• Pasquale, coinquilino anche lui, anche se per poco tempo,
ma soprattutto un caro e affidabile amico.
• Tutta la comitiva di Salerno, per avermi fatto ambientare, e
per avermi aiutato a sopportare la nostalgia di casa.
I miei più sentiti ringraziamenti vanno a chi mi ha seguito durante
la redazione del lavoro di tesi:
• La professoressa Rita Francese per l’opportunità
concessami.
• Il Dottor Ignazio Passero, per la disponibilità e la pazienza
dimostrata nei miei confronti al fine di migliorare il mio
progetto.
87
• Luca Liscio e Marco Lettieri, sempre gentili e disponibili
nel darmi una mano.
• Il collega Fabio Parlato (detto Gianluca), e il già dottor
Emilio Spatola che mi hanno accompagnato ed aiutato
durante tutto il periodo di tesi.
• Antonella, per la compagnia, il sostegno e le caramelle
durante questi mesi in laboratorio.
Infine un grazie particolare alla Sony per aver realizzato il
“monolite nero” ossia la play station 2 che mi ha accompagnato in
tanti momenti del mio tempo libero. La Konami per le serie
Winning Eleven e Pro Evolution Soccer, e tutti i ragazzi dei forum
WE-LAB e CasaPes con cui ho lavorato al fine di realizzare patch
per questi titoli.
88
APPENDICE
A1. Requisiti di Sistema
Per potere utilizzare slBackup è necessario:
• Una connessione Internet a banda larga.
• Un client Second Life
• Una macchina Server su cui è installato phpMyAdmin con un
il database slBackuck.
• Una macchina Server su cui caricare le nostre pagine PHP.
Il client SL richiede i seguenti requisiti di sistema:
89
90
A2. Listati
A.2.1 Ascolta
key requestid; string msg="" ; integer flag = 0; default { state_entry (){ //rimane in ascolto sui canali 97 e 98 llListen ( 98, "" , NULL_KEY, "" ) ; llListen ( 97, "" , NULL_KEY, "" ) ; //impostiamo la variabile pre bloccare il timer llResetTime () ; } listen ( integer channel, string name, key id, string message ){ //se il canale su cui arriva il messaggio //è il 98 facciamo partire il timer //e dopo un tot numero di secondi //invia i dati al web-server if ( channel == 98){ // controllake il messaggio in arrivo n n sia vuoto if ( llToLower ( message ) != "" ){ //msg=""; llSetTimerEvent ( 5.0 ) ; llSay ( 0, "Recevied" ) ; msg += ( string ) message; } } //se il canale su cui arriva il messaggio //è il 97 inviamo i dati ricevuti sul canal e 111 if ( channel == 97){ if ( llToLower ( message ) != "" ){ llSay ( 0, "Recevied" ) ; flag ++; llSay ( 0,message ) ; msg += ( string ) message; if ( flag == 2){ llSay ( 111 , msg) ; llSay ( 0, msg) ; msg="" ; flag = 0; } } } } //scaduto il timer inviamo i dati al web-server timer (){ llSetTimerEvent ( 0) ; list MyList = llParseString2List ( msg, [ "&&" ] , []) ; integer length = llGetListLength ( MyList ) ;
91
integer i; for ( i = 0; i < length; i ++) { string mess = llList2String ( MyList, i ) ; //invamo il messaggio alla pagina php //la pagina memorizza i dati nel database requestid = llHTTPRequest ( "http://www.archimede.dmi.unisa.it/slc/slBackup/pri mStore.php" , [ HTTP_METHOD, "POST" , HTTP_MIMETYPE, "application/x-www-form-urlencoded" ] , "message=" +mess) ; //Dopo aver inviato i dati aspettiamo 1 secondo llSleep ( 1) ; } msg="" ; } //il server ci risponde con un messaggio http_response ( key request_id, integer status, list metadata, string body ){ if ( request_id == requestid ) llWhisper ( 0, "Web server said: " + body ) ; } }
92
A.2.2 Menù
integer CHANNEL = 90; // dialog channel vector position; string msg = "" ; list MENU_MAIN = [ "Backup" , "Rezz" ] ; //menù principale list MENU_BACKUP = [ "SBackup" , "Area" , "Sfera" , "...Back" ] ; //sottomenù backup list MENU_SFERA = [ "10 M" , "50 M" , "100 M" , "500 M" , "...Back" ] ; //sottomenù sfera list MENU_REZZ = [ "Single" , "Project" , "...Back" ] ; //sottomeù rezz list MENU_CONTINUE0 = [ "Continue" , "...Back" ] ; //sottomenù continue list MENU_CONTINUE1 = [ "continue" , "...Back" ] ; //sottomenù continue default { state_entry () { //rimaniamo in ascolto llListen ( CHANNEL, "" , NULL_KEY, "" ) ; } touch_start ( integer total_number ){ //quando tocchiamo il satellite ci apparirà //una finestra di dialogo con le opzioni da eseguir e llDialog ( llDetectedKey ( 0) , "What do you want to do?" , MENU_MAIN, CHANNEL) ; } listen ( integer channel, string name, key id, string message ){ //verifica che la scelta selezionata sia corretta if ( llListFindList ( MENU_MAIN + MENU_BACKUP + MENU_SFERA + MENU_REZZ + MENU_CONTINUE0 + MENU_CONTINUE1 , [ message ]) != -1 ){ llSay ( 0, name + " picked the option '" + message + "'." ) ; //Se selezioniamo Backup visualizzeremo il suo sott omenù if ( message == "Backup" ) llDialog ( id, "Select type of backup" , MENU_BACKUP, CHANNEL) ; if ( message == "SBackup" ){} //selezionando Area immetteremo il nome del progett o //digitando sulla chat /80(per scrivere sul canale 80) //in seguito appariranno i due paletti necessari pe r questo tipo di backup if ( message == "Area" ) llDialog ( id, "Digit /80 ProjectName to create a project" , MENU_CONTINUE1, CHANNEL) ; if ( message == "continue" ){ llRezObject ( "Paletto" , llGetPos () + <0, 3, 0>, ZERO_VECTOR, ZERO_ROTATION, 0) ; llRezObject ( "Paletto" , llGetPos () + <2, 3, 0>, ZERO_VECTOR, ZERO_ROTATION, 0) ; } //selezionando Sfera immetteremo il nome del proget to //digitando sulla chat /80(per scrivere sul canale 80) //ora sceglieremo il raggio d'azione del nostro bac kup
93
//10,50,100,500 metri, questo dato verrà inviato a tutti gli oggetti //sul canale 99 if ( message == "Sfera" ) llDialog ( id, "Digit /80 ProjectName to create a project" , MENU_CONTINUE0, CHANNEL) ; if ( message == "Continue" ) llDialog ( id, "Select the backup range" , MENU_SFERA, CHANNEL) ; if ( message == "10 M" ){ list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; position = llList2Vector ( paramsPS, 0) ; msg +="10" ; msg += "\n" +( string ) position; llSay ( 99, msg) ; msg = "" ; } else if ( message == "50 M" ){ list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; position = llList2Vector ( paramsPS, 0) ; msg +="50" ; msg += "\n" +( string ) position; llSay ( 99, msg) ; msg = "" ; } else if ( message == "100 M" ){ list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; position = llList2Vector ( paramsPS, 0) ; msg +="100" ; msg += "\n" +( string ) position; llSay ( 99, msg) ; msg = "" ; } else if ( message == "500 M" ){ list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; position = llList2Vector ( paramsPS, 0) ; msg +="500" ; msg += "\n" +( string ) position; llSay ( 99, msg) ; msg = "" ; } //Se selezioniamo Rezz visualizzeremo il suo sottom enù if ( message == "Rezz" ) llDialog ( id, "Select the type of Rezzing" , MENU_REZZ, CHANNEL) ; //Selezionando Single verra rezzato l'oggetto rezze r //Digitando /95(per scrivere sul canale 95) eil nom e dell'oggetto //rezzer si traformerà nel prim richiesto if ( message == "Single" ){
94
llSay ( 0, "Digit /95 ObjectName to rezz the object" ) ; llRezObject ( "Rezzer" , llGetPos () + <3, 3, 0>, ZERO_VECTOR, ZERO_ROTATION, 42) ; } //Selezionando Project //Digitiamo /93(per scrivere sul canale 95) e il no me del progetto //verranno rezzati tutti gli oggeti appartenenti al progetto else if ( message == "Project" ){ llSay ( 0, "Digit /93 ProjectName to rezz the project" ) ; } //ritorna al menù precedente else if ( message == "...Back" ) llDialog ( id, "What do you want to do?" , MENU_MAIN, CHANNEL) ; } else llSay ( 0, name + " picked invalid option '" + llToLower ( message ) + "'." ) ; } }
95
A.2.3 MultiRezz
key requestid; string msg="" ; default { state_entry (){ //rimane in ascolto sul canale 93 llListen ( 93, "" , NULL_KEY, "" ) ; } listen ( integer channel, string name, key id, string message ){ //controlla che il messaggio nn sia vuoto if ( llToLower ( message ) != "" ){ llSay ( 0, "Recevied" ) ; msg += ( string ) message; //invia il messaggio alla pagina phh che effettua //la query al database requestid = llHTTPRequest ( "http://www.archimede.dmi.unisa.it/slc/slBackup/ret urnProject.php" , [ HTTP_METHOD, "POST" , HTTP_MIMETYPE, "application/x-www-form-urlencoded" ] , "message=" +msg) ; msg="" ; } } //il server ritorna il messaggio con la lista degli elementi //contenut nel proggetto http_response ( key request_id, integer status, list metadata, string body ){ if ( request_id == requestid ){ //dal messaggio mi costruisco una lista //con tutti gli elementi del progetto list MyList = llParseString2List ( body, [ "\n" ] , []) ; integer length = llGetListLength ( MyList ) ; integer i; //prendo la lunghezza della lista e per ogni elemen to //faccio apparire un rezzer e gli passo il nome //dell'oggetto in cui si deve trasformare for ( i = 0; i < length; i ++){ string nome = llList2String ( MyList,i ) ; llRezObject ( "Rezzer" , llGetPos () + <3, 3, 0>, ZERO_VECTOR, ZERO_ROTATION, 42) ; llSay ( 95, nome) ; llSleep ( 2.5 ) ; } } } }
96
A.2.4 setProjectName
key requestid; string msg="" ; default { state_entry (){ //rimane in ascolto sul canale 80 llListen ( 80, "" , NULL_KEY, "" ) ; } listen ( integer channel, string name, key id, string message ){ //controlla che il messaggio nn sia vuoto if ( llToLower ( message ) != "" ){ llSay ( 0, "Recevied" ) ; msg += ( string ) message; //invia un messaggio alla pagina php //che memorizza il nome del progetto ne database requestid = llHTTPRequest ( "http://www.archimede.dmi.unisa.it/slc/slBackup/sto reProject.php" , [ HTTP_METHOD, "POST" , HTTP_MIMETYPE, "application/x-www-form-urlencoded" ] , "message=" +msg) ; msg="" ; } } //il server restituisce l'id corrispondente al prog etto http_response ( key request_id, integer status, list metadata, string body ){ if ( request_id == requestid ) //invia l'id agli oggetti in ascolto llSay ( 99, body ) ; llSay ( 111 , body ) ; //llSay(0, body); } }
97
A.2.5 AreaBackup
default { state_entry (){} // after the touch the objet send his params at the prim Ascolta touch_start ( integer total_number ){ string msg = "" ; vector position; list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; position = llList2Vector ( paramsPS, 0) ; msg += ( string ) position; msg+="\n" ; llSay ( 97, msg) ; msg="" ; } }
98
A.2.6 Transformer
key requestid; integer contrl; default { state_entry (){ //rimane in ascolto sul canale 95 //apro il canale di ascolto contrl = llListen ( 95, "" , NULL_KEY, "" ) ; llListenControl ( contrl, TRUE) ; } listen ( integer channel, string name, key id, string message ){ //controlla che il messaggio nn sia vuoto if ( llToLower ( message ) != "" ){ //Mostra a video il nome dell'oggeto ke sta per rez zare llSay ( 0, message ) ; //invia alla pagian phh il nome dell'oggetto da rez zare requestid = llHTTPRequest ( "http://www.archimede.dmi.unisa.it/slc/slBackup/get PrimParam.php" , [ HTTP_METHOD, "POST" , HTTP_MIMETYPE, "application/x-www-form-urlencoded" ] , "message=" +message ) ; } } //il server risponde inviando tutti i dati relativi all'invio del progetto http_response ( key request_id, integer status, list metadata, string body ){ if ( request_id == requestid ){ //parso la stringa in una lista in modo da poter se lezionare //i paremetri per rocostruire il prim list MyList = llParseString2List ( body, [ "!" ] , []) ; integer length = llGetListLength ( MyList ) ; integer i; for ( i = 0; i < length; ++i ) { if ( i == 0){ //materiale string mat = llList2String ( MyList, i ) ; llSetPrimitiveParams ([ PRIM_MATERIAL, ( integer ) mat ]) ; } if ( i == 1){ //posizione, se per ritardo non rappresento quella corretta //ripeto l'operazione string pos = llList2String ( MyList, i ) ; llSetPrimitiveParams ([ PRIM_POSITION, ( vector ) pos ]) ; vector mypos = llGetPos () ; if ( mypos != ( vector ) pos ){ llSetPrimitiveParams ([ PRIM_POSITION, ( vector ) pos ]) ; }
99
} if ( i == 2){ //dimensione dell'oggetto string dim = llList2String ( MyList, i ) ; llSetPrimitiveParams ([ PRIM_SIZE, ( vector ) dim ]) ; } if ( i == 3){ //altre caratteristiche dell'oggetto //indispensabili per riprodurlo correttamente string type = llList2String ( MyList, i ) ; if (( integer ) type == 0 || ( integer ) type == 1 || ( integer ) type == 2 ){ string hole = llList2String ( MyList, 4) ; string cut = llList2String ( MyList, 5) ; string hollow = llList2String ( MyList, 6) ; string twist = llList2String ( MyList, 7) ; string taper = llList2String ( MyList, 8) ; string topsh = llList2String ( MyList, 9) ; llSetPrimitiveParams ([ PRIM_TYPE, ( integer ) type , ( integer ) hole, ( vector ) cut, ( float ) hollow, ( vector ) twist, ( vector ) taper, ( vector ) topsh ]) ; } if (( integer ) type == 3 ){ string hole = llList2String ( MyList, 4) ; string cut = llList2String ( MyList, 5) ; string hollow = llList2String ( MyList, 6) ; string twist = llList2String ( MyList, 7) ; string taper = llList2String ( MyList, 8) ; llSetPrimitiveParams ([ PRIM_TYPE, ( integer ) type , ( integer ) hole, ( vector ) cut, ( float ) hollow, ( vector ) twist, ( vector ) taper ]) ; } if (( integer ) type == 4 || ( integer ) type == 5 || ( integer ) type == 6 ){ string hole = llList2String ( MyList, 4) ; string cut = llList2String ( MyList, 5) ; string hollow = llList2String ( MyList, 6) ; string twist = llList2String ( MyList, 7) ; string taper = llList2String ( MyList, 8) ; string topsh = llList2String ( MyList, 9) ; string profcut = llList2String ( MyList, 10) ; string toper2 = llList2String ( MyList, 11) ; string revol = llList2String ( MyList, 12) ; string radiusoff = llList2String ( MyList, 13) ; string skew = llList2String ( MyList, 14) ; llSetPrimitiveParams ([ PRIM_TYPE, ( integer ) type , ( integer ) hole, ( vector ) cut, ( float ) hollow, ( vector ) twist, ( vector ) taper, ( vector ) topsh, ( vector ) profcut, ( vector ) toper2, ( float ) revol, ( float ) radiusoff, ( float ) skew]) ; } } } //eseguita l'operazione chiudo il canale 95 llListenControl ( contrl, FALSE) ; } } }
100
A.2.7 slBackupFinal
//inizializzazione delle variabili key requestid; vector mypos; string msg = "" ; string projctid= "" ; integer tipo; integer material; vector position; vector size; string nome; default { state_entry (){ //l'oggetto rimane in ascolto sui canali 99 e 111 llListen ( 99, "" , NULL_KEY, "" ) ; llListen ( 111 , "" , NULL_KEY, "" ) ; } //dopo essere stato toccato, l'oggetto invia le pro prie //caratteristiche al server touch_start ( integer total_number ){ string msg = "" ; integer tipo; integer material; vector position; vector size; string nome; string projctid= "" ; //liste dei parametri list paramsTP = llGetPrimitiveParams ([ PRIM_TYPE]) ; list paramsMT = llGetPrimitiveParams ([ PRIM_MATERIAL]) ; list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; list paramsSZ = llGetPrimitiveParams ([ PRIM_SIZE]) ; material = llList2Integer ( paramsMT, 0) ; position = llList2Vector ( paramsPS, 0) ; size = llList2Vector ( paramsSZ, 0) ; nome = llGetObjectName () ; //costruzione del messaggio msg += ( string ) nome; msg += "\n" +( string ) projctid; msg += "\n" +( string ) material; msg += "\n" +( string ) position; msg += "\n" +( string ) size; msg += "\n" ; integer length = llGetListLength ( paramsTP ) ; integer i; for ( i = 0; i < length; ++i ) { if ( i == length -1 ){ string elem = llList2String ( paramsTP, i ) ; msg += ( string ) elem; } else { string elem = llList2String ( paramsTP, i ) ; msg += ( string ) elem+ "\n" ;
101
} } msg +="&&" ; //invio del messaggio llSay ( 98, msg ) ; msg= "" ; } listen ( integer channel, string name, key id, string message ){ //se il canale su cui arriva il messaggio //è il 99 esegue lo Sfera-Backup if ( channel == 99){ //controlla che il messaggio nn sia vuoto if ( llToLower ( message ) != "" ){ list MyList = llParseString2List ( message, [ "\n" ] , []) ; integer length = llGetListLength ( MyList ) ; //salva eventualmente il projectID if ( length == 1){ projctid = "" ; projctid = llList2String ( MyList, 0) ; //llSay(0,projctid); } //calcoliamo la distanza che separa l'oggetto //dal satellite, se questa è minore o uguale //a quella inviataci inviamo i dati else { string dist = llList2String ( MyList, 0) ; string pos = llList2String ( MyList, 1) ; list paramsTP = llGetPrimitiveParams ([ PRIM_TYPE]) ; list paramsMT = llGetPrimitiveParams ([ PRIM_MATERIAL]) ; list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; list paramsSZ = llGetPrimitiveParams ([ PRIM_SIZE]) ; mypos = llList2Vector ( paramsPS, 0) ; //calcolo della distanza e visualizzazzione float distance = llVecDist (( vector ) pos, ( vector ) mypos ) ; llSay ( 0, ( string ) distance ) ; if ( distance <= ( float ) dist ){ material = llList2Integer ( paramsMT, 0) ; position = llList2Vector ( paramsPS, 0) ; size = llList2Vector ( paramsSZ, 0) ; nome = llGetObjectName () ; msg += ( string ) nome; msg += "\n" +( string ) projctid; msg += "\n" +( string ) material; msg += "\n" +( string ) position; msg += "\n" +( string ) size; msg += "\n" ; integer length = llGetListLength ( paramsTP ) ; integer i; for ( i = 0; i < length; ++i ) { if ( i == length -1 ){ string elem = llList2String ( paramsTP, i ) ;
102
msg += ( string ) elem; } else { string elem = llList2String ( paramsTP, i ) ; msg += ( string ) elem+ "\n" ; } } msg +="&&" ; //invio dei dati llSay ( 98, msg ) ; msg= "" ; } } } } //se il canale di ascolto è il 111 //esegue l'Area-Backup if ( channel == 111 ){ //controlla che il messaggio nn sia vuoto if ( llToLower ( message ) != "" ){ list MyList = llParseString2List ( message, [ "\n" ] , []) ; integer length = llGetListLength ( MyList ) ; //salva eventualmente il projectID if ( length == 1){ projctid = "" ; projctid = llList2String ( MyList, 0) ; //llSay(0,projctid); } //riceviamo i dati relativi all'area //se l'oggetto si trova in quest'area //invia i suoi dati else { string vect1 = llList2String ( MyList, 0) ; string vect2 = llList2String ( MyList, 1) ; list paramsTP = llGetPrimitiveParams ([ PRIM_TYPE]) ; list paramsMT = llGetPrimitiveParams ([ PRIM_MATERIAL]) ; list paramsPS = llGetPrimitiveParams ([ PRIM_POSITION]) ; list paramsSZ = llGetPrimitiveParams ([ PRIM_SIZE]) ; mypos = llList2Vector ( paramsPS, 0) ; list data1 = llParseString2List (( string ) vect1, [ "<" , "," , ">" ] , []) ; list data2 = llParseString2List (( string ) vect2, [ "<" , "," , ">" ] , []) ; list data3 = llParseString2List (( string ) mypos, [ "<" , "," , ">" ] , []) ; string x1 = llList2String ( data1, 0) ; string x2 = llList2String ( data2, 0) ; string x3 = llList2String ( data3, 0) ; string y1 = llList2String ( data1, 1) ; string y2 = llList2String ( data2, 1) ;
103
string y3 = llList2String ( data3, 1) ; //controllo della posizione if ((( float ) x1 >= ( float ) x3 ) && (( float ) x2 <= ( float ) x3 ) && (( float ) y1 <= ( float ) y3 ) && (( float ) y2 >= ( float ) y3 )){ material = llList2Integer ( paramsMT, 0) ; position = llList2Vector ( paramsPS, 0) ; size = llList2Vector ( paramsSZ, 0) ; nome = llGetObjectName () ; msg += ( string ) nome; msg += "\n" +( string ) projctid; msg += "\n" +( string ) material; msg += "\n" +( string ) position; msg += "\n" +( string ) size; msg += "\n" ; integer length = llGetListLength ( paramsTP ) ; integer i; for ( i = 0; i < length; ++i ) { if ( i == length -1 ){ string elem = llList2String ( paramsTP, i ) ; msg += ( string ) elem; } else { string elem = llList2String ( paramsTP, i ) ; msg += ( string ) elem+ "\n" ; } } msg +="&&" ; //Invio del messaggio llSay ( 98, msg ) ; msg= "" ; } } } } } }
104
A.2.8 storeProject
<?php $headers = apache_request_headers(); //lo script invia il nome del progetto $message = $_POST["message"]; //connessione al database $id_link = @mysql_connect('localhost', 'isfrafel', 'scriptSL'); mysql_select_db("slbackup") or die("Selezione del database non riuscita"); /* Esecuzione della query SQL */ //inserisco nel database il nome del progetto mysql_query("INSERT INTO Objects (nome) VALUES ('$ message')"); echo mysql_error(); /*Esecuzione seconda query */ //prelevo l'id corrispondente al proggetto appena m emorizzato $risultato = mysql_query("SELECT ID FROM Objects W HERE nome = '$message'") or die("Query non valida: " . mysql_er ror()); if (mysql_num_rows($risultato) == 0) { echo "Nessuna riga trovata, niente da stamp are quindi si esce"; exit; } //invio l'id allo script while ($riga = mysql_fetch_assoc($risultato)) { echo $riga["ID"]; } mysql_free_result($risultato); mysql_close($id_link); ?> <?php
105
A.2.9 returnProject
<?php $headers = apache_request_headers(); //il nostro script invia il nome del progetto $message = $_POST["message"]; //connessione al database $id_link = @mysql_connect('localhost', 'isfrafel', 'scriptSL'); mysql_select_db("slbackup") or die("Selezione del database non riuscita"); echo mysql_error(); /*Esecuzione query */ //selezioniamo l'ID del progetto corrispondente al nome inviato $risultato = mysql_query("SELECT ID FROM Objects W HERE nome = '$message'") or die("Query non valida: " . mysql_er ror()); if (mysql_num_rows($risultato) == 0) { echo "Nessuna riga trovata, niente da stamp are quindi si esce"; exit; } $riga = mysql_fetch_assoc($risultato); $id = $riga["ID"]; /*Esecuzione query*/ //trovo tutti gli oggetti che hanno projectID ugual e a quella del progetto richiesto $oggetti = mysql_query("SELECT nome FROM Storage WH ERE projectID = '$id'") or die("Query non valida: " . mysql_error() ); //invio tutti gli oggetti trovati allo script while ($riga = mysql_fetch_assoc($oggetti)) { echo $riga["nome"]."\n"; } mysql_free_result($risultato); mysql_close($id_link); ?> <?php
106
A.2.10 primStore
<?php $headers = apache_request_headers(); //riceviamo la lista di valori dal nostro script //e la scomponiamo $message = explode("\n", $_POST["message"]); //variabile per stabilire la dimensione della lista $dimension = count($message); //connessione al database $id_link = @mysql_connect('localhost', 'isfrafel', 'scriptSL'); mysql_select_db("slbackup") or die("Selezione del database non riuscita"); /* Esecuzione della query SQL */ //in base al valore della variabile $dimension eseg uiamo una query diversa //per memorizzare i dati nel database if($dimension == 11){ mysql_query("INSERT INTO Storage (nome, projectID, material, position, size, type, holeshape, cut, hollow, twist, taper) VALUES ('{$message[0]}', '{$message[1]}', '{$messa ge[2]}', '{$message[3]}','{$message[4]}', '{$message[5]}', '{$message[6]}','{$message[7]}', '{$message[8]}','{$message[9]}', '{$message[10]}') "); } else if($dimension == 12){ mysql_query("INSERT INTO Storage (nome, projectID, material, position, size, type, holeshape, cut, hollow, twist, taper,to pshear) VALUES ('{$message[0]}', '{$message[1]}', '{$messa ge[2]}', '{$message[3]}','{$message[4]}', '{$message[5]}', '{$message[6]}','{$message[7]}', '{$message[8]}','{$message[9]}','{$message[10]}', '{$message[11]}')"); } else if($dimension == 17){ mysql_query("INSERT INTO Storage (nome, projectID, material, position, size, type, holeshape, cut, hollow, twist, taper, t opshear, profilecut, taper2, revolution, radiusof, skew) VALUES ('{$message[0]}', '{$message[1]}', '{$messa ge[2]}', '{$message[3]}','{$message[4]}', '{$message[5]}', '{$message[6]}','{$message[7]}', '{$message[8]}','{$message[9]}','{$message[10]}', '{$message[11]}', '{$message[12]}', '{$message[13]}', '{$message[14]} ','{$message[15]}', '{$message[16]}')"); } echo mysql_error(); echo "Data Stored"; mysql_close($id_link); ?> <?php
107
A.2.11 getPrimParams
<?php $headers = apache_request_headers(); //il nostro script ci invia il nome dell'oggetto $message = $_POST["message"]; //ci connettiamo al Database $id_link = @mysql_connect('localhost', 'isfrafel', 'scriptSL'); mysql_select_db("slbackup") or die("Selezione del database non riuscita"); /* Esecuzione della query SQL */ //in base al nome dell'oggetto selezioniamo i param etri che ci //occorrono per ricostruirlo $risultato = mysql_query("SELECT material,position , size, type, holeshape, cut, hollow, twist, taper, topshear, pro filecut, taper2, revolution, radiusof, skew FROM Storage WHERE nome = '$message'") or die("Query non valida: " . mysql_error()); if (mysql_num_rows($risultato) == 0) { echo "Nessuna riga trovata, niente da stamp are quindi si esce"; exit; } //inviamo i dati al nostro script //utilizzando il ! come separatore while ($riga = mysql_fetch_assoc($risultato)) { echo $riga["material"]."!"; echo $riga["position"]."!"; echo $riga["size"]."!"; echo $riga["type"]."!"; echo $riga["holeshape"]."!"; echo $riga["cut"]."!"; echo $riga["hollow"]."!"; echo $riga["twist"]."!"; echo $riga["taper"]."!"; echo $riga["topshear"]."!"; echo $riga["profilecut"]."!"; echo $riga["taper2"]."!"; echo $riga["revolution"]."!"; echo $riga["radiusof"]."!"; echo $riga["skew"]; } mysql_free_result($risultato); mysql_close($id_link); ?> <?php
108
BIBLIOGRAFIA
� Notizie generali su Second Life
o Che cosa è Second Life. SecondLife Magazine Italia.
[Rivista elettronica].
o Wikipedia, l’enciclopedia libera.
http://it.wikipedia.org/wiki/Second_Life
o Wikipedia, the free enciclopedia.
http://en.wikipedia.org/wiki/Second_life
o Second Life: Official site of the 3D online virtual world.
http://secondlife.com/
o Tangherlini, Mirco. Second life: guida pratica per una vita
virtuale. 2007. [Documento elettronico].
� Wings3D
o Wings3D Official site
http://www.wings3d.com/
o Wikipedia, the free enciclopedia.
http://en.wikipedia.org/wiki/Wings_3D
o Sculpted Prim with Wings3D
http://wiki.secondlife.com/wiki/Wings_3D
109
o Legacy:Wings3D unreal wiki
http://wiki.beyondunreal.com/Legacy:Wings3D
� Blender
o Blender Official site
http://www.blender.org/
o Wikipedia, l’enciclopedia libera.
http://it.wikipedia.org/wiki/Blender
o Wikipedia, the free enciclopedia.
http://en.wikipedia.org/wiki/Blender_(software)
o Manuale Blender.
http://wiki.blender.org/index.php/Manual.it/Manuale
� Building in SL
o Building in Second Life
http://www.slbuilding.com/
o Building
http://secondlife.regioneveneto.net/building
o Building / Land
http://www.secondlifeitalia.com/community/viewforum.ph
p?f=14
110
� Linden Script Language
o Wikipedia, the free enciclopedia.
http://en.wikipedia.org/wiki/Linden_Scripting_Language
o LSL Portal
http://wiki.secondlife.com/wiki/LSL_Portal
o LSL wiki Italia.
http://www.secondlifeitalia.com/wiki/Categoria:LSL
o LSL: Linden Script Language
http://rpgstats.com/wiki/index.php?title=Main_Page