Ma première application 3D avec Raydium
Ref:
RaydiumTutoriels
Mise en place:
- Suivre la procédure d' InstallRaydium
- Créer un fichier test.c dans le répertoire racine (pas dans le sous répertoire "raydium/", donc)
Includes:
#include "raydium/index.c"
Cette ligne permet d'utiliser l'ensemble des fonctions disponibles dans
Raydium.
main:
Création de la fenêtre:
int main(int argc, char **argv)
{
raydium_init_args(argc,argv);
raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"Mon premier test !");
raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR);
Rien de bien compliqué ici: on passe les arguments de la ligne de commande à
Raydium, et on crée une fenêtre (640x480). Il est aussi possible d'utiliser RAYDIUM_RENDERING_FULLSCREEN, et bien sur de changer le titre de la fenêtre.
raydium_texture_filter_change passe ici l'affichage des textures en filtrage trilinéaire, soit le filtre qui produit la meilleure qualité d'image à l'heure actuelle avec
Raydium.
Espace de visualisation:
raydium_projection_near=0.01;
raydium_projection_far=1000;
raydium_projection_fov=60;
raydium_window_view_update();
Ces trois variables permettent de définir les distances min et max (near et far) de visibilité de la caméra. Basez vous sur la taille de vos objets pour déterminer ces valeurs: dans cet exemple, on peut imaginer que la taille du monde est de l'ordre de 1000 unités, et que l'on souhaite l'afficher dans son ensemble.
La fonction raydium_window_view_update() s'occupe d'appliquer les modifications auprès du matériel.
Réglage de la lumière principale (soleil):
Pour cette étape, il est plus pratique de déclarer une variable qui va contenir la couleur de la lumière:
GLfloat sun[]={1.0,0.9,0.5,1.0};
Les couleurs sont exprimées sous forme RGBA (Red, Green, Blue, Alpha), chacune des composantes étant comprise entre 0 et 1. La composante alpha n'est pas utilisée ici.
raydium_light_on(0);
memcpy(raydium_light_color[0],sun,raydium_internal_size_vector_float_4);
raydium_light_intensity[0]=1000000;
raydium_light_position[0][0]=50;
raydium_light_position[0][1]=150;
raydium_light_position[0][2]=200;
raydium_light_update_all(0);
Ensuite, on active la lumière 0, puis on lui assigne sa couleur avec memcpy. Reste à fixer l'intensité de la lumière (ici, volontairement très intense, pour donner un effet proche de celui du soleil).
Ensuite, on place la lumière 0 dans la scène, en fixant ses valeurs de position (X, Y et Z), et on applique le tout.
raydium_background_color_change(sun[0],sun[1],sun[2],sun[3]);
Cette fonction permet d'utiliser la couleur du soleil comme "teinte de fond" pour la scène.
Il peut être intéressant de désactiver le brouillard, de facon à voir le ciel:
Fonction d'affichage:
Déclaration
L'étape suivante consiste à déclarer une fonction responsable de l'affichage. Cette fonction sera ensuite appellée à répétitions par Raydium.
Cette fonction doit avoir la signature suivante: void fonction(void)
Ensuite, il faut indiquer à
Raydium quelle fonction utiliser pour l'affichage, en ajoutant a la fin de la fonction main():
raydium_callback(&display);
Implémentation:
Grâce à cette fonction, nous allons permettre à l'utilisateur de déplacer la caméra, qui elle va pointer en permanence vers le centre de la scène (0,0,0).
Première étape, gérer les entrées de l'utilisateur:
Cette fonction permet d'émuler un joystick si l'utilisateur n'en possède pas. Cette émulation permet de programmer les déplacements de la même manière, que l'utilisateur ait configuré un joystick ou non.
Pour stocker la position de la caméra, nous allons avoir besoin de trois variables globales, déclarées justes en dessous les includes, par exemple:
GLfloat camx=10;
GLfloat camy=10;
GLfloat camz=20;
Il nous reste donc à modifier ces valeurs en fonction des entrées de l'utilisateur, dans la fonction display:
camx+=raydium_joy_x;
camy+=raydium_joy_y;
if(raydium_key[GLUT_KEY_PAGE_DOWN]) camz--;
if(raydium_key[GLUT_KEY_PAGE_UP] ) camz++;
if(raydium_key_last==1027) exit(0);
Occupons nous maintenant de l'affichage en lui même:
raydium_clear_frame();
raydium_camera_look_at(camx,camy,camz,0,0,0);
raydium_object_draw_name("cocorobix.tri");
raydium_rendering_finish();
Il maintenant l'heure de compiler cette première application en utilisant le script ocomp.sh:
./ocomp.sh test.c
Code source complet:
#include "raydium/index.c"
GLfloat sun[]={1.0,0.9,0.5,1.0};
GLfloat camx=10;
GLfloat camy=10;
GLfloat camz=20;
void display(void)
{
raydium_joy_key_emul();
camx+=raydium_joy_x;
camy+=raydium_joy_y;
if(raydium_key[GLUT_KEY_PAGE_DOWN]) camz--;
if(raydium_key[GLUT_KEY_PAGE_UP] ) camz++;
if(raydium_key_last==1027) exit(0);
raydium_clear_frame();
raydium_camera_look_at(camx,camy,camz,0,0,0);
raydium_object_draw_name("cocorobix.tri");
raydium_rendering_finish();
}
int main(int argc, char **argv)
{
raydium_init_args(argc,argv);
raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"Mon premier test !");
raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR);
raydium_projection_near=0.01;
raydium_projection_far=1000;
raydium_projection_fov=60;
raydium_window_view_update();
raydium_light_on(0);
memcpy(raydium_light_color[0],sun,raydium_internal_size_vector_float_4);
raydium_light_intensity[0]=1000000;
raydium_light_position[0][0]=50;
raydium_light_position[0][1]=150;
raydium_light_position[0][2]=200;
raydium_light_update_all(0);
raydium_background_color_change(sun[0],sun[1],sun[2],sun[3]);
raydium_fog_disable();
raydium_callback(&display);
return 0;
}
Tutoriel 2:
TutorielDeplacerDesObjets