how to build
a simple

3D

multiplatform
game

Un po' di noiosa teoria

passare dal 2D al 3D

(x,y - u,v) -> (x,y,z - u,v)
Punti, linee, ma soprattutto

Triangoli

vertex / edge / face / mesh


modelli 3D

formati file

(obj, 3ds, md2, ... Open Asset Import Library

lowpoly - midpoly - hipoly
LODs

3D World

Space

(or Matrix)


(mostrato con l'aiuto di Coding Labs)

Model Space



World Space


View Space


Projection

(come vediamo quello che vediamo)


FOV


far and near plane


Camera

viewport in 3D

frustum

Cosa disegnamo e come

Painter's algorithm / Z-bufferculling / frustum clipping

Carichiamo un

modello


(sample mode from 3drt.com)

mesh / texture

typedef struct{
 float*vert;
 float*tex;
 int   tris;
}quickMESH; 

typedef struct tagcoord3D{
 vector3 pos;
 vector3 rot;
 float   scale;
}coord3D;

int    quickmesh_draw(quickMESH*mesh,Texture*textID,coord3D*obj);


formato MD2

int quickmesh_readMD2(quickMESH*mesh,const char*s,Texture*textID) 
MD2 is a model format used by id Software's id Tech 2 engine and is thus used by 

Quake II as well as many other games
(http://en.wikipedia.org/wiki/MD2_(file_format))

Reading code derived from http://svn.assembla.com/svn/raytracer-cc52b/trunk/El-Zahir/Zahir/Models/Cargadores/MD2/md2_utils.hpp
by David Henry, http://tfc.duke.free.fr/ 

Rotazione camera

void   gfx_LookAt(float eyex, float eyey, float eyez,
                float centerx, float centery, float centerz,
                float upx, float upy, GLfloat upz);

void   camera3D_new(camera3D*th);
void   camera3D_setPOSITION(camera3D*th,
                            float positionX, float positionY, float positionZ,
				  		           float viewX,     float viewY,     float viewZ,
							                    float upVectorX, float upVectorY, float upVectorZ);
void   camera3D_lookAT(camera3D*th); 

Creiamo un modello da codice


Creazione di un modello partendo da una forma

Da un pezzo a un percorso


Replichiamo il modello, traslandolo

endless runner = matrice a scorrimento

Aggiungiamo elementi


Fog / Skyline

Iniziamo a muoverci


La strada è tutta intorno a noi

Tilt dell'astronave

Aggiungiamo ostacoli


Struttura per ostacoli, tipologia e flusso


Dettagli

Creiamo un modello, selezioniamo il texture
Aggiungiamo elementi solo estetici
Caso reale: avremmo dei modelli

Collisioni

Limiti di area di gioco

typedef struct{
    float xm,ym,zm;
    float xM,yM,zM;
}AABB;
void   quickmesh_getAABB(quickMESH*mesh,AABB*aabb); 

Collisione con modelli usando AABB
(altri casi comuni OBB, sphere)

Eventi

Passaggio delle subfasi di gioco

Elementi di gioco


Definiamo come si ottiene punteggio

Velocità progressiva

Scene


Aggiungiamo la home

(e il passaggio da home a game e viceversa)

Arricchiamo la Home


Movimento e cambio di camera

Animazione 3D

Frame based / Skeleton based

Ombre

Luce e normali

Shadow maps

Movimento camera

First Person Perspective

Third Person Perspective

Fixed / Rotating / Scrolling / Floating


Gestione modelli e world

BSP / Octree / Portal Rendering / PVS

Zaxxon


Made with Slides.com