Premessa da civic71: l' autore di Ulitmate 3D è Christoph Peters ed il sito dove potete scaricare questa fantastica DLL è http://ultimate3D.org , lì ci troverete esempi , giochi , programmi ed un forum di discussione ( in inglese ). Questo manuale è una parte ( quella per novizzi ) relativo alla versione 2.1 di Ultimate3D e potrete trovare la sua versione originale ( in inglese ) scaricandovi il file SDK di Ultimate3D , presente nel sito ufficiale. Ultimate 3D è una DLL in continuo miglioramento è quindi possibile che le sue funzioni possano in futuro cambiare sia strutturalmente che solo nel loro nome.

Ma leggendo ed imparando le funzioni basilari riportate in questo manuale sarete in grado di capire anche quelle future.




Il fatto che state leggendo questo testo mi fa supporre che abbiate deciso di provare Ultimate 3D. Questa è una buona scelta. Se avete cercato di creare un gioco 3D con funzioni 3D di Game Maker , avrete notato che è incredibilmente difficile riuscirci e che avreste bisogno di un PC molto potente per visualizzarlo.

Questo perchè le funzioni 3D di Game Maker sono solo basilari. Quindi, se si desidera realizzare una grafica 3D complessa con Game Maker avrete bisogno di un' estensione ( la DLL ). Vi sono altre estensioni 3D per Game Maker , ma la maggior parte di queste sono piuttosto difficili da utilizzare.

Ecco perchè c'è Ultimate 3D. E' un tentativo di rendere facile l' estensione per la grafica 3D di Game Maker . Con versioni precedenti di Ultimate 3D (v. 1,0 a 1,31), si potrebbe fare della grafica 3D molto bella , ma non c'erano molte possibilità di realizzare degli effetti speciali e non abbastanza possibilità di ottimizzare quei giochi che utilizzano grandi livelli . Per questo motivo c'è voluto più di un anno a sviluppare la verione di Ultimate 3D 2,0. Ha tonnellate di nuove caratteristiche che le permettono di avere la capacità di compiere grandi effetti speciali e per costruire livelli giganti senza ottenere una cattiva performance. Ultimate 3D 2,1 aggiunge nuove funzioni per il rilevamento e risposta delle collisioni e molte altre piccole nuove funzionalità.

Dal momento che uno dei più elementari principi di Ultimate 3D è che è pensata per essere estremamente user-friendly, le istruzioni sono molto dettagliate. Esse si dividono in una parte per gli utenti inesperti ed una parte per gli utenti avanzati. Questa suddivisione è stata pensata per rendervi più facile imparare le funzioni di Ultimate 3D. Le caratteristiche descritte nella parte per gli utenti inesperti sono veramente facili da usare e vi daranno già la possibilità di fare bei giochi . Ma quando imparerete le caratteristiche descritte nella parte per gli utenti avanzati , sarete in grado di realizzare una grafica stupefacente . Utilizzando l' effetto shader ( ombre) in Ultimate 3D , è possibile creare molti effetti speciali avanzati . Anche le funzioni built-in , quali ad esempio il bump mapping e la parallax mapping ( parallasse di mappatura ) del terreno o il renderer sono davvero impressionanti, ma non difficili da usare.

Ma meglio vedrete voi stessi imparando e divertendovi nel fare giochi 3D .



Credits
Un ringraziamento particolare va a Matteo Unrath (Harkathmaker), che ha contribuito a migliorare la correttezza grammaticale del manuale di aiuto originale e di MysteriXYZ, che lo ha migliorato in termini di formattazione e di contenuto oltre aver scritto un bel epilogo. Voglio anche ringraziare tutti coloro che hanno contribuito a trovare errori in questo file di aiuto. Il tuo feedback continuo migliora la qualità della documentazione di Ultimate 3D.

Questa traduzione è stata realizzata tramite google e modificata da civic71.










MANUALE U3D v. 2.1 :

·Getting started ·

·Using primitive·

·Changing Enviro.·

·Adding light ·

·Using model obj.·

·Drawing 2D ·

·Miscellaneous·




Funzioni facili :


Getting started   ( Come iniziare)





The file it all begins with ( tutti i File iniziano con... )



Prima di poter iniziare ad utilizzare Ultimate 3D, avete bisogno di aver il programma Game Maker nel vostro pc ed i relativi file di lavoro ( gmd , gm6 , gmk , ecc..).

Puoi trovare l'utlima versione di GameMaker nel sito ufficiale : Yoyogames.com
Le versioni superiori alla 5.0 devono essere registrate per poter utilizzare file esterni quali le dll come Ultimate3D. La registrazione o versione PRO di Game Maker ha un costo che cambia di anno in anno. Fortunatamente Ultimate3D può essere utilizzata anche con la versione 5.0 di Game Maker, la quale non richiede alcuna tassa di registrazione per poter utilizzare Ultimate3D.dll .
Gm 5.0 non richiede installazione sul tuo pc .
Ricordati che è possibile tenere più versioni di Game Maker nel proprio computer.
Donwload gm 5.0 dal sito yoyo
Donwload gm 5.0 dal mio sito

E' ovvio che non è possibile utilizzare Ultimate 3D senza aver un file di lavoro che contenga gli script di base e gli oggetti che appartengono ad Ultimate 3D ( control, camera ,... ). Se avete visto la demo che viene fornito con Ultimate 3D è possibile che si desideri utilizzare questo come base per il vostro gioco , ma ve lo sconsiglio : se si vuole veramente creare il proprio gioco si dovrebbe sempre ripartire da zero.
Se si desidera modificate la demo in qualche modo per utilizzarla.

Si dovrebbe iniziare a fare il primo gioco con Ultimate 3D in una nuova cartella con una copia del file BasicGM5.gmd (risp. BasicGM6.gm6 o BasicGM7.gmk) . Questo può essere ottenuto dal Ultimate 3D Software Development Kit (SDK U3D) che possono essere scaricati a Ultimate3D.org. Questo file contiene tutto il necessario per iniziare ad utilizzare Ultimate 3D (a parte la conoscenza che è nel tutorial che state leggendo attualmente ). Al suo interno vi è un esempio d' istanza di ogni tipo di oggetto di Ultimate 3D , così come l' oggetto Control che è necessario per utilizzare Ultimate 3D. Le room contengono solo una combinazione di questi oggetti. Quando si incomincia un nuovo gioco, si dovrebbe eliminare ogni oggetto, ad eccezione dell' oggetto Control e della Telecamera.

Ci sono un paio di cose che si dovrebbero notare circa la room. Se si crea una nuova stanza ( room ) che deve essere utilizzata con Ultimate 3D, questa , deve soddisfare i seguenti requisiti:
-- La telecamera utilizza punti di vista ( le viste sono le view di una room ) ed il primo punto di vista è attivato.
-- Il colore di sfondo ( background ) è disattivato. Questo non è necessario ma è uno spreco di tempo di calcolo, se si lascia Game Maker trarre il colore di sfondo.
-- La room deve contenere esattamente un oggetto di Control ed uno della Telecamera.

Si raccomanda di creare due sotto-cartelle nella vostra cartella di progetto. La prima dovrebbe essere chiamata gfx e dovrebbe essere usata per il salvataggio delle texture ( le texture sono delle immagini che "avvolgeranno" gli oggetti 3D ). La seconda deve essere chiamata models ( modelli ) e penso sia chiaro che cosa possa contenere.



The view system ( La vista di sistema )

Con l' utilizzo della view di una room da parte di Ultimate3D , non sarà possibile visualizzare ciò che viene creato con il solo utilizzo di Game Maker . Ciò perchè non è possibile per 2 programmi diversi di visualizzare nella stessa view ( vista ) contemporaneamente.
Per questo motivo Ultimate 3D non ha solo funzioni di disegno 3D , bensì ci sono anche un paio di funzioni per disegnare la grafica 2D ed il testo. Inoltre, la prima view ( vista ) non ha bisogno di coprire l' intera finestra di Game Maker . è quindi possibile utilizzare più punti di view ( vista ) e fino a quando questi non coprono la view ( vista ) utilizzata da Ultimate 3D , non ci sarà alcun problema di utilizzo. Un'altra cosa è che non è possibile passare in modalità Full Screen ( schermo intero ), mentre utilizzate Ultimate 3D. Quindi, se si desidera utilizzare modalità Full Screen ( schermo intero ), si deve abilitare nel Game Maker opzioni o nella Ultimate3DOptions () script.


The camera object

( L' oggetto videocamera , telecamera o fotocamera )


Per impostazione predefinita, la Camera ( telecamera ) ha un pezzo di codice per il controllo del mouse nel suo evento step e di un paio di chiamate verso la funzione Move di Ultimate 3D negli eventi della tastiera ( se non ti piace , non esitare a rimuoverlo) . Date un'occhiata a questo :

Questa funzione sposta l'oggetto nello spazio 3D.

Move ( Longitude, Latitude, Speed )
Sposta ( Longitudine, Latitudine, Velocità )




Longitude, Latitude ( Longitudine, latitudine )
Questi due parametri descrivono la direction ( direzione ) dell'oggetto in movimento. Funziona allo stesso modo come su di un globo. Longitudine descrive quanto l' oggetto si muove in alto o in basso. 0 significa che non cambia la sua altezza, 90 significa che si muove diritta verso il basso e -90 significa che si muove dritto. Latitudine ha pronunciato la direction ( direzione ) orizzontale in cui l' oggetto si muove . Noti che questa non coincide con la variabile direction ( direzione ) di Game Maker. Per convertire un valore di direction ( direzione ) Game Maker in un valore di latitudine a Ultimate 3D senza cambiare direction ( direzione ) , dovete utilizzare questa piccola formula : Latitudine = direction+90 ( direzione+90 ) .



Speed ( Velocità )
Questo parametro indica la velocità con cui l' oggetto si sposterà . Notate che dovete chiamare la funzione in ogni Step per visualizzare il movimento dell' oggetto , grazie a questa velocità.



Da ora in poi ogni funzione che ha parametri saranno descritti così. Se si vuole leggere le informazioni di programmazione è possibile aprire il relativo script . Ogni script contiene una breve descrizione della funzione e dei suoi parametri.

A proposito, avrete notato che la funzione Move (...) è scritta con una lettera maiuscola come lo sono tutte le altre funzioni di Ultimate 3D. Questo ha un paio di motivi. La prima è che ho utilizzato per funzioni di chiamata come questo dal C + +. La seconda è che in questo modo si può verificare facilmente se una funzione appartiene alla Game Maker o ad Ultimate 3D . Se non c'era questa differenza non ci sarebbe stato un prefisso. Quindi Move non sarebbero chiamato Move ma u3d_move. A mio parere è molto più semplice premere il tasto delle maiuscole anzichè scrivere u3d_ ... . Inoltre, il suo aspetto migliora.

Ma torniamo al tema ... Camera ( telecamera ) . Ultimate 3D in ogni oggetto 3D nella scena deve essere rappresentato da un' istanza di un oggetto Game Maker. è quindi possibile modificare le proprietà degli oggetti di scena semplicemente cambiando le variabili di Game Maker nei loro oggetti (objects) . Un ultima funzione 3D come ad esempio MoveCamera () trasmetterà ad Ultimate 3D automaticamente. Le variabili di settaggio dell' object Camera ( telecamera ) sono le seguenti variabili :

x, y, z
Queste variabili danno la posizione della Camera ( telecamera ) . Visto che siamo nello spazio 3D ora non ci sono solo x e y , ma ora esiste anche un nuovo amico chiamato z. Esso definisce l' altezza dell' oggetto. Quindi, se si aumenta z l' oggetto si sposta verso l' alto , se si diminuisce l' oggetto si sposta verso il basso. La combinazione di X, Y e Z è chiamata coordinate. Si dovrebbe ricordare questa parola. .


height
( altezza )
Nei giochi in prima persona di solito la Camera ( telecamera ) ha una particolare altezza sopra il livello del suolo. Questa altezza può essere implementata usando questa variabile. L' effettiva coordinata di z della Camera ( telecamera ) ( quello Ultimate 3D con opere ) non è z ma z + height.

rotx, roty, rotz
Queste variabili danno la rotazione della Camera ( telecamera ) . In breve rotx descrive il pitch ( passo) dell' oggetto, roty descrive la yaw ( imbardata ) e rotz descrive il roll ( rotola ). Una descrizione più dettagliata di ciò che significano queste variabili è dato nella seconda parte del tutorial "Utilizzo di oggetti primitivi".

view ( vista )
Questa variabile definisce il doppio angolo verticale di vista della Camera ( telecamera ) . Come con qualsiasi angolo in Ultimate 3D essa deve essere in gradi.

min_range, max_range
Con la Camera ( telecamera ) verranno visualizzati solo gli oggetti che sono più distanti rispetto min_range e più vicini rispetto max_range. Tutti gli altri oggetti saranno invisibili. Si dovrebbero usare valori ragionevoli per queste variabili. Min_range se è troppo piccolo o troppo grande max_range potreste ottenere strani errori di visualizzazione. Oggetti possono coprire altri oggetti che sono davanti a loro.

falling, falling_speed (optional) ( in calo, in calo_speed (opzionale) )
Se falling è pari alla coordinata z della Camera ( telecamera ) verrà aumentato di falling_speed in ogni step e falling_speed sarà diminuito del global.gravitation (diminuendo voglio dire che ogni step falling_speed diventerà più piccolo. Se la speed ( velocità) è negativa sarà basso, se invece la speed (velocità) è positivo sarà alto). Queste variabili sono destinate ad essere utilizzate in combinazione con le principali funzioni di collisione CollisionH (), CollisionV (), CollisionZ () e CollisionTerrainModel ().



follow, perspective, rotatex, rotatey, distance (optional)
( seguire, prospettiva, rotazionex, rotazioney, distanza (opzionale))
follow può essere impostato per l' ID di un oggetto Game Maker affinchè la Camera ( telecamera ) lo insegua. L' oggetto seguito può contenere un valore per la variabile altezza affinchè la Camera ( telecamera ) segua un punto sopra o al di sotto della reale posizione dell'oggetto. Perspective ( prospettiva ) definisce il modo in cui la Camera ( telecamera ) seguirà l'oggetto. Può essere 0 per uno inerziale Camera ( telecamera ) sul terreno, 1 a tempo determinato per una terza persona Camera o 2 per una terza persona flessibile Camera . Se Perspective ( prospettiva ) è di 1 o 2 è possibile modificare rotatex e rotatey nel dare una rotazione offset. Distance ( distanza ) definisce in che misura la Camera soggiorni dall' oggetto che consegue.



Finora questo è tutto quello che dovete sapere sulla Camera ( telecamera ) .
In realtà ci sono un paio di variabili e funzioni in più per la Camera ( telecamera ) , ma queste sono descritte nel tutorial per gli utenti avanzati.

Così ora sapete come creare una Camera ( telecamera ) . Purtroppo non c'è nulla che vi mostrerà finora (almeno se si ha ripulito la room).
Ma non preoccupatevi, che cambierà ciò molto presto.



Loading textures ( Caricamento delle textures )
Prima di arrivare a creare il primo oggetto visibile c'è una cosa che dovete sapere sul caricamento delle textures. Per coloro che non le conoscono, ecco una breve spiegazione di ciò che è una texture : è una texture (di solito) un' immagine bidimensionale che viene creata da un' applicazione per grafica 3D. Quindi questa immagine può essere applicata ad un object (oggetto ).
Senza texture tutti gli objects ( oggetti ) in grafica 3D sarebbero costituiti da un solo colore e quindi davvero noiosi. Per questo motivo è molto importante avere buone texture. Fanno vedere i vostri giochi molto più realistici.

Per caricare una texture avete bisogno solo di una funzione molto semplice:

LoadTexture( TextureFile, TextureIndex, Width, Height ) ;
LoadTexture ( TextureFile, TextureIndex, Larghezza, altezza );




TextureFile
Dal momento che Ultimate 3D non può accedere alle risorse di Game Maker, la texture deve essere salvata in un file esterno. Questo file può essere un BMP, JPG, TGA, png, DDS, ppm o dib file (NON gif). Raccomando di salvare le texture in una sotto cartella chiamata gfx. Ma se si desidera nascondere le proprie texture da persone che giocano al tuo gioco è anche possibile allegare al tuo eseguibile di Game Maker's file di dati o tra suo meccanismo e caricarli dalla sua directory temporanea.

TextureIndex
L' indice della texture è associata ad essa . Può essere un numero arbitrario nella gamma dallo 0 a 998. Un indice è simile ad un documento d' identità. Quando si desidera utilizzare la texture , dovete conoscere l' indice ad essa associata. Per esempio un' ipotetica textura "erba.jpg" la potreste assegnare ad un numero per esempio 10 e quando questa la richiamerete per associarla ad un object (oggetto) sarà sufficente scrivere texure=10;

Width, Height ( Larghezza, altezza )
Di solito si può semplicemente ignorare questi due parametri. Se si immette 0 o niente per ciascuno di essi, Ultimate 3D setterà l' altezza e la larghezza del texture dal file. Ma se si immette valori che differiscono dalle dimensioni reali della texture verrà scalata a queste dimensioni. Nota che solo poteri di 2 o 0 può essere passato per tali parametri. Per ulteriori informazioni leggere qui sotto.



C'è una cosa importante che dovete sapere sulle texture. La maggior parte delle schede grafiche funzionano solo con texture le cui dimensioni hanno costituito dei poteri di 2. Inoltre, alcune schede grafiche possono funzionare solo con texture quadrate, ma questo è un caso raro. In ogni modo, la tua texture verrà scalata fino a che non hanno le dimensioni costituite da due poteri, così da renderli in valide dimensioni. Per evitare questo inutile perdita di qualità si dovrebbero utilizzare queste dimensioni da tutte le vostre texture . Alcuni esempi validi di dimensioni sono 256 * 256, 128 * 512 e 1024 * 64. Una texture con una dimensione di 257 * 257 otterrebbe in scala fino a 512 * 512 e questo è un vero e proprio spreco di memoria.

Un'altra cosa che dovete sapere è come rendere trasparenti le texture. Ci sono due modi per farlo. Il migliore è quello di utilizzare un formato di file che supporta la trasparenza come tga o png. The Gimp (GNU Image Manipulation Program) supporta questi formati di file. E' un grande open source software di modifica delle immagini. Se si preferisce usare altri formati di file si può comunque ottenere la trasparenza utilizzando semplicemente il colore : r = 0 , g = 128, b = 64; Tutti i pixel che hanno esattamente questo colore verranno impostati come trasparenti in Ultimate 3D.

Raccomando di caricare ( loading ) tutte le textures nell' evento create dell' object Control. In questo modo potrete avere una lista completa di tutte le texture caricate ed il loro relativo indice.Ciò però resta una vostra scelta .
Eccovi un semplice esempio di come viene caricata la textura ed il numero 1 assegnatogli come TextureIndex .


LoadTexture ( "gfx/WallTexture.png ", 1 );






Using primitive objects ( Utilizzando oggetti primitivi )





I concetti alla base degli oggetti primitivi (in breve, primitive) è per darvi la possibilità di creare facilmente semplici scene. Grandi quantità di primitive possono anche essere visualizzati in molto efficiente. La definizione di un oggetto in Ultimate3D funziona nel seguente modo. Come ho già detto, ogni oggetto in Ultimate3D deve essere rappresentato da un' istanza di un object in Game Maker. Quindi prima si deve creare un nuovo object (oggetto) , poi gli aggiungerete un paio di variabili ed infine si richiama la funzione che passa i valori delle variabili ad Ultimate3D . Ora iniziamo il primo object (oggetto) visibile.



Wall objects ( oggetti della parete )
Un object (oggetto) muro è totalmente pianeggiante e orientato verticalmente. Prima di crearlo dovete impostare le seguenti variabili nel create dell' object in Game-maker :

height ( altezza )
Questa variabile indica l'altezza del muro.

x2, y2
Queste due variabili indicano il punto in cui il muro va partendo dalla sua e x-y-posizione.
Il seguente grafico illustra questo:







texture
è necessario impostare questa variabile su uno degli indici di una texture assegnato tramite la funzione LoadTexture (...). Questa texture verrà quindi utilizzata per il muro. Se non si desidera utilizzare una texture è possibile impostare questa variabile a -1.

texx1, texy1, texx2, texy2 (opzionale)
Queste variabili sono facoltative. Se non si impostano queste variabili , tutta la texture verrà utilizzata. Essi definiscono 2 cosiddette coordinate texture. La texture coordinate x = 0 e y = 0 ( in breve (0 | 0) ) si riferiscono alla parte superiore sinistra di una texture. La texture coordinate (0,5 | 0,5) si riferiscono al centro di un texture , la texture coordinate (0 | 1) al basso a sinistra di una texture, la texture coordinate (1 | 1) al basso a destra, e così via.
La wall obiect (oggetto parete) utilizza la parte della texture che si trova tra le due coordinate texture rese. La texture coordinate può anche essere fatta di valori più grandi di 1.
Poi la texture sarà avvolta [ la stessa di tiling ( piastrelle ), ma anche per le textures ].



Ci sono altre due variabili, ma per ora non vi serviranno. Floor ( cubo piano ) e primitives ne hanno altre e sono descritte nel tutorial Adding lights ( aggiunta di luci) .

Ora conosci tutte le variabili da richiamare una volta sola per il CreateWall () . Questa funzione non ha parametri ma ha tutte le informazioni dalle variabili. Tuttavia, dovete mettere Step () nel event step dell' object e Destroy () nel suo event destroy ( evento di distruzione ) .
Nessuno di essi richiede dei parametri.
Destroy () deve essere messo nell' event destroy ( evento di distruzione ) perchè altrimenti Ultimate3D non saprebbe quando l' oggetto deve essere distrutto . Infatti nel caso non fosse inserito , l' oggetto continuerebbe ad essere visualizzato nello schermo anche nel caso si cambiasse room.

Che cosa serve Step() è il tema della prossima parte di questo tutorial.





Transforming primitives

( Trasformare i primitive : cubi , rettangoli .. )


Per trasformare qualcosa intendiamo cambiare il suo orientamento. Se si prende un object (oggetto) e lo si sposta in giro, ciò è una trasformazione. Se ruoti l' object ciò è una trasformazione. C'è una trasformazione dello scaling ( cambiare le dimensioni di un object ) . Un object (oggetto) può essere scalato sulle tre assi ( x,y,z). Tutti questi processi sono chiamati trasformazioni. Quindi la cosa da ricordare è che una trasformazione è la combinazione di scaling ( la modifica della dimensione), rotation ( rotazione ) e di translation ( in movimento).

E ora di trasformare i primitives. Dovreste sapere come effettuare questa operazione, perchè avete già trasformato un altro objetc ( se avete letto le istruzioni dal principio) : l' object Camera ( telecamera ). Come l' object Camera ( telecamera ) , ogni primitivo ha le variabili x, y, z, rotx, roty e rotz. Inoltre, essi hanno scalx, scaly, scalz. Dal momento che la spiegazione del significato del rotx, roty e rotz non è stato precisato nel tutorial dell'object Camera (telecamera) , ecco qui sotto una più dettagliata ... ed una descrizione delle scalx, scaly e scalz :

rotx, roty, rotz
Come ho già detto nel tutorial sull' objects Camera ( telecamera ) , la variabile rotx dà il pitc di rotazione dell' oggetto, la variabile roty ha pronunciato la rotazione di yaw e la variabile rotz dà il roll di rotazione. Il seguente grafico illustra questo.




Aumentando la rotx ( pitc ) ruoterete la parte anteriore dell'oggetto, riducendo sarà l'opposto. La rotazione di yaw (roty) ruota l'oggetto senza cambiare le coordinate z dei punti dell'oggetto. Infine c'è il roll di rotazione. Credo che non c'è molto da dire su questo. Nota che la rotazione roll viene applicata per prima , poi segue la rotazione pitc ed infine viene applicata la rotazione yaw .
Un breve commento su questo: Se avete letto con attenzione, avrete notato che roty ruota attorno all' asse z ( z-axis ) e rotz ruota intorno alla y. Questa piccola incoerenza è un retaggio della prima versione di Ultimate3D. Queste variabili sono chiamate secondo il sistema di coordinate che è utilizzato internamente da Ultimate3D. Non è necessario preoccuparsi di ciò , solo tenere presente che roty ruota attorno all'asse z e rotz ruota intorno al y.

scalx, scaly, scalz
Il concetto di scala è abbastanza facile da capire. Un valore di uno degli scaling non cambia nulla, un valore di due significa che tutto diventa due volte più grande, ed un valore di 0,5 significa che tutto diventa la metà delle dimensioni. Di solito non si utilizza valori negativi di scaling . L'unica cosa che rimane da spiegare è il motivo per cui ci sono tre valori di scala. Questo perchè avete la possibilità di scalare l' oggetto in modi diversi lungo le tre assi del sistema di coordinate 3D. Ma nella maggior parte dei casi si desidera scalare sempre l' intero object (oggetto) , inserendo lo stesso valore per tutti e tre i valori di scaling. Si noti che la scalatura è fatta prima della rotazione.

Un'altra cosa che non dovete mai dimenticare è che ogni oggetto di Ultimate3D deve contenere la chiamata Step() all'interno del suo step event. In caso contrario, la modifica delle variabili non ne pregiudica la trasformazione del modello!





Floor objects ( oggeti piani : per esempio un pavimento)

Gli floor objects (oggetti piani) non hanno un' espansione lungo l' asse z , il che significa che sono totalmente piatti ed orizzontali. Le variabili da inserire nell' event create di un object Floor sono i seguenti :

width ( larghezza ) : descrive l' espansione dell' object floor (oggetto piano) lungo la asse x ;

height
( altezza ) : è l' espansione lungo l' asse y.



texture
Indice della textura che deve essere utilizzata per questo object ( oggetto) oppure -1 per nessuna. Per una descrizione più dettagliata date un'occhiata al testo sugli wall objects (oggeti della parete).

texx1, texy1, texx2, texy2 (opzionale)
La parte della texture che deve essere utilizzata. Per una descrizione più dettagliata date un'occhiata al testo sugli wall objects (oggeti della parete).



Come si può vedere non ci sono molti cambiamenti rispetto agli wall objects (oggeti della parete).
Anche in questo caso ci sono due variabili supplementari che verranno introdotte nel tutorial sulle light sources ( fonti di luce). Dopo la creazione di queste variabili dovete chiamare CreateFloor () per inizializzare l' object Floor ( oggetto piano ) . E come al solito avete bisogno di Step() e Destroy () nel corrispondente eventi.




Cube objects ( oggetti Cubo).

Gli oggetti Cubo sono un pò più complessi degli object Floor e Wall , ma possono essere utilizzati per cose piuttosto belle. Nel vecchio demo di Ultimate 3D v. 1,31 tutti gli edifici erano costituite da semplici cubi. Come con gli altri primitives , dovete impostare una qualche variabile prima di poter creare un cubo. Ecco un elenco di esse :


width, height, depth2 ( larghezza, altezza, profondità )
Le dimensioni del cubo ( width ) è l' espansione lungo l'asse x, depth2 ( profondità 2 ) dà l' espansione lungo l'asse y , height ( altezza ) è l'espansione lungo l' asse z. Depth2 è chiamato appunto"depth2" anzichè semplicemente depth ( profondità ), perchè tale variabile di profondità è già utilizzata da Game Maker.


texx1, texy1, texz1, texx2, texy2, texz2 (opzionale)
La parte della texture che deve essere utilizzata. Per una descrizione più dettagliata di questi parametri dai un'occhiata al testo sugli wall objects (oggetti della parete). Dal momento che gli objects (oggetti ) sono cubi tridimensionali , mentre le pareti sono due dimensionali, l' objects (oggetti) cubo hanno tre parametri ovvero hanno anche texz1 e texz2.

texture
Indice della texture che deve essere utilizzato per questo oggetto o -1 per nessuna. Per una descrizione più dettagliata dai un'occhiata al testo sugli wall objects (oggetti della parete).

subdivide_texture (opzionale)
Come tutti sanno un cubo ha sei lati. Se si imposta questa variabile a false (falso) tutti i lati utilizzeranno la stessa parte della texture. Se si imposta al true (vero) la textura sarà suddivisa in sei parti e ogni lato del cubo utilizzerà una parte diversa della textura.
Il grafico seguente illustra come funziona.




Dispart_texture quando è false , l'intera texture viene visualizzata su ogni lato. Quando è true ( vero ), ogni lato mostra solo una parte.

originx, originy, originz (opzionale)
Queste variabili di solito prendono valori nella gamma da 0 a 1. Esse definiscono l' origine centrale del cubo. Ad esempio, immettendo 0,5 per tutti i capi significherebbe che l'origine del cubo si trova esattamente nel mezzo. Inserire i valori corretti per queste variabili è molto importante, specialmente quando si ruota il cubo. Il grafico seguente illustra come funziona:






Dopo la creazione di queste variabili dovete chiamare CreateCube () una volta per inizializzare l' oggetto cubo . E come al solito avete bisogno di Step() e Destroy () nei corrispondenti eventi.



Billboard objects ( oggetti Cartellone ).

Gli Billboard (cartelloni ) differiscono un po' da tutti gli altri oggetti 3D. Il motivo è semplice : non sono realmente in 3D. Accade spesso che è necessaria per oggetti particolari un' estrema geometria complessa portando ad un eccessivo calcolo da parte del PC . Gli alberi sono il miglior esempio. Per evitare questa complessa geometria è possibile utilizzare dei Billboard (cartelloni). Nei vecchi giochi che spesso vediamo con degli alberi , sono in 2D, mentre tutto il resto è in 3D. Questo è ciò che sono i Billboard (cartelloni ) , ovvero oggetti 2D in uno spazio 3D. Essi sono fissati ad un punto nello spazio 3D e le loro dimensioni sullo schermo cambiano a seconda della distanza dell' object Camera ( telecamera ).

In ogni modo, la creazione dei Billboard (cartelloni) non è difficile come la creazione di altri oggetti primitivi.
Qui sotto ci sono le loro variabili da inserire nell' evento create di un object in game-maker :


width, height
( larghezza, altezza )
Le dimensioni del cartellone.

originx, originy
Queste variabili definiscono l' origine del cartellone. L'origine è il punto del cartellone che non cambia la sua posizione nello spazio 3D quando l' object Camera ( telecamera ) ruota. Di solito è da qualche parte nel mezzo del cartellone. In linea di principio funziona allo stesso modo in cui le variabili originx / Y / Z sugli cube objects (oggeti del cubo).
Date una occhiata alla descrizione di quest' utlimi.

texture
Indice della texture che deve essere utilizzata per questo oggetto o -1 per nessuna. Per una descrizione più dettagliata date un'occhiata al testo sugli wall objects (oggeti della parete).


texx1, texy1, texx2, texy2 (opzionale)
La parte della texture che deve essere utilizzata. Per una descrizione più dettagliata date un' occhiata al testo sugli wall objects (oggeti della parete).



Dopo la creazione di queste variabili dovete chiamare Create2D ( ) una volta , per inizializzare l' object Billboard (cartellone).
E come al solito avete bisogno di Step() e Destroy () nei corrispondenti eventi.






Polygon objects ( oggetti poligonali ).

Nella parte di questa documentazione per gli utenti avanzati (advanced), troverete che modelli arbitrari possono essere trattati come primitive. Ma attualmente non puoi sapere la complessità degli oggetti primitivi , quali gli Polygon objects ( oggetti poligonali ). Prima di dirvi ciò che è un Polygon objects ( oggetti poligonali ) , vi spiegherò ciò che il termine vertice significa . Un vertice è un punto nello spazio 3D, con una texture coordinata, che è parte di un oggetto 3D. Un triangolo è sempre costituito da tre vertici e ogni oggetto 3D è composto da un paio di triangoli. Così si potrebbe chiamare vertici la più piccola unità degli oggetti 3D.

I poligoni non si ottengono definendo un paio di variabili. Invece di chiamare tre funzioni. Avete bisogno di un' istanza di un object (oggetto) per ogni Polygon objects ( oggetti poligonali ) . La prima funzione che dovete richiamare è BeginPolygon (...). Questa "dice" ad Ultimate3D che si desidera creare un Polygon object ( oggetto poligonale ) e prepara il tutto.
Ecco la descrizione della funzione:

BeginPolygon ( VertexNumber );




VertexNumber
( numero dei vertici )
Il numero di vertici che avrà il polygon objects che desideri creare. Il valore di questa variabile dovrebbe essere sempre più grande oppure uguale a tre, altrimenti non sarà possibile ottenere un vero e proprio poligono.


Dopo aver chiamato BeginPolygon (...) dovete AddVertex (...) chiamata più volte a seconda del valore inserito nel BeginPolygon (...). Ecco la descrizione di AddVertex (...) :

AddVertex ( X, Y, Z, U, V ) ;

X, Y, Z
La posizione del vertice. Si noti che questa posizione viene trasformata a seconda dei valori che hanno costituito per x, y, z , scalx / Y / Z e rotx / Y / Z. Così la posizione è determinata nell' oggetto spazio.

U, V
La coordinata della texture del vertice. Per ottenere una descrizione dettagliata di ciò che è una texture e le coordinate , date un'occhiata alla descrizione delle variabili texx1 e texy1 sugli wall objects (oggeti della parete).



Quando hai chiamato AddVertex (...) abbastanza spesso è possibile chiamare CreatePolygon () per creare l' oggetto poligono. Come per ogni altro oggetto primitivo, ha la variabile texture e la variabile transformation ( trasformazione ) , per maggiori informazioni date un'occhiata alla descrizione sugli wall objects (oggeti della parete) ed il testo su trasfoming primitives ( trasformazione dei primitivi ). Anche per questo , dovete mettere Step() nell' event step e Destroy () nell' event destroy di Game Maker.

Ecco un codice di esempio che mostra come creare un semplice oggetto poligonale :

BeginPolygon (5);
AddVertex (0,0,0,0,1);
AddVertex (0,0,5,0,0.33);
AddVertex (0,2.5,7.5,0.5,0.0);
AddVertex (0,5,5,1,0.33);
AddVertex (0,5,0,1,1);
CreatePolygon ();
texture = 1;

Questa immagine mostra il risultato di queste chiamate di funzione:







Modifying polygon objects

( Modifica degli oggetti poligonali )


Ogni singolo vertice del Polygon object ( oggetto poligonale ) può essere cambiato dopo la creazione del poligono. Per fare questo ci sono due funzioni : uno per ricevere i dati circa il Polygon object ( oggetto poligonale ) , ed uno per modificarli.
Ecco una descrizione di ciascuno di essi :

Questa funzione recupera i dati del suo Polygon object ( oggetto poligonale ) e può essere inserita dopo CreatePolygon ().
GetVertex ( VertexIndex, ElementIndex );

VertexIndex
Questo parametro identifica il vertice di cui si desideri ottenere informazioni. Il vertice che è stato aggiunto al poligono prima è l' index 0 ( indice 0 ) . Il più alto indice valido è VertexNumber-1 .

ElementIndex
Questo parametro indica ad Ultimate3D che tipo d' informazioni devono essere recuperate.
Ecco il significato di ogni valore:
0 = X;
1 = Y;
2 = Z;
3 = U;
4 = V




Quest' altra funzione cambia i dati di un vertice all' interno del suo Polygon object ( oggetto poligonale ) e può essere inserito dopo CreatePolygon ().
SetVertex (VertexIndex, X, Y, Z, U, V ) ;

VertexIndex
Questo parametro identifica il vertice le cui informazioni si desiderano modificare. Il vertice che è stato aggiunto al poligono prima è l'indice 0. Il più alto indice valido è VertexNumber-1.

X, Y, Z
La posizione del vertice. Per ulteriori informazioni date un'occhiata alle descrizione della funzione AddVertex ().

U, V
Le coordinate della textura del vertice. Per ottenere una descrizione dettagliata di ciò che una texture e delle coordinate, date un' occhiata alla descrizione delle variabili texx1 e texy1 sugli wall objects (oggeti della parete).


E' tutto il necessario per modificare la geometria di un poligono. Ecco un esempio di questo:
se messi nell' event step di un Polygon object ( oggetto poligonale ) , il terzo vertice si muoverà di un po' in ogni step.

SetVertex (2, GetVertex (2,0), GetVertex (2,1) +0,1, GetVertex (2,2), GetVertex (2,3), GetVertex (2,4));







Changing the material of primitives


( Cambia il materiale dei primitives )

Nel caso più semplice, cambiando il materiale di un object ( oggetto ) si cambia il suo colore. Per fare questo Ultimate3D offre una funzione molto semplice:

Questa funzione cambia il materiale di un object ( oggetto ) primitivo (cubo , floor , polygon ) :
SetMaterial (Rosso, Verde, Blu, Alfa ) ;



Red , Green , Blue ( rosso, verde, blu )
Questi parametri definiscono il nuovo colore che deve essere utilizzato. I valori per i parametri possono essere nella gamma da 0 a 255. (0 | 0 | 0) equivale al nero , (255 | 255 | 255) equivale al bianco.

Alfa
Questo parametro dà l'opacità (trasparenza) dell'oggetto. Può essere nella gamma da 0 a 255. 0 significa non opacità (completamente trasparente) e 255 completamente opaco (visibile).




Quest' altra funzione cambia l' emissive del materiale. Emissive di un materiale non è influenzato dall' illuminazione. Un buon esempio di un materiale che dovrebbe utilizzare l' emissive d' illuminazione è una schermo TV. Esso emette luce propria la quale ( luminosità ) non dipende dalla luce esterna . è anche possibile utilizzare materiali emissive se non si vuole che gli oggetti vengano influenzati dalla luce. Per esempio, è di solito strano se dei billboards (cartelloni) sono influenzati dalla luce.

SetMaterialEmissive (Rosso, Verde, Blu );

Red , Green , Blue ( rosso, verde, blu )
Il colore che deve essere utilizzato per l' emissive del materiale.
Ancora una volta i valori possono essere nella gamma da 0 a 255.








Updating primitive objects

( aggiornamento di oggetti primitivi ).

Voi sapete già che si può cambiare la trasformazione di un primitivo dopo la sua creazione utilizzando le variabili x, y, z, rotx / Y / Z, scalx / Y / Z. Lo stesso può essere fatto con la texture. Essa può essere modificata in qualsiasi momento. Ma che ne è dell' altra proprietà di un primitivo? Ad esempio, se si desidera animare una texture modificando texx1, texy1, texx2 e texy2 ? Se si modificano queste variabili dopo aver creato il primitivo, l' oggetto non cambierà. Per questo motivo c'è la funzione RecreatePrimitive (). Si fa esattamente ciò che dice il nome : essa distrugge il primitivo e lo ricrea con i nuovi dati delle variabili.







Changing the environment


(Cambiare l'ambiente)

Ora siete in grado di creare semplici scene utilizzando oggetti primitivi. Ma una scena non è solo fatta di oggetti (objects) . Ci sono più cose che appartengono ad una completa scena. Alcune di queste sono descritte in questo capitolo e sono davvero semplici , poichè Ultimate3D fa tutto automaticamente. Si deve solo dirgli quello che si desidera.



Ambient lighting ( illuminazione dell' ambiente)

Ambient lighting ( illuminazione dell' ambient ) è la luce presente nella room. Se si guarda intorno alla room ( stanza del gioco) non si vede un posto assolutamente buio. Anche se qualcosa non è direttamente illuminata c'è sempre abbastanza luce che l' illumina un po'. Naturalmente tutto è effettivamente illuminata da qualcos'altro. Gli oggetti riflettenti della luce (objects reflect light ) e questo , è ciò che illumina gli object (oggetti) che non sono direttamente illuminati da fonti di luce. Ma simulando il problema si hanno enormi quantità di tempo di calcolo.
Per questo motivo c'è l' Ambient lighting ( illuminazione dell' ambient ).

Ambiente è il più semplice tipo d' illuminazione che si potrebbe immaginare. Tutto viene illuminato da essa con la stessa intensità e lo stesso colore. Per questo motivo l' illuminazione ambiente è costituito da un solo valore di colore . Questo colore può essere cambiato dalla seguente funzione:

SetAmbient (R, G, B ) ;

R, G, B : Il nuovo colore dell'Ambient lighting ( illuminazione dell' ambient ).
I valori di questi parametri devono essere nella gamma da 0 a 255.


Per impostazione predefinita Ambient lighting >( illuminazione dell' ambient ) ha il colore (128 | 128 | 128). Quindi, se si scrive SetAmbient (255,0,0) tutto si illuminerà in rosso. Se si scrive SetAmbient (0,0,0) tutti gli oggetti, ad eccezione di quelli che hanno un emissive materiale di partenza dovrebbe essere completamente nero. CambiandoAmbient lighting( illuminazione dell' ambiente ) si può fortemente influenzare l' atmosfera del gioco. è possibile commutare tra il giorno e la notte o è possibile creare un atmosfera apocalittica con luce rossa.



Setting up 3D backgrounds

( La creazione di sfondi 3D )


Un' altra cosa che è molto importante per l' atmosfera che si respira è l' immagine di sfondo. Ultimate 3D supporta tre diversi tipi di sfondi. Attualmente si sta utilizzando la prima? un colore a tinta unita. Il colore di sfondo può essere modificato cambiando i valori delle variabili control.BG_r, control.BG_g e control.BG_b. Si può dare loro valori nella gamma da 0 a 255.

Il secondo tipo di sfondo è chiamato sky sphere ( cielo sferico ). In questo caso si dispone di un' immagine 2D che contiene un disegno a 360° dell' ambiente . Questa immagine viene utilizzata come la texture di una sfera che circonda la scena. Lo svantaggio di sky sphere ( cielo sferico ) è che si ottengono strane distorsioni nella parte superiore. Tutti i gradi di latitudine si riuniscono in un unico punto.... e ciò non è così bello da vedere. Ma nella maggior parte dei giochi di solito non è necessario guardare dritto. Così la maggior parte del tempo sky sphere ( cielo sferico ) sono comunque utili.

Ma che dire di giochi in cui lo sfondo sarebbe bene vederlo in tutte le direzioni ? Il miglior esempio di questo è un gioco space shooter ( sparatutto spaziale ). Parole come in su e in giù non hanno alcun significato nello spazio. Per i casi come questo Ultimate3D sostiene un altro tipo di sfondo che non porta ad eventuali distorsioni : un cielo cubico. Un cielo cubico non è composto da una immagine 2D, ma sei immagini quadrate che vengono messe insieme in un unico cubo. Come a sfera, il cubo circonda l' intera scena. Creare delle immagini per un cielo cubico è più difficile che la creazione di mappe per un sky sphere ( cielo sferico ). Ma i risultato è nettamente migliore

Ora che sapete quali tipi di sfondi sono supportati veniamo alla realizzazione pratica. C' è solo una funzione per caricarli :
Questa funzione carica un' immagine per un sky sphere ( cielo sferico ) oppure sei texture per un cielo cubico a seconda del parametro dato:
LoadBackground (File) ;

File
Dovete inserire una stringa per questo parametro. Se la stringa contiene solo un nome di file, questo file viene caricato e usato come texture per il sky sphere ( cielo sferico ) . Se il file contiene una stringa * segno questo segno sono sostituite dalle parole "Front", "Back", "Top", "Bottom", "Left" e "Right" ( fronte, indietro, alto, basso, sinistra e destra).
Ultimate 3D così carica sei diversi file , i quali saranno utilizzati per un cielo cubico.


Se non si desidera più utilizzare uno sfondo è possibile richiamare UnloadBackground () ;per cancellarlo. Poi il colore verrà utilizzato nuovamente.



Setting up fog ( La creazione della nebbia )

E' raro nella maggior parte del mondo ( non a Venezia) avere una nebbia spessa . Nei giochi per computer ciò si verifica più spesso. Ma nella realtà non c'è un po' di nebbia. In un giorno di pioggia tutto ciò che è lontano è grigio o incolore. Con una serata calda tutto ciò che è lontano ha un tono di colore arancione scuro. Se si aggiunge la nebbia sembrerà un pò più fresco e darà un' impressione di reale profondità. Tuttavia, usando troppa nebbia farà pensare alla gente che non si può offrire un raggio maggiore di visuale . In alcuni casi ciò può effettivamente essere vero. Poi la nebbia è il male minore dei due . E' sempre meglio che vedere scomparire di colpo ciò che si trova lontano dall' object Camera ( telecamera ) .

La creazione della nebbia non è più difficile che la creazione di un' immagine di sfondo (background ). C'è una funzione per attivarla ed una per disattivarla. Ecco quello che serve :
SetFog ( R, G, B, Startdistance, EndDistance );



R, G, B : Il colore della nebbia. I valori per queste variabili devono essere nella gamma da 0 a 255.

Startdistance, EndDistance
I valori della distanza per la nebbia. Tutto ciò che è più vicino all' object Camera ( telecamera ) di Startdistance non sarà influenzata dalla nebbia. Tutto ciò che è più lontana dall' object Camera ( telecamera ) di EndDistance avranno il colore della nebbia. Tutto in questi valori tra Ultimate 3D si interpolano linearmente.


Se si desidera disattivare la nebbia è sufficiente richiamare DisableFog ().






Adding light sources ( Aggiungere fonti di luce )

Ambient lighting( illuminazione dell' ambiente ) va bene, ma è ovvio che non si potrà ottenere molto con essa. Per una vivace scena avrete bisogno di più fonti di luce dinamica e che non illuminano tutte nello stesso modo. Per questo motivo Ultimate 3D supporta il vertex lighting ( vertice per l' illuminazione) . Questo metodo funziona aggiungendo un paio di sorgenti luminose alla scena. Ultimate 3D saprà quindi utilizzare queste fonti di luce e calcolarne un valore di colore per ogni vertice. Questi colori verranno interpolati nel triangolo che è collegato al vertice. Ultimate 3D supporta anche l' illuminazione per pixel. Ma questo è uno delle tecniche per gli utenti avanzati.

Ci sono tre diversi tipi di sorgenti luminose. Il primo è chiamato luce direzionale. Il classico esempio di luce direzionale è il sole , il quale illumina tutto con luci della medesima direzione . Non importa dove siete ( ignorando il fatto che la terra è una sfera) il sole sembra essere sempre nella stessa posizione del cielo. L' opposto di una luce direzionale è un point light ( punto luce ). Un point light ( punto luce ) può essere paragonato ad una lampadina che è appesa al centro di una stanza : la parete sinistra di una stanza sarà illuminata da destra e la parete destra verrà illuminata da sinistra . Più lontano è un oggetto dal point light ( punto luce ) , meno sarà illuminato. Il terzo tipo di sorgente luminosa è uno spot light . Uno spot light è simile a quello di un point light ( punto luce ) , ma in contrasto con esso , infatti non illumina tutto intorno , ma solo quelle parti che si trovano in un determinato cono di luce.

Come per gli oggetti primitivi avete bisogno di un' istanza di un object (oggetto) per ogni fonte di luce. E di nuovo , prima , si scrivereanno delle variabili , poi si aggiungerà una chiamata della funzione light source ( sorgente di luce ) nel create ed infine, si metterà Step () e Destroy () nei corrispondenti eventi.


Directional light ( Luce direzionale ).

Qui sotto vi sono le variabili necessarie da scrivere prima del richiamo della funzione , per la creazione della luce direzionale.

rotx, roty
I nomi di queste due variabili sono molto relative alle vecchie versioni di Ultimate 3D, perchè ho voluto non rompere la retro compatibilità . Oggi sarebbero definite come longitudine e latitudine. Esse definiscono la direzione della directional light source ( sorgente di luce direzionale) . Per ottenere una descrizione di ciò che sono la longitudine e la latitudine , date un' occhiata alla descrizione della funzione Move (...) nel tutorial Getting started ( Come iniziare ).

r, g, b
Queste variabili definiscono il colore della sorgente luminosa. I valori sono di solito nella gamma da 0 a 255. Aumentando i valori di tali variabili, si aumenta l' intensità della luce. è anche possibile specificare valori negativi per queste variabili. Quindi la sorgente di luce si scurirà e così anche gli oggetti che sono illuminati da essa.



Directional lights ( luci direzionali ) non hanno una posizione ed un intervallo, perchè semplicemente ciò non importa. Essi sono onnipresenti. Dopo la creazione di queste variabili è possibile chiamare Lightdirectional () per inizializzare la sorgente di luce direzionale. Se non si è dimenticato di includere Step () nell' evento step , sarà possibile modificare tutti i parametri di tutte le fonti di luce in qualsiasi momento.



Point light ( Punto luce )
Andiamo avanti con le variabili del punto luce.

x, y, z
Queste variabili definiscono la posizione del punto sorgente di luce. Più vicino sarà un oggetto ad esso e più forte sarà illuminato.

range ( gamma-raggio )
Il range del punto luce. Tutto ciò che è più lontano dalla sorgente di luce non sarà colpito da essa. Più grande è il range e più forte sarà l' intensità della luce.

r, g, b
Queste variabili definiscono il colore della sorgente luminosa. I valori sono di solito nella gamma da 0 a 255. Aumentando i valori di tali variabili, si aumenta l' intensità della luce. è anche possibile specificare valori negativi per queste variabili. Quindi la sorgente di luce si scurirà e così anche gli oggetti illuminati da essa.



Dopo la creazione di queste variabili è possibile chiamare LightPoint () per inizializzare il punto luce. Anche in questo caso è possibile modificare tutte le proprietà della sorgente luminosa in qualsiasi momento se è presente Step ().



Spot light ( Luce spot )

Ultimo tipo di fonti di luce: illumina il posto. Questo tipo di luce è un po' più complessa di quanto lo siano point lights ( punto di luce) e directional lights ( luci direzionali ) e hanno bisogno di più tempo per essere calcolate. Ecco le loro variabili :

x, y, z
Queste variabili definiscono la posizione del spot light ( zona illuminata). Più vicino sarà un oggetto a questo punto e più sarà illuminato dalla luce.

range ( gamma-raggio )
La range dello spot light ( zona illuminata). Tutto ciò che è più distante da questa sorgente luminosa , non potrà essere colpita da essa. Più grande è il range e più forte sarà l' intensità della luce.

rotx, roty
Queste due variabili definiscono la direzione dello spot light ( zona illuminata).
Rotx è equivalente alla longitudine e roty è equivalente alla latitudine.

deg
Questo definisce l' angolo d' illuminazione dello spot light ( zona illuminata). Se l' angolo tra i raggi della sorgente di luce per il vertice e la direzione del vettore della sorgente di luce definita da rotx e roty è più grande di questo, il vertice non sarà illuminato dalla fonte di luce . In altre parole, si controlla come i riflettori siano a livello della zona.

r, g, b
Queste variabili definiscono il colore della sorgente luminosa. I valori sono di solito nella gamma da 0 a 255. Aumentando i valori di tali variabili, si aumenta l' intensità della luce. è anche possibile specificare valori negativi per queste variabili. Quindi la sorgente di luce si scurirà e così anche gli oggetti che sono illuminati da essa.



Dopo la creazione di queste variabili è possibile chiamare LightSpot () per inizializzare lo spot light ( zona illuminata) e se non si dimentica d' inserire la funzione Step() nell' event step , sarà possibile modificare tutte le proprietà in qualsiasi momento.



Subdividing primitives

(Suddividendo i primitives : cubi , polygon , Floor)

Nel capitolo sui primitives non vi erano elencate tutte le variabili dei diversi objects primitives (oggetti primitivi - semplici ) , solo ora potrete conoscere alcune variabili supplementari ( questo perchè non avreste capito la loro funzione senza prima conoscere l' illuminazioni basata sul vertice). Quindi, ecco le nuove variabili :

partsx, partsy, (partsz)
Queste variabili possono essere utilizzate per suddividere gli objects primitives particolarmente lungo le assi. Partsz è indicato tra le parentesi, perchè è utilizzato solo per i cubetti . I poligoni non utilizzano queste variabili. Suddividendo un primitivo si aumenta il numero del suo vertice . Dunque, un primitivo suddiviso verrà illuminato con maggior dettaglio, poichè l' illuminazione è basata su di un vertice . Le variabili possono essere impostate a qualsiasi valore intero positivo. Ma non esageriamo! Si può abbassare notevolmente il tuo fps ( numero di fotogrammi per secondo ).





Using model objects

( utilizza gli oggetti modello in 3d come alberi , personaggi , edifici... )

Se hai utilizzato solo le funzioni per il 3D di Game Maker , questa funzione vi stupirà. Con Game Maker è realmente complicato caricare un modello. In Ultimate 3D vi è una semplice funzione da richiamare. E' possibile caricare file.animati *. an8, *. 3ds, *. MD2, *. x, *. ms3d e *. u3d . Solo grazie alla possibilità di caricare questi tipi di modelli 3D sarà possibile realizzare scene estremamente belle e complesse . Troverete molti programmi di modellazione 3D che esportano file nei formati supportati da Ultimate 3D. In questo modo avete libertà di scelta del programma da utilizzare.

Se finora non avete nessuna esperienza di modellazione 3D , vi raccomando di iniziare ad imparare la modellazione utilizzando il programma gratuito Anim8or di Steven Glanville http://www.Anim8or.com. E' un programma di modellazione 3D molto facile e può essere utilizzato per realizzare anche modelli complessi. Ha anche un sistema molto bello per l' animazione degli oggetti , utilizzando uno scheletro d' animazione.
La parte migliore è che Ultimate 3D supporta Anim8or file ( *. an8 ).

Potete trovare la traduzione in italiano del manuale e alcuni file gratuiti per anim8or qui : https://gamequiz.altervista.org/An8Pages.php



Se siete alla ricerca di un programma di modellazione gratuito più professionale , vi consigliamo di provare Blender https://www.blender.org. Incominciare con questo programma è veramente difficile, ma ci sono buoni tutorial collegati al sito web e una volta che avrete imparato lo adorerete. E' possibile esportare in quasi tutti i formati di file conosciuti.

Nel Forum di Ultimate 3D ( http://www.ultimate3d.org ) c'è un argomento per le riposte nella sotto categoria grafica del Gioco che contiene un elenco di programmi di modellazione e di altre risorse che ti serviranno per i giochi 3D.



The different file formats

( i differenti formati di file).

Ogni formato di file supportato da Ultimate 3D ha i suoi vantaggi e svantaggi.
Ecco un elenco di essi, compresi le loro caratteristiche individuali.

*. 3ds
Il formato di file.3ds è importante per una ragione molto semplice. E' supportato da molti programmi di modellazione. In origine era il formato del file di 3D Studio Max, ma per qualche sconosciuta ragione, è diventato standard per molti programmi di modellazione. I file*. 3ds supportano lo scheletro per l' animazione. Purtroppo non ci sono molti programmi gratuiti ( mentre a pagamento si ) che sono in grado di esportare l' animazione del file*. 3ds . Inoltre, il modello nel formato di file *. 3ds è un po' superato perchè non supporta la vertex skinning ( scuoiatura del vertice : importante per l' animazione di personaggi ) e non memorizza normalmente i vertici.

*. an8
Il grande svantaggio del formato di file.an8 è che Anim8or è l' unico programma di modellazione che lo sostiene. Il vantaggio è che supporta lo scheletro d' animazione. Anim8or in questo modo può essere utilizzato per creare modelli animati per Ultimate 3D. Sfortunatamente, il supporto dell' animazione 3D per Ultimate *. an8 non è assolutamente completa, in quanto Steven Glanville ( il creatore del Anim8or) non ha documentato ancora tutti i pezzi che sono necessarie per caricare le scene da Anim8or file. Ma le figures ( aggiunta dello scheletro ad un file 3d ) e le sequences ( animazione dello scheletro) sono completamente supportate , tra cui l' animazioni dell' uso dei bone ( ossa dello scheletro ) o l' influenze della skin weights ( peso della pelle ). Queste ti permetteranno di realizzare animazioni per personaggi ed oggetti nel formato di file *. an8. Prima di caricare un file *. an8 con Ultimate 3D dovete convertire tutte la geometria in essa in maglie ( Build->Convert to Mesh ). Nonostante si dovrebbe essere cauti con i fattori di potenza nel "Materiale Editor" ( colore ed aggiunta di texture in Anim8or ). Per impostazione predefinita sono 0,3, 0,7, 0,2, 0,0. Di solito è meglio fissare a 1,0, 1,0, 0,0, 0,0. Altrimenti il tuo modello sarà molto scuro in Ultimate 3D.

*. MD2
il formato di file *. MD2 è molto speciale. In origine era utilizzato dal motore del famoso gioco Quake II per salvare i modelli dei personaggi . La cosa insolita di questo formato è il suo differente metodo ( dagli altri formati 3d ) per la creazione delle animazioni 3D . Invece di singole maglie collegate da ossa e la loro modellazione (questa tecnica è chiamata animazione dello scheletro ), si salva una maglia per ogni singolo fotogramma.

In Ultimate 3D v. 1,31, quando si utilizzavano i file *. MD2 , vi era sempre un' animazione abbastanza unsmooth , ciò perchè tale formato non contiene molti frame ( frame = fotogramma di un' animazione) . Ultimate 3D v. 2,0 usa una tecnica chiamata vertex tweening to interpolate tra i singoli fotogrammi dei file *. MD2. In questo modo si ottiene un' animazione più fluida . Gli svantaggi dei file *. MD2 sono che occupano più memoria rispetto ad altri tipi di file 3D e che la loro animazioni non può essere manipolata. I loro vantaggi sono che alcuni programmi che non supportano altri formati di file.3d animati , supportano i file d' animazione*. MD2 e che ci sono tonnellate di bellisssimi modelli *.MD2 sul web ( anche gratuiti ) perchè le persone li avevano realizzati per utilizzarli nel gioco Quake II.

x *.
Il modello di file*. x è nel formato DirectX . E' abbastanza vecchio, ma è piuttosto decente e la maggior parte dei programmi professionali di modellazione, come Blender, 3D Studio Max , Maya , Milkshape 3D e molti altri , lo sostegno attraverso collegamenti. Molti di questi collegamenti possono essere trovati su questo sito web : http://www.quest3d.nl
Sostiene le animazioni con o senza vertex skinning (squoiatura del vertice ), i materials ( materiali quali colori ) e quant' altro uno sviluppatore di giochi possa desiderare.

*. ms3d
Il modello di file*. ms3d è nel formato del programma Milkshape 3D. Esso supporta più materiali e animazioni con o senza la vertex skinning (squoiatura del vertice ). Ci sono plugin per esportare nei formati utili per diversi programmi di modellazione. Se si hanno delle difficoltà con il plugin d' esportazione nel formato *. x , il modello nel formato *. ms3d può essere la soluzione perfetta.

*. u3d
Come dice il nome, *. u3d è l'ultimo formato di file.3D. Attualmente ci sono solo due programmi che possono esportarlo. Ultimate 3D stesso (e tutte le applicazioni, che sono basati su di esso) e Blender ( https://blender.org/ ) la quale esportazione avviene con l'utilizzo di questo plugin :

http://u3d.xinto.net/

C'è un paio di ragioni diverse per la sua esistenza.
La prima è che si può salvare un modello 3D per un object in Ultimate 3D come è. Tutti gli effetti e le modifiche che sono state applicate ad esso saranno salvate. Quando leggerete i capitoli avanzati del manuale vedrete che questo può rendere le cose molto più facili. Un bel esempio di questo è il fuoco presente nel Demo Fire and Water scaricabile dal sito www.ultimate3d.org. Questo richiede molto codice per applicare l' effetto, ma si può semplicemente esportare il modello completo in un file *. u3d. Quando si caricherà questo modello, avrete un fuoco animato . Inoltre, alcuni file 3D ( come dei livelli molto dettagliati ) possono volere un tempo intensivo di caricamento , mentre se vengono salvati nel formato di file *. u3d , ne ridurrebbe tale tempo in maniera significativa. La seconda è che si può esportare oltre tutte le textures , anche egli effetti ( utilizzati poi dall' object del modello ) direttamente il un unico file *. u3d . In questo modo è possibile nascondere le risorse. L' ultimo motivo è che il modello nel formato di file Ultimate 3D dispone di un dignitoso meccanismo di crittografia ( password ) . Quindi, se si desidera nascondere le vostre risorse da coloro che realizzano i giochi , questo non è un problema. Si può semplicemente esportare tutti i tuoi modelli e texture criptati in un file*. u3d . Esportare questi modelli in object per Ultimate 3D verrà specificato nel capitolo advanced model managment ( gestione avanzata del modello ).
Commento: Se si desidera aggiungere il supporto per il formato di file di un modello per Ultimate 3D potete trovare le descrizioni in www.ultimate3d.org.











Loading models

( caricamento dei modelli : oggetti e personaggi statici o animati ).

Come ho già detto prima , basta solo una piccola funzione per caricare un modello.
Vediamo ora quali variabili dovrete impostare per ogni modello in un object Game Maker :

file ( i file dei vari modelli ) . Si raccomanda di mettere tutti i modelli in una sotto-directory chiamata models. Se alcuni materiali dei modelli 3D, che utilizzerai nel tuo gioco , hanno delle texture , quest' ultime le dovrai inserire in una cartella ( sotto-directory ) denominata gfx . In questo modo Ultimate 3D le caricherà automaticamente .

password (opzionale)
Solo se il file si riferisce ad un *.u3d ( Ultimate modello 3D di file) criptato , questa variabile deve essere impostata su di una stringa dandone la password. Altrimenti non è necessario impostare questa variabile.

Dopo aver impostato queste variabili è possibile chiamare LoadMesh () nel create dell' object relativo al modello. Il nome di questa funzione deriva dalle precedenti versioni di Ultimate 3D ( questi supportano i file *. x e quelli che sono stati trattati come un unica maglia-meshes ) .
Ora LoadMesh () può caricare modelli che sono costituiti da più meshes con scheletri ed animazioni. Dal momento che gli objects models ( oggetti di modelli 3d ) possono essere modificati nello stesso modo dei primitives (utilizzando le variabili x, y, z, scalx / Y / Z e rotx / Y / Z), si deve inserire Step () nel suo event step . Come al solito, dovete chiamare anche Destroy () nell' event destroy ( evento di distruzzione ).

Ci sono un paio di più variabili per gestire l' animazione :

frame ( fotogramma )
Se questa variabile ha un valore positivo, questo frame verrà utilizzato ( cioè se frame=10 , si visualizzerà il fotogramma numero 10 dell' intera animazione ). Se frame è negativo, il valore verrà utilizzato come velocità d' animazione. Quindi, se frame è pari a -1 si ottiene un nuovo fotogramma per ogni step.

first_frame, last_frame
Se frame è negativo , queste due variabili definiscono una serie di fotogrammi successivi o precedenti : se First_frame è più grande di Last_frame l' animazione verrà eseguita all' indietro.



Per scoprire il frame d' animazione del modello attualmente visualizzato, è possibile chiamare GetCurrentFrame (). Esso non ha alcuni parametri e restituisce il frame ( attualmente visualizzato ) relativo al modello di un object che ne richiama tale funzione.

Per i modelli *.MD2 c'è anche un' altra variabile che si conoscete già dai primitives. Dal momento che i file *. MD2 non contengono informazioni sui loro materiali , si imposterà per questi una texture utilizzando LoadTexture (... ) ( nello stesso modo degli oggetti primitivi ).







Drawing 2D objects


( disegnare oggetti 2D : in 2 dimensioni ).

Dal momento che Game Maker non può disegnare nella view ( vista di una room) attualmente utilizzata da Ultimate 3D, dovete usare le funzioni di Ultimate 3D per visualizzare alcune cose in 2D. Per effettuare questa operazione, Ultimate 3D offre due funzioni per disegnare le textures e quattro funzioni per disegnare il text ( testo ) .

Drawing textures ( disegna le textures : immagini 2D )
Tramite la funzione descritta qui sotto potete disegnare sullo schermo le textures in 2D :

DrawTex ( TextureIndex, X, Y, Scaling, Rotazione, Alpha ) ;

TextureIndex
Questo parametro dà l' indice della textura che sarà poi disegnata . L ' indice della textura è il valore che hai asseganto come secondo parametro al momento del caricamento della stessa utilizzando LoadTexture (...) . Come in questo esempio l' indice è pari a 1 : LoadTexture(" gfx/ nome_textura.jpg",1);
X, Y
La posizione in cui la textura sarà posizionata nella finestra dello schermo ( rispetto alla sinistra superiore della prima view).

Scaling
La dimensione visualizzata : 1 significa nessun cambiamento, 0,5 dimensione dimezzata e 2 significa dimensione radoppiata.

Rotation ( rotazione )
Questo parametro può essere utilizzato per ruotare la texture in senso anti-orario in gradi. Se è 0 la texture non viene ruotata.

Alpha ( alfa : trasparenza)
Questo parametro dà la trasparenza o meno di una texture . Il valore è settabile da 0 a 255 dove 0 significa che non è opaca ( quindi completamente trasparente) e 255 completamente opaca quindi totalmente visibile .



Se questa funzione non offre tutte le funzionalità di cui avete bisogno, c'è una seconda funzione per disegnare le texture in una modalità più complessa. Fondamentalmente è la stessa cosa, ma ci sono più possibilità di modificarne il risultato.


DrawTexEx( TextureIndex , Left ,Top , Width , Height , X , Y , ScalingX , ScalingY , Rotation, R, G, B, A);


Left, Top, Width, Height (sinistra , alto, larghezza, altezza )
Questi parametri identificano la parte della textura che deve essere utilizzata. I parametri devono essere nella gamma da 0 a 1 ( coordinate texture ). Quindi sarà utilizzata la parte della textura in base alle coordinate fornite partendo dall' alto a sinistra per le variabili Left e Top fino alle coordinate della textura partendo dalla sua sinistra+ larghezza per la variabilie Width e dall' alto+ altezza per la variabile Height .

ScalingX, ScalingY
La dimensione che verrà visualizzata. 1 significa nessun cambiamento, 0,5 dimensioni dimezzate e 2 significa dimensione radoppiata.

R, G, B, A
I parametri r g b forniscono il colore che sarà destinato ad essere utilizzato come "materiale" per disegnare la textura. I valori variano dallo 0 a 255. Mentre A illustra l'opacità ( la trasparenza ) , dove 0 significa che non c' è opacità ( completamente trasparente) e 255 completamente opaco ( totalmente visibile ).

Questo è tutto quello che c'è da sapere per disegnare le texture.






Drawing text (disegnare del testo )
Disegnare del testo è abbastanza facile. Prima si imposta un font e poi lo usa per disegnare un testo. Per impostare il tipo di carattere è necessario utilizzare la seguente funzione :


Setfont( fontName , fontIndex, TextSize, TextAttributes, R, G, B, A);


fontName
Questo è il nome del file nella directory dei font di Windows che contiene il tipo di carattere che si desidera utilizzare. Un esempio di questo sarebbe "Times New Roman" o "Arial".

fontIndex
Questo è l' indice che si desidera associare al tipo di carattere ( praticamente un numero da 0 a 99 ) . Funziona nello stesso modo degli indici di texture. Il più alto indice valido è 99.


TextSize ( grandezza del testo)
La dimensione del testo come sapete dai programmi di Office.


TextAttributes
Attributi del testo. 0 significa che il font è normale, 1 significa grassetto, 2 corsivo e 3 grassetto e corsivo.

R, G, B, A
Il colore del testo. Tutti i valori variano dallo 0 a 255. A definisce l'opacità del testo dove 0 significa che non c'è opacità ( completamente trasparente ) e 255 completamente opaco ( totalmente visibile) .


Una chiamata di questa funzione richiede sempre un po' di tempo per il suo calcolo. Per questo motivo si raccomanda di creare tutti i tipi di font nell' evento create dell' object Control . Se si desidera modificare il loro colore , ciò non è un problema. Si può semplicemente utilizzare la seguente funzione :

Setfontcolor (fontIndex, R, G, B, A );

fontIndex : L'indice del font che si desidera modificare.

R, G, B, A : Il nuovo colore e trasparenza del carattere.



Quando avete finito con la creazione dei font , si potrà disegnare del testo in due diversi modi . è possibile disegnare del testo in un classico 2D , oppure è possibile disegnare un testo in una scena 3D.

Si parte con la cosa più semplice: il testo 2D.

DrawText ( fontIndex, X, Y, Testo) ;

fontIndex : L' indice del carattere che deve essere utilizzato per la stesura del testo.

X, Y : La posizione del testo rispetto alla parte superiore sinistra del prima view ( punto di vista della room ) .

Testo : Una stringa che contiene il testo che si desidera visualizzare.
Da scrivere fra le virgolette " ".



Disegno del testo 3D ( un po' più complicato ) . In sostanza (come per i primitives ) , si entra in una completa trasformazione , quindi non solo X ed Y.

Draw3DText (Text, fontIndex, X, Y, Z, RotX, Roty, RotZ, ScalX, ScalY, ScalZ ) ;

Text : Una stringa che contiene il testo che si desidera richiamare.

fontIndex : L' indice del font ( tipo di carattere) che deve essere utilizzato per la stesura del testo.

X, Y, Z, RotX, Roty, RotZ, ScalX, ScalY, ScalZ
La trasformazione del testo in 3D. Per ottenere informazioni sul significato delle singole variabili , date un' occhiata al secondo capitolo del tutorial sugli objects primitives (oggetti primitivi ).

Da notare che il testo 3D sarà sempre disegnato su tutto il resto della scena, tra cui le texture 2D e testo semplice.







Miscellaneous functions ( varie funzioni ).

Alcune delle funzioni di Ultimate 3D che non rientrano nelle altre esercitazioni , sono riportate qui :

La seguente funzione fa esattamente la stessa cosa di mouse_check_button di Game Maker , perchè questo non funziona se si utilizza Ultimate 3D.

MouseCheckButton (MouseButton ) ;

MouseButton : Questo parametro può prendere le costanti di Game Maker : mb_left, mb_right, mb_middle e mb_none.



Dal momento che Ultimate 3D può essere utilizzato anche con Game Maker 5.0 il quale però non supporta la funzione mouse_set_screen_position (...), Ultimate 3D offre delle funzioni per sostituirla.

Questa funzione imposta global.mouse_x e global.mouse_y per il mouse nella posizione sullo schermo :
GetMousePos ();


Questa funzione può essere utilizzata per reimpostare la posizione sullo schermo del mouse :
SetMousePos (X, Y ) ;

X, Y :
La nuova posizione del cursore sullo schermo.



A parte le funzioni relative al mouse ci sono due funzioni per realizzare degli screenshots ( immagini tratte dalla schermo) :



1) Questa funzione salverà un' immagine dell' intera view utilizzata da Ultimate 3D : TakeScreenshot (BMPFile);


2) Questa funzione invece permette di definire la parte dello schermo che si desidera salvare in un' immagine :
TakeScreenshotEx(BMPFile,Unused,Left,Top,Right,Bottom );



BMPFile : Una stringa che contiene il nome del file.Bmp che realizzeremo .


Unused ( Inutilizzati )
Basta ignorare questo. E 'stato utilizzato in una versione precedente e adesso è obsoleto.

Left, Top, Right, Bottom (sinistra, alto, destra, basso )
Questi parametri specificano l' area dello schermo che sarà salvata in un file. I valori sono relativi alla parte sinistra e superiore della prima view ( vista della room) .






FINE 1° PARTE DEL

MANUALE DI ULTIMATE 3D

Non sò se avrò il tempo e la voglia per riportare anche la seconda parte del manuale ovvero quello per esperti . Ma già con questa prima parte sarete in grado di realizzare un vostro gioco 3D , sopratutto se avete sufficenze conoscenze anche del programma GAME MAKER . In ogni caso se deciderò di riportare anche la seconda parte , questa sarà inserita in questo mio sito:).





PAGES and MANUALS
PAGINE e MANUALI




AFFILIATI :