Mi primera aplicación 3D con Raydium
Ref:
TutorialesRaydium
Antes de nada:
- Sigue las instrucciones para instalar Raydium
- Crea un uevo fichero, llamado test.c, en el directorio raiz de Raydium (y NO en el subdirectorio "raydium/")
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.
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)
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:
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