DarIOI Publicado 12 de Junio del 2008 Publicado 12 de Junio del 2008 Buenas! Mucho tiempo que no me pasaba por acá, pero no quiere decir que esté ausente. Cosas en lo personal, atender la facultad, y los pequeños aspectos de lo cotidiano, me hacen retrasar un proyecto que tengo en mente para ésta comunidad. Primero que todo quiero que prueben este programita.... es simple, se trata de un visualizador de meshes de un archivo TR4, que se puede observar en dos modos: texturizado y malla ( wireframe ). La idea es que observen bien como se renderizan los gráficos, si ven algo incorrecto, algún error. Nunca me decidí encarar bien el proyecto; primero estuve en OpenGL para pasarme a Directx 7.0, que luego subí a directx 8.1, luego probé implementarlo en varios lenguajes; Visual Basic, microsoft Visual c++, Delphi, y ahora estoy preparandolo en el entorno de c++ Builder (tambien de Borland ). Cambié de paradigmas, de lo procedural para ahora implementarlo en una forma Orientada a Objetos, que me es mucho más fácil entenderlo para mí. La historia ES larga, pero aquí va. Son mis primeros pasos como un programador exitoso. PD: Si Natalie o Turbo puedieran verlo, y darme alguna opinión, hay cosas en cuanto a la gráfica que no estoy muy conforme. TR_Visual_3D.rar
Erogan Publicado 12 de Junio del 2008 Publicado 12 de Junio del 2008 Va a ser interesante ir viendo el avance, ¡¡¡ ánimo !!! -------------------------------------------------------------- Dario, me da una error al intentar arrancar el ejecutable:
Kaliya Publicado 12 de Junio del 2008 Publicado 12 de Junio del 2008 yo no puedo abrirlo,me dice que falta borlndmm.dll
Erogan Publicado 12 de Junio del 2008 Publicado 12 de Junio del 2008 Vale Kali, el borlndmm.dll te lo puedes descargar de aqui. Luego te va a pedir el CC3260mt.dll que lo puedes descargar de aqui Entonces consigues arrancarlo, pero a mi me sale un error: He intentado abrir un archivo .tr4 pero comienzan a salir mensajes de error parecidos a los de la imagen que he puesto y el TR Visual 3D se me cierra. ¿A ti te funciona bien, Dario?
Natalie Publicado 13 de Junio del 2008 Publicado 13 de Junio del 2008 Hello dario, Que bueno que al fin de decidistes a dar el siguiente paso; me acuerdo cuanto te rogó turbo para que te involucraras en esta tipo de programacion. Ya probe el programa, a mi no me da error, seguramente ya tenia los dll de borland instalados de algun otro programa, deve ser algun tipo de opcion de compilacion que no te genera un standalone completo de ejecutable, si no que requiere de algunos runtime de borland, bueno eso te pasa por traicionar a Delphi. Sin envargo aparte de eso hay otro tipo de problemas, primero la pantalla esta seteada a un tamaño fijo bastante grande, como de 1280 x 1024, talvez no todos tenemos un monitor y una tarjeta bastante buena, pero el problema verdadero es que la la ventana de renderizado no muestra nada, al abrir un tr4 y seleccionar cualquier mesh de la lista es imposible ver algo, el problema parece estar relacionado con la camara y el mouse, pareciera que intentantes dar soporte de zoom o pan ó rotado con el mouse ya que por aproximadamente 10 segundos logré ver un mesh rotando en la ventana cuando estaba moviendo el mouse en las lista de meshes pero despues desaparecio y por mucho que intente no logre volver a ver nada. Si estas usando directinput para capturar el movimiento del mouse ten en cuenta que por defecto el movimiento del mouse es reportado cuando lo mueves incluso para otras tareas como moverse para seklecionar el menu archivo, o moverse para selecionar el mesh, deves restringir la captura del movimiento solo cuando se mueve en el area del viewport; sospecho que lo que esta pasando es que la camara se mueve y se pierde cuando se utiliza el mouse para abrir el tr4. espero una revision de tu programita. see ya
DarIOI Publicado 13 de Junio del 2008 Autor Publicado 13 de Junio del 2008 damn! he estado teniendo estos problemas desde hace ya tiempo, y es lo que me desanima constantemente... 1) el problema de los archivos los soluciono creando un programa standalone ( hay una opcion para hacerlo ) 2) lo que reporta luego erogan y Max, es sencillamente raro.... luego lo comprobé yo mismo probando las cosas en otra PC. Creería que el tema radica en que no hay espacio de memoria? problemas al crear el vertex buffer? debería hacer un chequeo minucioso. @natalie: vos no has tenido problemas, pero no te renderiza nada. Mhhh, no estoy usando direct input. Simplemente utilizo un componente llamado Timer que lo asocio al evento de Paint, de tal forma que cada vez que dicho evento es llamado por acción del usuario o del sistema el contenido del panel ( que sería el viewport) es redibujado. No estoy utilizando el metodo SetViewport, eso tendrá que ver?? Veo que el tema se me complica mucho mas de lo que me había pensado. Los mantengo al tanto.
IvanTRFan Publicado 13 de Junio del 2008 Publicado 13 de Junio del 2008 A mi me sale todo bien pero cuando abro un archivo se queda la pantalla del programa en negro.
Marcos Publicado 13 de Junio del 2008 Publicado 13 de Junio del 2008 Felicitaciones Darío por el emprendimiento. A mi también se me ve todo negro como a Ivan2.
Natalie Publicado 13 de Junio del 2008 Publicado 13 de Junio del 2008 ...componente llamado Timer que loasocio al evento de Paint, de tal forma que cada vez que dicho evento es llamado por acción del usuario o del sistema el contenido del panel ( que sería el viewport) es redibujado. mmm, creo que lo que me dices es que pones un componente TIMER en la forma, defines una cantidad de millisegundos de intervalos en que se estara ejecutando y en ese evento llamas al methodo de re-paint o refresh de la forma para generar un evento ONPAINT. y dentro del evento ONPAINT ejectutas las instrucciones para dibujar el mesh selecionado. Supongo entonces que el mesh se redibuja en el viewport girando automaticamente, por eso necesitas el timer para forzar el redibujado aunque el usuario no toque nada. Seguramente el viewport lo defines y lo creas una sola vez cuando inicias el programa, sinenevargo es importante que agregues esos pasos en una rutina aparte para que pueda ser ejecutada desde cualquier otro lado y en cualquier momento que se necesite; esta rutina debe de incluir al final algo haci como: D3DXMatrixIdentity(Matproj); D3DXMatrixPerspectiveFovLH( matProj, PI/4, pcontrol.width/pcontrol.height, 0.1,1000); D3DDEV8.SetTransform(D3DTS_PROJECTION, matProj); En cada evento ONPAINT tienes que llamar la rutina de redibujado que mas o menos debe de tener las siguientes cosas: //definir la posicion, y hacia adonde esta viendo la camara D3DXMatrixLookAtLH( matView^, _v1, _v2, _v3); //eye, at, Up. D3DDEV8.SetTransform(D3DTS_VIEW, matView^); //limpiar el viewport y comenzar la escena. D3DDEV8.Clear(0, NIL, D3DCLEAR_TARGET OR D3DCLEAR_ZBUFFER , Wxcolor(pcolor), 1.0, 0); // Begin the scene. D3DDEV8.BeginScene; //aplicar la matrix del world D3DDEV8.SetTransform(D3DTS_WORLD, matWorld); //poner los parametros de redibujado iniciales // Set the stream source. D3DDEV8.SetStreamSource( 0, VertexBuffer.vbuffer[k].Buffer, VertexBuffer.vbuffer[k].format_size); // Set the vertex shader. D3DDEV8.SetVertexShader(VertexBuffer.vbuffer[k].format); //poner el modo de dibujado, wireframe o texturizado. D3DDEV8.SetRenderState(d3drs_fillmode,VertexBuffer.vbuffer[k].Fill_mode); //dibujar el vertex buffer. (ó usar un list index). D3DDEV8.DrawPrimitive( VertexBuffer.vbuffer[k].primitive,triangles_offset, numtriangles); D3DDEV8.EndScene; //presentar la scena! D3DDEV8.Present( NIL, NIL, 0, NIL) ; //Importante!!, verificar el resultado de esta funcion, si retorna falso entonces el viewport se perdio y hay que recrearlo!; El viewport tambien se deve recrear si el usuario cambia el tamaño del viewport cuando maximiza o cambia el ancho de la forma etc.
DarIOI Publicado 13 de Junio del 2008 Autor Publicado 13 de Junio del 2008 Estoy casi seguro que mis rutinas son perfectas, pues las subí porque me andaban bien. Lo que realmente me tiene muy perdido es que a cada persona le viene con un error distinto... ahora quiero crear un standalone, y resulta que no renderiza, el viewport si se visualiza perfectamente. Estoy metido con C++, porque es el lenguaje que estoy manejando mientras curso en la facultad, y el IDE del Builder es igual al de delphi. Lo que no tengo idea es la estabilidad que guarda el builder con directx, que sospecho que es el problema. éste programita también es una inspiración hacia alguien, y deseo mantener firme el proyecto! explicame natalie: Seguramente el viewport lo defines y lo creas una sola vez cuando inicias el programa, sinenevargo es importante que agregues esos pasos en una rutina aparte para que pueda ser ejecutada desde cualquier otro lado y en cualquier momento que se necesite; esta rutina debe de incluir al final algo haci como: el viewport lo defino con la sentencia: D3DXMatrixPerspectiveFovLH.... y la pongo en el evento OnCreate del form principal, pero ¿donde ó en que caso debería ser llamado nuevamente?
DarIOI Publicado 13 de Junio del 2008 Autor Publicado 13 de Junio del 2008 gracias kali por el apoyo. vayamos despacio. Es un ejecutable standalone, a ver si funciona.. test1.rar
Marcos Publicado 14 de Junio del 2008 Publicado 14 de Junio del 2008 Acabo de colocar este nuevo archivo en la misma carpeta que tu programa. Por un instante se aparece un recuadro gris y desaparece...
Natalie Publicado 14 de Junio del 2008 Publicado 14 de Junio del 2008 el viewport lo defino con la sentencia:D3DXMatrixPerspectiveFovLH.... y la pongo en el evento OnCreate del form principal, pero ¿donde ó en que caso debería ser llamado nuevamente? Primero que nada, acabo de probar el segundo test que subistes, a mi este segundo programa me funciona bien, se ve el cuadrado gris centrado en la pantalla, y permanecio ahi todo el tiempo, en mi computadora no se desapareció. incluso tambien automaticamente el cuadrado ajusta su tamaño cuando la ventana se ajusta de tamaño por el usuario; por lo que parece que el comando D3DXMatrixPerspectiveFovLH se ejecuta cada vez que se repinta la forma o tienes capturado el evento ONRESIZE de la forma, esto esta muy bien. Lo que reporta el amigo marcos de que se ve la ecena por un instante y despues desaparece es lo que me paso a mi con tu primer programa, eso esta raro, me pregunto si en el segundo programa tambien estas usando un TIMER para generar un evento ONPAINT; de ser haci trata de cambiar la cantidad de milisegundos; por ejemplo que se repinte la pantalla 24 veces en un segundo, 1000/24 = 42millisegundos; talvez actualmente tenes definido muy poquito tiempo entre repintado y no le estas dando suficiente tiempo para terminar cuando ya se esta ejeutando el siguiente onpaint. Otra cosa: estas usando este comando? D3DDEV8.Present( NIL, NIL, 0, NIL) Esto tiene que estar inmediatamente depues del D3DDEV8.EndScene; sirve para forzar a la tarjeta de video de que muestre la scena en ese punto del programa, de lo contario el directx mostrara la escena cuando le de la gana( es decir muestra la scena solo hasta que vale la pena, dependiendo de si ya tiene un buffer detrabajo con suficientes datos). El viewport no solo se crea cuando un programa arranca la primera vez; si no que se tiene que volver a crear incluso varias veces durante el tiempo que el programa este funcionando; ya que por diferentes circustancias el viewport se arruina y deja de funcionar, a este estado se le llama un "device lost"; y el problema es mas serio si creastes las texturas con un flag diferente a D3DPOOL_MANAGED ya que ademas de recrear el viewport tienes que cargar las texturas otra vez. En tu rutina de redibujado despues del D3DDEV8.EndScene deves poner algo como: IF D3DDEV8.Present( NIL, NIL, 0, NIL)<>0 THEN recreateViewports; haz esta prueba con el project1.exe que subistes: ejecuta el programa y mientras esta funcionando ve a las propiedades del desktop en windows y en configuracion cambia la calidad de color de 32bit a 16 bit o cambia la resolucion de la pantalla; despues de hacer eso regresa a ver tu programa y notaras que ya no se ve el poligono con la textura, si no que solo se ve el Tpanel o la forma de la ventana principal. Si logras hacer que tu renderizado sobreviva a un cambio de configuracion de pantalla entonces su programa ya maneja la perdida del device. Que en algunas computadoras tu programa solo se vea un instante y despues se desaparesca podria deverse a que el viewport se arruina una vez al arrancar el programa y ya no se vuelve a restaurar. buena suerte
Publicaciones recomendadas
Crear una cuenta o conéctate para comentar
Tienes que ser miembro para dejar un comentario
Crear una cuenta
Regístrese para obtener una cuenta nueva en nuestra comunidad. ¡Es fácil!
Registrar una nueva cuentaConectar
¿Ya tienes una cuenta? Conéctate aquí.
Conectar ahora