Generador/visor de modelos 3D sencillos programado totalmente en 2D

Started by Windgate, June 10, 2009, 07:47:02 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Ah, entiendo, si se puede acceder a la string como un array en lectura, se puede obtener la substr() a partir de uno de los caracteres (El último) y "borrar".

Interesante, no sé si lo probaré muy a fondo porque de momento me preocupa más el visor en sí que su interfaz, pero gracias!

EDIT: Nueva versión, se puede cargar un fichero 3D de ejemplo con un triangulito, se llama objeto.ig. Todo el calculo matricial de transformaciones funciona correctamente, pero al mostrar el wireframe se me cuelga. He dejado el wireframe para el final porque es lo más complicado, hasta ahora todo el control de punteros funciona a la perfección (Tras miles de correcciones y pruebas), grande es Bennu.

DESCARGAR: http://www.mediafire.com/?ojjz1dawizj

Lo cierto es que estoy probando toda la potencia de Bennu, hay cabeceras de función con este aspecto:

[code language="bennu" options="singleline"]FUNCTION tp_ObjectCell POINTER LoadObject ( string object_name , int no_of_objects , tp_ObjectCell POINTER object_head )[/code]

Y otras similares con matrices y cosas así todo el tiempo, un agobio :(
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

Primera ejecución correcta que muestra el triángulo almacenado en el fichero objeto.ig

Se puede rotar, escalar y trasladar, el menú no es ninguna maravilla, pero tenía prisa porque funcionase. El "maquillaje" para el final.

DESCARGA: http://www.mediafire.com/?intnlmmajgm

Ahora me resta construir un fichero con información poligonal más compleja que un simple triángulo, por ejemplo una pirámide, un cubo, y ver cómo reacciona la cosa. La estructura de datos que almacena todo es 100% dinámica, todo punteros, y para 1 objeto con 1 único polígono y 1 única superficie es lógico que funcione de maravilla, pero ahora veremos los nuevos problemas que dan las superficies con varios polígonos, los vértices que pertenecen a varios polígonos, etc :P

Si me animo saco un motor 3D propio ::) (Broma...)
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Prg

ja ja ja, iba a comentar lo que vi en el primero, pero mejor veo el segundo.
me encanta que las letras aparezcan poco a poco, le da muy buen aspecto

en la nueva versión, la he probado, pero no me salió un triángulo, me slió como una E girada 90º a la izq. es porque le dije que me dibujara normales?

el color es verde... je je je

ya quiero verlo con modelos más grandes amigo :) tiene muy buen aspecto, auqneu se ve que estamos debuggenado todavía, pues presenta mucha info en la pantalla... pero sirve que veo qué hace :)
saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

Prg, es que el triángulo lo carga plano, si le aplicas rotación en el menú, por ejemplo 30 grados en cada eje, lo verás correctamente. Los palitos son las normales, sí :P

Ya tengo una versión que muestra objetos 3D, el archivo piramide.ig por ejemplo.

DESCARGAR: http://www.mediafire.com/?fiymj5uyyzd

En screenshots hay una muestra de la pirámide cargada normal en el centro de la pantalla y luego girada 30º en cada eje y escalada a x3 en todos los ejes.

Sudor me ha costado pero... ¡Vive!, ¡VIVE!, ¡¡¡VIVEEE!!!
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

Bien, tras probarlo concienzudamente y comprobar que no hay errores en la estructura de datos 100% dinámica he limpiado BASTANTE el interfaz del programa y ahora ya no muestra información de punteros ni líneas trazadas ni cálculos matriciales, sólo los menús donde seleccionar las opciones.

Os dejo la descarga y una captura de la figura cilindro.ig (La extensión .ig se debe a que la asignatura para la que lo estoy programando se llama Informática Gráfica).



DESCARGAR: http://www.mediafire.com/?jzjztwtwgq1
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

¡¡¡ En el primer mes Windgate creó la estructura dinámica más gorda de su vida en Bennu... !!!
¡¡¡ En el segundo mes Windgate logró mostrar información de polígonos bidimensionales sin perspectiva... !!!
¡¡¡ En el tercer mes Windgate tuvo que reescribir casi todo el código... !!!
¡¡¡ En el cuarto Windgate obtuvo su primer wireframe bidimensional en perspectiva... !!!
¡¡¡ En el quinto  Windgate consiguió wireframes tridimensionales en perspectiva con información de objetos leídas desde fichero... !!!

¡Y al día siguiente implementó el render y los texturizó!

DESCARGA: http://www.mediafire.com/?xiyzqqh1nmm

Ahora en serio, bugs conocidos que no son pocos:

1) Para cargar un objeto hay que introducir su nombre por teclado, por ejemplo "cilindro.ig", ojo porque NO se puede borrar, escribid bien el nombre del fichero a cargar...
2) La ocultación de polígonos no visibles me "cojea" un poco, por ejemplo al cargar "cilindro.ig" suele mostrar medio sólamente...
3) Antes de poder mostrar el render hay que mostrar el wireframe, para que se calculen las coordenadas de pantalla
4) El texturizado es monócromo (Azul por ahora) y sin sensibilidad al foco de luz.

Y ventajas de la versión actual:

1) Ya no muestra la infinita información de valores de puntero, trazado de líneas, etc.
2) Es muy sencillo abrir cualquier fichero .ig y editarlo con el bloc de notas (Están comentados incluso)

Estoy a punto de conseguir el texturizado en madera, generada a partir de código, con iluminación, pero tengo problemas porque calculaba el RGB considerando 32 bits de color, pero hace nada he conocido la función rgb(int,int,int) que me simplifica las cosas.

Disfrutad, disfrutad...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

josebita

El visor tiene muy buena pinta.

Para lo de no poder borrar al escribir el nombre del fichero, te podría sugerir el siguiente código para la función leer_cadena de modules/teclado.prg:
[code language="bennu"]FUNCTION string leer_cadena (int x,y)
PRIVATE
   string cadena = "";
   char tecla_anterior;
   int time=0, delay=10;
BEGIN
   tecla_anterior=ascii;
   LOOP
      IF ( key (_ENTER) )
         BREAK;
      END
      IF ( ascii != 0 && timer[0] > time+delay )
        IF ( ascii != 8 ) /* Backspace handling */
           tecla_anterior = ascii;
           cadena = cadena + tecla_anterior;
         ELSE
           IF ( len(cadena) != 0 )
             cadena = substr(cadena, 0, -1);
           END
         END
         
         time = timer[0];
      END
      write_var ( 0, x, y, 0, cadena );
      FRAME;
   END
   RETURN cadena;
END[/code]

Fíjate que he reemplazado el write del final y el delete_text por un write_var (que se va actualizando a medida que cambia la variable) y que he cambiado la condición de escritura por un retraso desde la pulsación de la última tecla. Entre otras cosas, antes no podrías haber cargado un fichero con un nombre con dos letras iguales seguidas (accesorio.ig, o algo así) y le he añadido una condición para manejar la tecla de "backspace".

Seguro que alguien puede mejorar la rutina, pero espero que te sea útil.

Windgate

Gracias josebita, procedo a copy+pastear directamente, y si funciona pues mano de santo, me quiero quitar el visor cuanto antes porque tengo muchísimo trabajo que hacer...

Ya estoy texturizando con madera y mármol, pero me baso en un pseudocódigo de los 80 que omite declaraciones de algunas variables, de algunos tipos, y está basado en radianes y/o grados, mientras que Bennu trabaja con milésimas de grado...

Y tras "calibrarlo" sí, me muestra texturas, pero parecen mojones >:(

EDIT: La función de lectura de cadena desde teclado ha sido mano de santo, pero si tecleo rápido no me lee algunos caracteres, estoy investigando ahora mismo...

También he mejorado el muestreo de texturas considerablemente, "casi" parece madera, pero sin iluminación aún xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

Una nueva alternativa a leer_cadena() que aunque escribas rápido, repitas teclas (p.ej. cOOrdenada), funciona fielmente a lo que se esperaría. También admite que mantengas pulsada una tecla durante key_delay frames para que se reinterprete hasta que la sueltes, también funciona con la tecla de borrado, me excita... ;D

Único defecto conocido: Si escribes un caracter acentuado reinterpreta la pulsación... Vamos, que si lo usáis NO metáis caracteres acentuados.

FUNCTION string leer_cadena (int x,y)
PRIVATE
string cadena = "";
char tecla_anterior;
int time=0, key_delay=40;
BEGIN
tecla_anterior=ascii;
LOOP
IF ( key (_ENTER) )
BREAK;
END
IF ( ascii != 0 ) //Si se pulsa una tecla
IF ( ascii != 8 ) //Si no es la tecla de borrado
IF ( ascii != tecla_anterior OR   //Si no era la anterior o bien
( ascii == tecla_anterior AND timer[0] > time+KEY_DELAY ) ) // si era la anterior pero pasó un tiempo
tecla_anterior = ascii;
cadena = cadena + tecla_anterior; //Añadimos a la cadena y memorizamos tecla
END
ELSE //Si se trata de la tecla de borrado
IF ( len(cadena) != 0 ) //Si hay caracteres en la cadena
IF ( ascii != tecla_anterior OR //Si no se había pulsado borrar en el FRAME anterior o bien
( ascii == tecla_anterior AND timer[0] > time+KEY_DELAY ) ) //Si se había pulsado pero pasó un tiempo
tecla_anterior = ascii;
cadena = substr(cadena, 0, -1); //Borramos de la cadena y memorizamos tecla
END
END
END
ELSE //Si no se pulsa ninguna tecla
tecla_anterior = ascii;
time = timer[0]; //Reiniciamos el contador y memorizamos tecla
END

write_var ( 0, x, y, 0, cadena );
FRAME;
END
RETURN cadena;
END


EDIT: Así viene quedando el texturizado... Aún le falta y la iluminación no sé ni por dónde cogerla...

Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

No tarda nada y te montas un engine 3D por software utilizando Bennu ;)

blostec

Impresionante Windgate, estas haciendo un gran trabajo. Saludos!

Drumpi

Al final, lo que te iba a comentar aquí te lo he dicho en el otro hilo ^^U
(El de cómo borrar un conjunto de pixels)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Prg

cada vez se ve mejor, en la versión anterior no podía rotar, ahora ya se que no es poniendo el valor, sino presionar las flechas... ve muy bien, felicidades.
... y qué frase la del archivo prueba en  la carpeta extenciones eh... ja ja ja..
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

lol Prg tienes razon, me preocupe tanto por que funcionase que olvide al usuario, los valores numericos se establecen (modifican) pulsando las teclas direccionales, arriba-abajo modifica de 1 en 1 e izquierda-derecha de 100 en 100.

En teclado.prg tengo la funcion para lectura de enteros por teclado, que es basicamente la de lectura de strings pero con un atoi, lo unico que no la he usado aun.

Para el borrado del render creo que voy a terminar guardando los ID en una matriz de [RESOLUCION_x][RESOLUCION_Y], a nivel de memoria es un consumo excesivo, pero me prima terminarlo como sea, y siempre podre modificar la funcion en otro momento...

En cuanto al engine... Lo cierto es que consume una barbaridad, se nota que no usa hardware, y el texturizado a partir de codigo para marmol (Que lo acabo de terminar) tiene una cantidad de multiplicaciones de float impresionante... Se quedara en simple curiosidad.

La iluminacion me sigue teniendo preocupado, es el modelo de iluminacion de Gouraud, que es el mas antiguo y se basa en:

1) Desde el punto de luz se calculan las distancias a todos los vertices cuya normal "mire" hacia la luz.

2) En funcion de las distancias se impone un porcentaje del valor rgb de la luz a cada vertice, 0 para los no iluminados

3) Finalmente, para iluminar los poligonos, para cada uno de sus pixeles se le suma la interpolacion de los rgb de iluminacion de cada vertice.

El algoritmo es factible, pero me da una pereza ponerme otra vez a probar y probar...

Creo que antes voy a darle un retoque al interfaz a ver si lo dejo un poco mas agradable.

EDIT: Sí, la frase del archivo de la carpeta extensiones es peculiar ;D y también hay otro fichero de prueba por ahí del que se lee un entero, un float y una string y lo que pone en la string también tiene lo suyo ;D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es