Progettazione e Sviluppo Di Un Repository Di Oggetti SL

110
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

Transcript of Progettazione e Sviluppo Di Un Repository Di Oggetti SL

Page 1: 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

Page 2: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 3: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 4: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 5: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

5

A1. Requisiti di Sistema.......................................................... 88

A2. Listati.................................................................................... 90

BIBLIOGRAFIA ............................................................................ 108

Page 6: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 7: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 8: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 9: Progettazione e Sviluppo Di Un Repository 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.

Page 10: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 11: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 12: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

12

Vi sono due forme di accesso possibili: basic (gratuito) e

premium, cioè a pagamento (con il quale si ottengono svariati

vantaggi).

Page 13: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 14: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 15: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 16: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 .

Page 17: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 18: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 19: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 20: Progettazione e Sviluppo Di Un Repository Di Oggetti 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

Page 21: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 22: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 23: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 24: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 25: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 26: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 27: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 28: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 29: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 30: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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).

Page 31: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 32: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 33: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 34: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 35: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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/

Page 36: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 37: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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:

Page 38: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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,

Page 39: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 40: Progettazione e Sviluppo Di Un Repository Di Oggetti 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

Page 41: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 42: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 43: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 44: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 45: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 46: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 47: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 48: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

48

Figura 15: Oggetto completo

Page 49: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 50: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 51: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 52: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 53: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 54: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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)

Page 55: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 56: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 57: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

57

Figura 21: Struttura Tabella Storage

Figura 22: Schema del Database slBackup

Page 58: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 59: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 60: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 61: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 62: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 63: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 64: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 65: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 66: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 67: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 68: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 69: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 70: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 71: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

71

Figura 31: Area-Backup

Page 72: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 73: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 74: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 75: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 76: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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).

Page 77: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

77

Figure 39-40-41: Sequenza di Rezzing di un oggetto

Page 78: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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).

Page 79: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 80: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

80

Figura 46: Rezzing del progetto provaSfera

Figura 47: Risultato Finale del rezzing del progetto provaSfera

Page 81: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 82: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

82

linguaggio che si augura ovvierà alle limitazioni precedentemente

menzionate.

Page 83: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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".

Page 84: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 85: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 86: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 87: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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.

Page 88: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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:

Page 89: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

89

Page 90: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 ) ;

Page 91: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 ) ; } }

Page 92: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 93: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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" ){

Page 94: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 ) + "'." ) ; } }

Page 95: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 ) ; } } } }

Page 96: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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); } }

Page 97: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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="" ; } }

Page 98: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 ]) ; }

Page 99: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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) ; } } }

Page 100: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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" ;

Page 101: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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 ) ;

Page 102: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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) ;

Page 103: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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= "" ; } } } } } }

Page 104: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 105: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 106: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 107: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 108: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 109: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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

Page 110: Progettazione e Sviluppo Di Un Repository Di Oggetti SL

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