My first 3D application with Raydium
Ref:
RaydiumTutorials
Before anything:
- Follow InstallRaydiumEn? instructions
- Create a new file, named test.c, in Raydium root directory (and not "raydium/" subdirectory)
Includes:
#include "raydium/index.c"
This line allows use of all
Raydium's functions.
main:
Window's declaration:
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);
Nothing hard, here : we send command line arguments to
Raydium, and we create a window (640x480). It's also possible to use RAYDIUM_RENDERING_FULLSCREEN, and to change window's title, of course.
raydium_texture_filter_change will switch to a trilinear filter, the best one allowed by
Raydium.
Visibility space:
raydium_projection_near=0.01;
raydium_projection_far=1000;
raydium_projection_fov=60;
raydium_window_view_update();
These three variables will define min and max visibility values (near and far) of the camera.
Ces trois variables permettent de définir les distances min et fax (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