Tutoriel Raydium: Déplacer des objets dans la scène
Ref:
RaydiumTutoriels
Mise en place:
Problèmatique:
Dans le premier tutoriel, nous avons constaté qu'il était simple de déplacer la caméra dans la scène. Ce déplacement avait pour effet de modifier la facon dont l'utilisateur percevait le seul objet qui était utilisé dans ce tutoriel: le sol.
Qu'en est-il lorsque l'on souhaite afficher d'autres objets ? Comment déplacer ces objets dans la scène ?
Retour sur la fonction d'affichage:
raydium_clear_frame();
raydium_camera_look_at(camx,camy,camz,0,0,0);
raydium_object_draw_name("cocorobix.tri");
raydium_rendering_finish();
Dans cet extrait de
display(), on comprend que "cocorobix.tri" s'affiche en fonction de l'appel placé juste au dessus:
raydium_camera_look_at().
Bien qu'il existe plusieurs fonctions différentes pour placer la caméra dans la scène, le principe reste le même: on ne place la caméra qu'une seule fois par
frame. Impossible donc de refaire appel à
raydium_camera_look_at() à chaque nouvel objet.
La solution réside en un appel à
raydium_camera_replace(): Cette fonction va en fait replacer le "curseur 3D" à l'origine du monde. Il ne reste plus ensuite qu'a déplacer ce curseur au point souhaité, puis dessiner un nouvel objet.
Exemple:
raydium_camera_replace();
glTranslatef(carx,cary,carz);
raydium_object_draw_name("voiture.tri");
raydium_camera_replace();
glTranslatef(busx,busy,busz);
raydium_object_draw_name("bus.tri");
...
Il y'a donc autant d'appels à
raydium_camera_replace que d'objets à afficher, le "sol" mis à part (bien qu'on puisse replacer la caméra avant de l'afficher).
Il est bien sur possible de faire effectuer des rotations à ces objets, en utilisant
glRotatef:
glRotatef(roty,0,1,0);
glRotatef(rotx,1,0,0);
L'utilisation de ces fonctions (
glTranslatef et
glRotatef) demandent souvent un peu d'expérimentations, au début.
Code source complet de cet exemple: (voiture: utilisez F1 et F3 pour tourner, F2 pour avancer... attention les mouvement peuvent être très rapide en fonction de la vitesse de votre machine).
Les modifications par rapport au tutoriel
MaPremiereApplicationRaydium sont en gras.
#include "raydium/index.c"
GLfloat sun[]={1.0,0.9,0.5,1.0};
GLfloat camx=10;
GLfloat camy=10;
GLfloat camz=20;
GLfloat carx=0;
GLfloat cary=0;
GLfloat carz=0;
GLfloat carangle=0;
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[GLUT_KEY_F1]) carangle+=2;
if(raydium_key[GLUT_KEY_F3]) carangle-=2;
if(raydium_key[GLUT_KEY_F2])
{
carx+=raydium_trigo_cos(carangle);
cary+=raydium_trigo_sin(carangle);
}
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_camera_replace();
glTranslatef(carx,cary,carz);
glRotatef(carangle,0,0,1);
raydium_object_draw_name("clio.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;
}
Si vous souhaitez que la caméra suive la voiture au lieu de regarder le centre de la scène, modifiez
raydium_camera_look_at(camx,camy,camz,0,0,0);
par
raydium_camera_look_at(camx,camy,camz, cary,-carz,carx);
Il peut sembler étonnant que les variables de position de la voiture soient données de cette manière (x=cary,y=-carz,z=carx), mais cette transformation est simplement dûe à un changement de repère (cette transformation est toujours la même).
Tutoriel 3:
TutorielUtiliserLaPhysique