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. Había comentado un problema de líneas que se iban "al infinito" pero ya está arreglado, se trataba del puntero al último vértice del polígono, y es que el último vértice es siempre el primero (El polígono tiene que cerrarse!!!) y tenía un puntero que almacenaba datos no inicializados...

Además he añadido un módulo de verborrea. No se trata de ninguna enfermedad digestiva, la verborrea es el texto que muestra el programa para controlar las direcciones de memoria a las que apuntan los punteros, los puntos iniciales y finales de las líneas dibujadas, etc. Con unas CONST se determina cuál verborrea se muestra y cuál no, incluso se puede activar una CONST para que toda la verborrea sea bloqueante, y pida pulsar Intro para mostrar la siguiente. Ese módulo me será útil en el futuro a la hora de debugear programas que hacen operaciones peludas y es difícil saber por dónde revientan xD

Aquí la descarga de la v0.6b: http://www.mediafire.com/?1zyd2tn1wnj

Podéis hacer alguna prueba y dibujar cualquier cosita a ver qué os parece.

En el interfaz se cambian los valores de los puntos de 1 en 1 pulsando arriba y abajo y de 100 en 100 pulsando izquierda y derecha, para que sea más rápido. Me costaba menos hacerlo así que andar leyendo enteros desde teclado y tener que comprobar errores en la entrada... ¿Alguna sugerencia al respecto? Las funciones son independientes y sería muy muy fácil cambiarlas por algo mejor (interfaz_aux.prg).

Por ahora no tengo ninguna duda que no raye exclusivamente en el álgebra y en matrices de traslación... Pero ya llegarán y os las preguntaré. Gracias por todo como siempre :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

Esto es un horror...

He incluído un módulo que se encarga de mostrar información formateada por pantalla sobre las direcciones a las que apuntan los punteros, las coordenadas calculadas, etc. Si no es imposible controlar la ejecución :P

Tengo todo el código escrito, pero el periodo de pruebas de este programa está siento terrible, no consigo más que valores astronómicos de dibujado, dejo aquí el link de la versión actual como mera curiosidad:

DESCARGAR: http://www.mediafire.com/?ttxhrofzwof
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

Quoteno consigo más que valores astronómicos de dibujado, dejo aquí el link de la versión actual como mera curiosidad:
mmm, a qué te refieres con valores astronómicos? valores muy grandes? no será por divición de floats entre cero... bueno, no se...  :)

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

Windgate

La trigonometria que hay debajo del visor es impresionante... Por un lado esta la dificultad de entender como funcionan las matrices de transformacion de coordenadas, los angulos de visionado rho, thetha y phi y otras tantas cosas matematicas nada agradables, creeme...

Tambien me he basado en un pseudocodigo para implementacion de renders, y aunque lo he portado a Bennu minuciosamente, siempre queda la posibilidad de que tenga cualquier error, por eso ahora mismo no tengo mas que probar y testear hasta el infinito...

La division por 0 en Bennu segun lo que he probado produce una salida inmediata del programa, todavia no he detectado si el problema es a causa de la division por 0, ahora mismo tengo el modulo que informa de todas las operaciones por pantalla y es cuestion de ir viendo la ejecucion y los valores que va generando el programa para transformar las coordenadas del mundo en 3D a coordenadas de pantalla totalmente en 2D.

Un error grave corregido recientemente es la trigonometria de Bennu que se basa en milesimas de grado y me ha dado algunos quebraderos de cabeza hasta que me he dado cuenta del estupido error ;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

Prg

mmm si la divición es con floats entonces te dará un # indf o lo que es lo mismo el infinito y más ayá (las diviciones con cero, si son floats, no producen la salida abrupta del programa, si no un número infinito)

también ten cuidado al usar las trigonométricas inversas, ya que ahí tenía algunos problemas yo cuando inicié a trabajar con angulos en 3d :)
saludos
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

Trigonométricas inversas no tengo, sólo seno, coseno y tangente.

Lo que me dices de infinitos... Cierto es que muchas veces genero valores y al mostrarlos por pantalla con write me sale "nan"...

Quizás sean los infinitos que dices, nunca lo había visto. Sigo haciendo pruebas, he estado un par de días ocupado formateando.
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

He localizado algunos errores garrafales, tenía funciones con variables PRIVATE que morían, dejando un puntero a sus variables PRIVATE vivo en otra función... Eso provocaba algún cuelgue de vez en cuando, direcciones de memoria iguales que guardaban 2 cosas distintas y bueno, ya os imagináis.

Subo versión sin cambios visibles, simplemente un nuevo interfaz con muestreo de información en "plan juego RPG" gracias a un módulo cortesía de Dario (Gracias Dario).

Ahora mismo estoy creando un formato de fichero del que leer la información de vértices, polígonos, etc. Ya que como os dije, se trata de un proyecto para la Universidad y me piden que se lea la información desde fichero, y no desde teclado como lo venía haciendo hasta ahora.

El avance: Lento, aunque ahí está, y el plazo de entrega termina en poco más de una semana así que ya veremos.

DESCARGAR: http://www.mediafire.com/?ziy3rooim2m
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

DCelso

te recomendaría que utilizases algún formato existente, en vez de uno prioritario, para ello, ya sea xml u otro similar así podrás usar otros programas para comprobar resultados.
http://computacion-grafica-avanzada.blogspot.com/2009/03/formatos-de-archivo-para-modelos-3d.html

Hay muchos más, busca uno facilote, en modo texto que se adapte a tus necesidades.
http://www.mallorcaweb.net/juanki/JC/practicas/lig/ig.doc
http://www.caddyspain.com/noticias/stl.htm
http://www.arquitectuba.com.ar/curso-sketchup-gratis/exportacion-de-modelos-3d-3ds/
http://en.wikibooks.org/wiki/Choosing_The_Right_File_Format/Vector_3D
http://commons.apache.org/math/apidocs/org/apache/commons/math/geometry/Vector3DFormat.html

Uff, yo estoy muy pez en el tema, a ver si alguien como PRG o linkernel podría aconsejarnos alguno que conozca. Yo recuerdo uno que usaba arquitectura xml y servía para interpretarse directamente en los navegadores, pero no recuerdo cual era.
Monstruos Diabólicos

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

Windgate

Jarl amiguete, es que el formato nos lo dan ellos y nos tenemos que adaptar, si no de qué xD

Sobre el MD2 hice una presentación en la Universidad bastante chula, pero es demasiado complejo para lo que pretendo, con tener información de vértices, polígonos y superficies me sirve. Y poder mostrar las figuras rotadas, escaladas, desplazadas... Que esa es la parte gorda...

Al menos ya me funciona la lectura del formato desde fichero, dejo la nueva versión, ahora me queda solucionar el wireframe, que en versiones anteriores me mostraba algo, pero ahora no :P

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

El fichero de prueba se llama objeto.ig, hay que introducir por teclado el nombre para cargarlo.

Por cierto, para ello he creado una sencilla función para leer cadenas desde teclado (string = string + ascii básicamente, saltando repeticiones de lectura de tecla), pero claro, no puedo borrar si me equivoco :( ¿Hay algo ya hecho para leer cadenas desde teclado en Bennu?

Con la tontería también me he creado otra función para recibir enteros por teclado, pero tengo el mismo problema para borrar.
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

yo hice esto:

[code language="bennu"]
/**************************/
/* escanea teclado por prg*/
/*16 abril del 2009, bennu*/
/**************************/
import "mod_text";
import "mod_grproc";
import "mod_video";
import "mod_map";
import "mod_screen";
import "mod_key";
import "mod_wm";
import "mod_file";
import "mod_say";
import "mod_draw";
import "mod_string";
import "mod_effects";
import "mod_debug";
import "mod_math";
import "mod_sys";
import "mod_mem";
import "mod_dir";
import "mod_regex";

private
string car;
begin
set_mode(800,600,32);

escanea_teclado(0,400,300,4,&car,0);
frame;
end

//gr=gráfico a usar
function escanea_teclado(int fuente_int,x,y,alin,string * mi_texto,int gr)
private
   
   contador=0, contador1;
   car_act;
   mitexto_string;
   press;

   string trabajo;
   int  pos,possel;
   
begin

   z=-206;
   graph=gr;
   mitexto_string=write_var(fuente_int,x,y,alin,trabajo);

   trabajo=mi_texto[0];
   pos=len(mi_texto[0]);

   while (not key(_enter))

      if (ascii<>0 or key(_backspace) or key(_space) or key(_del))
         if (press ==false)
         if (key(_backspace)or key(_del))
                                        while (key(_backspace))
                                        if (pos<>0)
               mi_texto[0]=substr(mi_texto[0],0,pos-1)+substr(mi_texto[0],pos,len(mi_texto[0]));
               end
               pos--;
               trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
               frame(300);
               end
               while (key(_del))
               mi_texto[0]=substr(mi_texto[0],0,pos)+substr(mi_texto[0],pos+1,len(mi_texto[0]));

               trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos+1,len(mi_texto[0]));
               frame(300);
               end
         elseif (ascii > 32 AND ascii < 126)

         mi_texto[0]=substr(mi_texto[0],0,pos)+chr(ascii)+substr(mi_texto[0],pos,len(mi_texto[0]));
         pos++;
                        //len(mi_texto[0])-1

         elseif (key(_space))
         mi_texto[0]=substr(mi_texto[0],0,pos)+" "+substr(mi_texto[0],pos,len(mi_texto[0]));
         pos++;
                        end
            

                                press=true;
                                ascii=0;
         end
      else
         press=false;
      end
      contador++;
                trabajo=mi_texto[0];
                if (contador>15)
                car_act=true;

                                if (car_act==true)
                                trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));
                                end
                else

                car_act=false;
                end
                if (contador>30)
                contador=0;
                end
                while (key(_left)or key(_right))
                trabajo=substr(mi_texto[0],0,pos)+"_"+substr(mi_texto[0],pos,len(mi_texto[0]));

                if (key(_left) & pos>0) pos--; frame(300); end
                if (key(_right) & pos<len(mi_texto[0])) pos++; frame(300); end
                frame;
                end
                if (key(_end) ) pos=len(mi_texto[0]);  end
                if (key(_home) ) pos=0;  end
      frame;
   end
   delete_text(mitexto_string);
   while (key(_enter))  frame; end

end

[/code]

a ver si te sirve, recibe un puntero a una string y cuando presionas enter sale de la función para dejar de leer el teclado... algo as{i como si usaras scanf en c

las teclas inicio, fin y los cursores, suprimir y borrar funcionan. aunque todavía hay cositasraras, como que escriba al reves cuando presionas inicio... o cosas raras que no he revisado

espero te sirva :), si quieres lo puedes modificar
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)


Windgate

lol mañana lo miro a fondo porque ya me voy a mimir pero...

Veo en el código de Prg que accede a componentes de la string como si fuese un vector, ¿Eso se puede hacer siempre o sólo si pasas la string con un puntero?

Recuerdo que en su día (Con Fenix...) no me funcionó y me disgustó...
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

Pues yo usaba algo parecido al de la wiki (siendo malpensado, podría decir que me han copiado :D :D :D) Es lo más sencillo y efectivo: ver el valor ascii de borrar, intro y todos los caracteres especiales que tengan un boton y afecten a la cadena).
Y creo que si, que yo, incluso en Fenix, he accedido a valores de la string, pero guardando como tipo char (valores numéricos creo que daban errores, no se si por la rigidez de tipos de la 084 o por los fallos con los tipos que se metieron en ella)
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

je je
si te fijas hago
[code language="bennu" options="singleline"]mi_texto[0][/code]
siempre, es como si hiciera *mi_texto pero como array, otra forma de acceder... je je je
la costumbre, creo que ahora si se puede trabajar la string como cadena de arrays (no estoy muy seguro), pero en mi ejemplo no lo hago :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

darío

Según creo yo, a los strings se puede acceder como arrays, pero no pueden ser modificados de esa forma, es decir:


...
string s = "Hola"
...
write(0, 10, 10, 0, s[3]); // Válido, escribe 'a'
s[3] = 'd'; // No válido
My sites:
Smart Fpg Editor - Painless FPG Edition for Bennu and PixTudio
fenixlib - .NET support for manipulating PixTudio, Bennu and Div graphic formats