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

Nueva versión con texturizado en mármol y mejoras de interfaz. Si molesta la opacidad del menú, puede regularse con la rueda del ratón:


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

Errores conocidos: Pues no sé qué pasa que algunos write del menú no se me muestran algunas veces... Es como si alguien les aplicase un delete_text pero... No tiene sentido... Sigo investigando.
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

syous

Un Saludo
EL dia que la humanidad aprenda a mirar y sentir con los ojos del alma, recuperara su humanidad
http://sodonline.net/
http://darknessage.ayudaprogramacion.net/
http://www.ayudaprogramacion.net/

Proyecto: MMORPG
Completado: 2%
Estado: En Desarrollo...

Prg

wow, wow, wow!!!!
está increible.

porqué no usas put_pixel para poner las texturas, así no tienes que guardar en memoria los ids, y con clear screen borras lo puesto con put_pixel

[code language="bennu"]import "mod_text";
import "mod_grproc";
import "mod_video";
import "mod_map";
import "mod_screen";
import "mod_rand";
import "mod_say";
import "mod_mouse";
import "mod_dir";
import "mod_math";
import "mod_proc";
import "mod_string"
import "mod_key";
import "mod_draw";
import "mod_time";
import "mod_sound";
import "mod_wm";
import "mod_regex";
import "mod_file";
import "mod_sys";
import "mod_blendop";
import "mod_mem";
import "mod_debug";

private
val;
begin


set_mode(800,600,32);
from y=50 to 250;
  from z=50 to 150;
  put_pixel(z,y,rgb(50,50,z));
  end
end

while(!key(_esc))
  if (key(_enter))
     clear_screen();
  end
 
  if (key(_a))
    val=rand(50,250);
    from y=50 to 250;
      from z=50 to 150;
           put_pixel(z,y,rgb(val,50,z));
      end
    end
  end
frame;
end
end[/code]

en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

put_pixel()... Una de tantas que no conocía ni había usado nunca, ok, probaré!!!

Gracias
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

Drumpi

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)

josebita


Windgate

Drumpi, fallo mío, sí que uso put_pixel, tenía en la cabeza que era draw_pixel...

Gracias josebita xD

Y bueno, aquí os dejo en primicia la iluminación de Gouraud que acabo de implementar:


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

Errores conocidos:

1) La iluminación está recién introducida, y no es combinable aún con el texturizado, esto significa que al iluminar se colorea en escala de grises. La luz es blanca rgb(255,255,255) aunque no me costará mucho mejorar todo esto.

2) Éste es grave... El algoritmo de interpolación de vértices para obtener la iluminación de un punto está basado en polígonos de 3 lados, sólo lee los 3 primeros vértices... Tengo el problema de que, para figuras de más de 3 vértices, la interpolación requiere una ordenación de los vértices por distancia y es algorítmicamente mucho más complejo, así que lo dejo para luego :P
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

FreeYourMind

Hola. Acabo de probar tu visor en 3 minutillos. Yo como tenia la r101 para windows (uso Vista), he tenido que volver a compilar.
No se muy bien trabajar con el, ya que no consigo que los objetos salgan texturizados como pones en tus pantallas, lo más visible que he conseguido ha sido la pantalla que te envio.

Aunque por lo poco que he visto al probarlo y por tus imagenes esta espectacular. Muchas gracias por tu trabajo.

Windgate

Hi FreeYourMind, la verdad es que con la integración de la iluminación he dejado el visor un poco "tocado", lo que he subido es una beta por así decirlo.

El texturizado lo he machacado por completo, aunque ya lo estoy integrando otra vez gracias a get_rgb() que me permite mezclar el color de la textura con el de la iluminación.

Lo que me muestras en pantalla probablemente sea porque has tocado el punto de vista, te explico un par de cosas a tener en cuenta para usar el visor correctamente tal y como está:

1) No toques el punto de vista por ahora, son aperturas de ángulo de visión y cosas así que no dan más que problemas al modificarlas :S

2) Antes de poder calcular la iluminación hay que hacer un wireframe.

3) Una vez hecho el render no se puede borrar la figura.

Vamos, que lo mejor que puedes hacer es mostrar wireframes hasta lograr una vista "agradable" y entonces ya renderizas. Ya he comentado que por ahora la iluminación de polígonos de más de 3 vértices está sin implementar, pero ya tengo en mente una forma de hacerla para polígonos de hasta 6 vértices (En la práctica no usaré polígonos de más vértices).

Ten en cuenta eso, que es una beta, durante esta semana la dejaré cerrada... No esperéis demasiado porque voy a contrarreloj con él y no podré meterle todo lo que quisiera... Pero para curiosos de "cómo se hizo el 3D" aquí quedará el visor xD

PD: Si me sobra tiempo dejaré una opción para mostrar por pantalla los cálculos matriciales que cambian la perspectiva o la rotación, como mínimo son curiosos de ver.
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

hola, yo tampoco pude hacer que la verisón 1.0.3 funcionara  con el render... sin embargo he solucionado el problema de que no se borra lo que tienes...

he colocado el clear_screen en donde tienes un delete_draw en en for y me funcionó... je je je... te paso lo que moví de la 1.0.1 que es la que me ha funcionado el render

[code language="bennu"]FUNCTION borrar_wireframe()
BEGIN
   delete_text(all_text);
   FROM num_lineas=0 TO indice-1;

      delete_draw ( dibujo[num_lineas] );
   END
   clear_screen();
   indice=0;
END[/code]

después del primer render haces la rotación, le das a wireframe y luego a render y taran!!!...

te lo dejo aquí, espero te sirva :)

http://www.mediafire.com/download.php?mzonmzouydz

lo de los textos, no estoy muy seguro qué sea, quizá algun delete por ahí o alguna otra cosita... :)

la linea
[code language="bennu" options="singleline"]delete_draw ( dibujo[num_lineas] );[/code]
podrías cambiarla por:
[code language="bennu" options="singleline"]delete_draw ( 0 ); //borra todo lo que draw ha pintado[/code]
y sacarlo del bucle.
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

delete_draw ( 0 ) !!!

Me da la impresión de que ahí tenemos la solución, gracias Prg!!!

Amigos, claro que no les funciona el render en la 1.0.3, les explico:

1) Hay que calcular el Wireframe
2) Hay que calcular la iluminación, puesto que es render con iluminación
3) Si intentamos hacer render no nos deja porque el dibujo no ha cambiado, así que hay que Transformar escena y por ejemplo escalar (1,1,1) que no cambia nada pero hace pensar al programa que sí :P
4) Ya podemos hacer el render

Como les dije, la iluminación está metida deprisa y corriendo, ahora estaba intentando solucionarlo.

El algoritmo de Gouraud para polígonos de N vértices es... es... Infernal...
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

delete_draw(0) sólo borra lo que has puesto con draw
el clear_screen() borra el render. ya lo verás en el link que te pasé. en el modulo de video :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DCelso

windgate, te está quedando genial. Si le insertases lectura y escritura en algún formato estándar sería una muy buena utilidad
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Windgate

Lo tendré en cuenta DCelso, pero tras las decenas de docenas de horas que llevo programando... Cuando termine con esto me tomaré un descanso y luego ya veremos :P

El formato Md2 era sencillito de implementar por ejemplo...

Aún no he mirado tu link Prg, cuando saque un ratillo ::)

EDIT: Solucionado el tema de líneas de menú desaparecidas, he visto que tenía delete_text ( all_text ) forzados que se ejecutaban 2 veces... Ya sé que no debería tener mucho que ver, pero dejándolos sólo una vez funciona bien :P
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

Por fín conseguí integrar la textura con la iluminación, por ahora sólamente con la textura de mármol, ya que con la textura de madera tengo algún error pendiente de revisar...


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

Ahora que ya tengo hecho lo que quería me falta simplemente mejorar interfaz, usabilidad, etc. Agradezco sugerencias, quejas, insultos e ideas, sobre todo insultos :P

EDIT: ¡¡¡IMPORTANTE!!! He tenido que retocar el tema de superficies/polígonos porque no, no son lo mismo :P
Esto implica que si queréis ver el cilindro así de bonito como en la captura anterior debéis cargar el archivo: cilindro_unisuperficie.ig

Con los demás veréis cosas raras... Estoy en ello :P

EDIT 2: Añado captura de la madera, ahora mejorada haciendo los anillos del tronco y esas cositas xD


EDIT 3: Y he probado la carga de varios objetos, para componer escenas, esta captura me pone cachondo


En la nueva versión estoy metiendo nuevos objetos .ig un poco más grandes para no tener que escalarlos cada vez que los cargas, viento en popa!!!
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