RaydiumWikiNi

MiPrimeraAplicacionRaydium

PagePrincipale :: DerniersChangements :: ParametresUtilisateur :: Vous êtes ec2-54-159-90-0.compute-1.amazonaws.com

Mi primera aplicación 3D con Raydium


Ref: TutorialesRaydium

tuto

Antes de nada:



Includes:


#include "raydium/index.c" 
 

Esta línea permite el uso de todas las funciones de Raydium.

main:


Declaración de ventana:


int main(int argc, char **argv)
{
raydium_init_args(argc,argv);
raydium_window_create(640,480,RAYDIUM_RENDERING_WINDOW,"Mi primera prueba con Raydium");
raydium_texture_filter_change(RAYDIUM_TEXTURE_FILTER_TRILINEAR);

Nada dificil por aquí: Enviamos los argumentos de la linea de comandos a Raydium, y creamos una ventana(640x480). También es posible usar RAYDIUM_RENDERING_FULLSCREEN para usar el modo de pantalla completa, y cambiar el título de la ventana, por supuesto.

raydium_texture_filter_change activará el filtrado trilineal de texturas, el mejor permitido por Raydium.

Espacio Visible:


raydium_projection_near=0.01;
raydium_projection_far=1000;
raydium_projection_fov=60;
raydium_window_view_update();

Esas 3 variables definirán los valores mínimos(cerca) y máximos(lejos) de la cámara.
Los valores dependerán del tamaño de los objetos: Aquí podemos imaginarnos un mundo de 1000 unidades que queremos que se muestre por completo.

La función raydium_window_view_update() actualizará los valores en el hardware.

Configurando la luz principal (sol):


Para este paso sería una buena idea almacenar el color de la luz del sol con una variable:
GLfloat sun[]={1.0,0.9,0.5,1.0};

Los colores se expresan con un esquema RGBA(Rojo, Verde, Azul, Opacidad). Cada elemento está restringido al rango [0,1]. La opcidad (llamada Alpha) no tiene utilidad aquí.
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);

Entonces, encendemos la luz 0, y le asignamos un color con memcpy. También tenemos que configurar su intensidad(Intenso en este caso para tener el efecto de sol), posición (X, Y, Z) y aplicamos los cambios.

raydium_background_color_change(sun[0],sun[1],sun[2],sun[3]);

Esta función el color del sol como el color de fondo de la escena.

Es interesante desactivar la niebla, ya que así podremos ver el sol.
raydium_fog_disable();

Función de Dibujo:


Declaración


El próximo paso es declarar una nueva función, dedicada a dibujar("renderizar"). Esta función será llamada por Raydium.

Esta función tiene que tener el siguiente prototipo: void function(void)
void display(void)
{
 
}

Ahora, enviaremos esta funcion a Raydium, al final del main():

raydium_callback(&display);


Implementación:


Esta función permitirá al usuario mover la cámara, y esta cámara siempre mirará al centro de la escena, el punto (0,0,0).

First step: manage user input:
raydium_joy_key_emul();

Esta llamada simulará un joystick, si no se ha detectado ninguno. Permite por tanto usar raydium_joy_* incluso si no se han detectado joysticks ni joypads.

Ahora, podemos declarar 3 variables globales para almacenar la posición de la cámara, justo despues de los includes por ejemplo.
GLfloat camx=10;
GLfloat camy=10;
GLfloat camz=20;

Entonces modificamos estos valores usando la entrada del usuario:
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);

Ahora, la parte de la función que dibuja:
raydium_clear_frame();
raydium_camera_look_at(camx,camy,camz,0,0,0);
raydium_object_draw_name("cocorobix.tri");
raydium_rendering_finish();

Es hora de compilar esta primera aplicación, usando el script automático ocomp.sh, por ejemplo:

./ocomp.sh test.c

Código Fuente Completo:


#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,"Mi primera prueba con Raydium");
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;
}




Tutorial 2: Mover Objetos
IndiceES