Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Motor3D con dxlib32

Iniciado por Manu343726, 29 de Marzo de 2011, 11:46:00 PM

« anterior - próximo »

Manu343726

Hola.
En el tema de la noticia de XNA  nombré el desarrollo que estoy haciendo:Un motor3D que en el futuro estará basado en dxlib32
He creado este tema para enseñar que sí se puede obtener un rendimiento bastante haceptable con vb.

Si puedo cuelgo una demo con lo que llevo hasta ahora (aproximadamente un mes), pero antes de eso haré una brebe descripción:

El proyecto esta formado por varios modulos (TiposEspacio3D,TiposEspacio2D,CalculoEspacio3D,CalculoEspacio2D,etc) cada uno con el codigo de cada tipo de elemento,como indican sus nombres. En resumen cuento con:

- Un módulo con un conjunto de funciones para el calculo con matrices (Producto matricial, determinante,matriz inversa,etc)
- Otro con el calculo de transformaciones mediante matrices(Rotación, traslación,escalado...)
- Clases para los elementos del espacio tridimensional (Plano3D,Recta3D,Vector3D,Punto3D...)
- Clases del espacio bidimensional (Vector2D, y Point obviamente)
- Modulo de calculo de intersecciones , distancias ... (Distancia punto-punto,interseccion Plano3D-Recta3D,etc)
- Modulo de calculo 2D(Punto dentro de poligono,envolvente de nube de puntos,etc)
- Modulo de cálculo de representaciones(Punto3D a point en diferentes perspectivas)
- Calculo de sombreado-iluminacion
- Clases de objetos (Vertice,Cara,Poliedro...)

El motor está formado por dos capas: Por una parte está la clase Motor3D, que contiene una matriz con los poliedros en memoria y otra con los focos de luz. Ésta a su vez incluye una clase que implementa un buffer de dibujo, el cual conitiene las llamadas a los métodos de dibujo/sombreado. Lo más importante de ésta es que contiene una matriz con la informacion de todas las caras (ésto es el buffer propiamente dicho), el cual se reordena automáticamente según la distancia a la de cada cara a la cámara, lo que permite ocultar las caras tapadas por otras.

Para mejorar el rendimiento, no dibujo todas las caras del buffer, sino que compruebo si éstas "miran" hacia el lado de la camara. Así todas aquellas que miran " hacia atrás" no son dibujadas.

Bueno... si le interesa a alguien daré algunas explicaciones más detalladas. Pero si que me vendría bien la opinión de algunos otros desarrolladores, para comparar los métodos de trabajo.


En concreto la demo que voy a colgar contendrá cuatro poliedros en rotación alrededor del eje z, con un foco de luz,el cual podréis mover con el cursor del ratón.
Si queréis podéis  parar la rotación (tecla P), y trasladar la figura seleccionada(flechas, y teclas C y V para eje Z) y rotarla (Eje Z: tecla Z y X,Eje X teclas W y S, eje Y teclas A y D)

He conseguido con éstas figuras un rendimiento de más de 100 FPS, pero normalmente ronda los 30.  Utilizo un Asus EeePC, así que supongo que a la mayoría os vaya mejor.

PD: Npo consigo colgarlo, ayuda por favor!!!

Hechelion

#1
3D con la librería?
Podrías colgar el código fuente por favor, eso tengo que verlo (Hablo de texturas y luz visualizadas con la librería).

Es que esto se discutió en otro post, la única forma de iluminar una textura y sobre un objeto en 3D sería usar las funciones de pixel (y en realidad la librería solo se usaría para pintar los pixel en la pantalla, porque todo el cálculo no lo harías con la librería) y eso debería bajarte el rendimiento una barbaridad, impensable aplicarlo a un personaje de 100 polígonos por ejemplo (y eso se considera low poly)
sin contar la cantidad de código necesario, mientras que hacerlo en DirectX u OpenGL se hace con pocas líneas y se obtiene un buen rendimiento.

Respecto a juegos 3D en VB6 (no hablo de Dxlib32) hay algunos ejemplos muy buenos usando OpenGL (http://www.youtube.com/watch?v=VZEa1Cqi4Uw) u otras librerías (http://www.truevision3d.com).

PD: Y que quede claro que no estoy "basureando" a la librería, al contrario, la encuentro excelente, si no, no habría gastado las cantidades de horas que le he invertido haciendo mis proyectos con ella.

Manu343726

Lo siento,no me di cuenta que deje el tema a medias:

El dibujo lo hago con GDI+, pero mi objetivo sería usar dxlib32. Como solo uso Draw/FillPolygon supongo que será facil...
DDe ahí la pregunta sobre DRAW_Trapezoid que hice a EX3 en el tema de XNA. ((Vais a pensar que estoy obsesionado con esta funcion,siempre hago preguntas sobre ella...)
Respecto a la iluminación,lo que hago es calcular el color teniendo en cuenta la orientacion de la cara respecto al foco de luz,así tomas como base el color real de la cara y el de iluminacion será mas oscuro cuanto mayor sea el angulo formado por la normal de la cara y la direccion del foco (en realidad el foco es un punto, así que creo el vector formado por el foco y el baricentro de la cara).

Si me dices como, te cuelgo el código (está formado por aproximadamente 10 módulos,hazte una idea).
Tengo entendido que tu tambien usas VB.NET, así que perfecto. ( En concreto uso 3.5).

Hechelion

#3
Gracias, pero no te hagas problema, pensé que lo tenías armado con Dxlib32.

Sobre como subir archivos, prueba en filefactory o Megaupload.

Edit:
Sobre la función, que duda tienes?

Manu343726

#4
Entre las funciones de dxlib32 no he visto ninguna que permita pintar un poligono cualquiera ( por ejemplo,pintar un hexagono verde). Por eso quería saber como funcionaba Trapezoid, para ver si yo podía hacer algo parecido. Y si me decís como trabaja la funcion equivalente que lo hace con texturas (no recuerdo el nombre,DRAW_VertexTexture puede ser?) tambien os lo agradecería,ya que mi objetivo final es poder aplicar texturas a los poliedros,y para eso tengo que saber como deformar una imagen para que se adapte a un poligono.

¿Quieres que te pase el codigo por correo?

Hechelion

#5
No gracias, hace años que decidí que la implementación de enigne no es lo mio.
Pero pensar en ver un cubo con texturas y luz girando a 30 FPS sobre dXlib32 me pareció algo que habría que ojear.

Sobre lo que preguntas, podría darte la explicación, pero ya se ha tratado lo mismo en el foro, así que te dejo los enlaces, si no te queda claro algo, avisa por acá.
Acá sale un ejemplo de como se deben pasar los vertices a las función para ver un trapezoide:
http://www.stratos-ad.com/forums/index.php?topic=14008.0

Te recomiendo que leas este hilo, en especial la explicación de ex3, pues aclara el alcance de la librería a la hora de intentar hacer representaciones 3D usando la librería:
http://www.stratos-ad.com/forums/index.php?topic=14009.msg146260#msg146260

Sobre aplicar una textura a un trapezoide, te recomiendo el siguiente hilo
http://www.stratos-ad.com/forums/index.php?topic=13410.0

[EX3]

Cita de: VBManu en 30 de Marzo de 2011, 12:47:44 AM
Entre las funciones de dxlib32 no he visto ninguna que permita pintar un poligono cualquiera ( por ejemplo,pintar un hexagono verde). Por eso quería saber como funcionaba Trapezoid, para ver si yo podía hacer algo parecido.
Encadenando o combinando varias llamadas a esa funcion podrias crear poligonos complejos, tu hexagono serian dos llamadas por ejemplo, ya que la figura minima a formar siempre es un trapezoide, figura de 4 lados y 4 vertices:
Cita de: Hechelion en 30 de Marzo de 2011, 01:19:40 AM
Acá sale un ejemplo de como se deben pasar los vertices a las función para ver un trapezoide:
http://www.stratos-ad.com/forums/index.php?topic=14008.0

El tema de la funcion similar para dibujar texturas es la deformacion de la presentacion de la textura en si como explicaba en este post que ha rescatado Hechelion:
Cita de: Hechelion en 30 de Marzo de 2011, 01:19:40 AM
Sobre aplicar una textura a un trapezoide, te recomiendo el siguiente hilo
http://www.stratos-ad.com/forums/index.php?topic=13410.0

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Manu343726

Muchas gracias.
Cita de: [EX3] en 30 de Marzo de 2011, 02:38:11 AM
Encadenando o combinando varias llamadas a esa funcion podrias crear poligonos complejos, tu hexagono serian dos llamadas por ejemplo, ya que la figura minima a formar siempre es un trapezoide, figura de 4 lados y 4 vertices:

mmmmmm....creo que así vamos por buen camino.
Todo esto empezo hace mas de un mes,cuando mi padre me dio un libro sobre graficos 3d por ordenador y me reto a hacer algo precido. Resulta que hace unos años(bastantes años) a mi padre le pagaron una pasta por desarrollar un editor 3D (tipo autocad,pero no tanto) y se ayudo de ese libro (Resultó que el librito era del año 85 , y los ejemplos estan en fortran....en fin) Al final el libro solo me sirvio para entender las matrices de transformacion y poco mas, ya que estamos hablando de una epoca en la cual la maxima funcion de dibujo era pintar un rectangulo....Pero por algo se empieza.

Digo esto porque precisamente mi padre me dijo hace poco que las caras poligonales están muy  bien para empezar,pero que para que el motor se pudiera adaptar a los sistema actuales (DirectX por ejemplo) debería usar triángulos....muchos triangulos.

Lo que hace que lo que me propones me venga como anillo al dedo.Mato dos pajaros de un tiro. Pero hay otro probrlema: Como hago triangulos con dxlib32? basta con pasarle 4 vertex y que uno de ellos esté repetido????

Solo por curiosidad (y creo que por algo que se hacerca a la pesadez) podrías explicarme como funciona DRAW_VertexMap ( con como funciona me refiero a su código , como lo hace vamos,digo esto porque creo que no me explique bien).

Muchas gracias


PD: Podrias describirme como colgar archivos en los mensajes??? He intentado colgar los dos archivos del proyecto (el ejecutable y la interop de dxlib32) pero no funciona....


Manu343726

Siento ser tan criptico pero las dudas me salen a saltos....

La ayuda de dxlib32 la hciste con algun tipo de editor de HTML? si es así podrías decirme cual?
Estoy pensando hacer algo parecido, para apuntarlo todo y así no perder mis ideas en el futuro....
Se que apuntarlo todo en un cuaderno acaba mal....por eso prefiero un soporte informático. Y con lo comodo que es html a la hora de enlazar unos temas con otros mediante enlaces e indices....en fin.

[EX3]

Cita de: VBManu en 30 de Marzo de 2011, 11:39:21 AM
Lo que hace que lo que me propones me venga como anillo al dedo.Mato dos pajaros de un tiro. Pero hay otro probrlema: Como hago triangulos con dxlib32? basta con pasarle 4 vertex y que uno de ellos esté repetido????
Pues me temo que no podras ya que todas las funciones trabajan con quads (dos triangulos encadenados).

Cita de: VBManu en 30 de Marzo de 2011, 11:39:21 AM
Solo por curiosidad (y creo que por algo que se hacerca a la pesadez) podrías explicarme como funciona DRAW_VertexMap ( con como funciona me refiero a su código , como lo hace vamos,digo esto porque creo que no me explique bien).
Pues internamente lo que hace es definir un quad mediante dos triángulos con las coordenadas que le pasas. Es el mismo código que usa la librería para armar los sprites y primitivas caja solo que estas calculan sus vértices en base a un origen y un tamaño.

Cita de: VBManu en 30 de Marzo de 2011, 11:39:21 AM
PD: Podrias describirme como colgar archivos en los mensajes??? He intentado colgar los dos archivos del proyecto (el ejecutable y la interop de dxlib32) pero no funciona....
Olvida la opcion de adjuntar archivos a los post del foro. Hace tiempo que no funciona :-/ Usa cualquier otro servicio ligero (Megaupload y similares me parece matar moscas a cañonazos) tipo DropBox como Crate:
http://www.genbeta.com/web/crate-un-servicio-para-compartir-archivos-extremadamente-simple

Cita de: VBManu en 30 de Marzo de 2011, 11:53:48 AM
La ayuda de dxlib32 la hciste con algun tipo de editor de HTML? si es así podrías decirme cual?
Estoy pensando hacer algo parecido, para apuntarlo todo y así no perder mis ideas en el futuro....
Se que apuntarlo todo en un cuaderno acaba mal....por eso prefiero un soporte informático. Y con lo comodo que es html a la hora de enlazar unos temas con otros mediante enlaces e indices....en fin.
Pues la herramienta base es la que sale mencionada en el pie de pagina de la documentación y que es un documentador de código que genera HTML, despues use Fronpage de Office en su día para formatear y completar la información de cada función y secciones, y por ultimo use el Microsoft HTML Help Workshop (obsoleta desde hace unos años) para generar el archivo en formato CHM de Ayuda de Windows. Ya te comento que no es una herramienta muy amigable y falla mucho (me fue una odisea en su dia armar la documentacion y no te quiero contar para actualizar cambios :S). Si quieres lo que puedes hacer es optar directamente por hacerte documentacion en HTML a secas o en otro formato que te sea mas cómodo (incluso un Word o el Google Docs resulta mas comodo al menos para uso personal).

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Manu343726


Hola...
He conseguido subir los archivos a una carpeta publica que he hecho en mi cuenta de SkyDrive
Ésta es la direccion: http://cid-00a443c2ce725615.office.live.com/self.aspx/.Public

Si os gusta colgaré el codigo tambien.... y haber si consigo traspasarlo de una vez a dxlib32!!!!!!!!!
Me ha´riais un favor si me explicais como insertar capturas de pantalla en los mensajes. Gracias

[EX3]

Cita de: VBManu en 30 de Marzo de 2011, 05:55:45 PM
Me ha´riais un favor si me explicais como insertar capturas de pantalla en los mensajes. Gracias
Imageshack.us

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.