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-buffer / culling / 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
