|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Ruben3d
Páginas: 1 ... 20 21 [22] 23 24 ... 30
526
« en: Jueves 27 de Mayo de 2004, 22:18 »
Gracias por precisarlo.
Un saludo.
Ruben3d
527
« en: Jueves 27 de Mayo de 2004, 21:23 »
Hola. mandas la matriz (o casi toda) No mando la matriz, mando la dirección de memoria de un elemento. Mandar la matriz sería una gran sobrecarga. Lo que no comprendo por que dices que el codigo queda mas sencillo que el que propuso Franc Porque el algoritmo de multiplicar queda más claro (a mi forma de verlo, pero cada uno tiene su gusto): void Multiply(int a[][MAX],int b[][MAX],int c[][MAX]) { for (int i=0; i<MAX; i++) // Voy seleccionando filas de a for (int j=0; j<MAX; j++) // Voy seleccionando columnas de b // Multiplico fila i de a por columna j de b c[i][j] = productoEscalar(&a[i][0], 1, &b[0][j], MAX, MAX); }
Esta función se podría generalizar fácilmente para matrices que no fueran cuadradas, ya que ahora sólo multiplica matrices de orden MAX (por usar la misma declaración que franc, por motivos de comparación). Yo veo más fácil de entender esta función para alguien que no sepa lo que hace el código, pero como ya he dicho, eso es cosa de cada uno. Un saludo. Ruben3d
528
« en: Jueves 27 de Mayo de 2004, 20:59 »
Buenas. El destructor debe ser virtual siempre q tengas herencia (publica, protegida, privada, virtual) para q se liberen todos los objetos de una forma correcta. Sólo si usas polimorfismo. eso de que si delcaras el destructor virtual la clase es abstracta no es asi Cierto. Donde me referí a 'destructor virtual' debería haber dicho 'destructor virtual puro'. Si tiene TODOS los metodos abstractos puros es una interfaz. Si NO tiene Ningun metodo abstracto puro, no es abstracta Esa explicación parece más la de un interfaz. La idea de la clase abstracta es que no puedas crear instancias, pero no tienes por qué carecer de la posibilidad de implementar los métodos. Lo mismo hemos dicho, solo que, como he dicho justo arriba, me ha faltado la palabra 'puro'. Base *Puntero = new ClaseHija();
Si ClaseHija no tiene su destructor declarado como virtual (no virtual puro!, OJO) entonces nunca se llama al destructor de la clase padre. Ahí tienes un fallo. Es la clase Base la que ha de tener su destructor declarado como 'virtual'. Si no fuera así, al hacer upcasting sólo se llamaría al destructor de la clase Base y no al de ClaseHija. Excelente libro el de Eckel Lo mismo digo. Un saludo. Ruben3d
529
« en: Jueves 27 de Mayo de 2004, 12:45 »
que es animacion vectorial?? Es un modo de animación en el que en vez de guardar una imagen por cada cuadro, con la información de todos los píxeles, se guarda una figura geométrica y se actualizan sus coordenadas en cada cuadro (como hacen la mayor parte de las animaciones en Flash, por eso ocupan tan poco). Un saludo. Ruben3d
530
« en: Jueves 27 de Mayo de 2004, 12:41 »
Hola.
Esa explicación parece más la de un interfaz. La idea de la clase abstracta es que no puedas crear instancias, pero no tienes por qué carecer de la posibilidad de implementar los métodos. Yo lo que haría sería hacer virtual sólo el destructor (según leí en Thinking in C++).
Un saludo.
Ruben3d
531
« en: Miércoles 26 de Mayo de 2004, 21:15 »
Hola.
Cuando mencionas figuras, ¿te refieres a animación vectorial?
Un saludo.
Ruben3d
532
« en: Miércoles 26 de Mayo de 2004, 21:11 »
Pues sí que hay personas que se registran y no activan la cuenta. ¿Serán de los que ponen dirección de correo falsa?
Un saludo.
Ruben3d
533
« en: Miércoles 26 de Mayo de 2004, 19:13 »
Hola.
Supongo que la numeración habrá empezado a partir de quinientos o de mil, o que habrán borrado a miembros inactivos desde el principio, o cosas por el estilo.
Un saludo.
Ruben3d
534
« en: Miércoles 26 de Mayo de 2004, 19:10 »
Hola.
El mensaje de warning te está diciendo que la plataforma para la que tienes configurado el compilador cruzado no se corresponde con la plataforma que tienes conectada. ¿Tienes el PocketPC conectado? Mira a ver si estás compilando código para ARM y resulta que estás lanzando el emulador para testearlo. Para usar el emulador has de seleccionarlo como plataforma objetivo, ya que el código máquina es distinto. Asegurate también de que el ejecutable se crea en el directorio y que lo que falla es la transmisión.
Un saludo.
Ruben3d
535
« en: Miércoles 26 de Mayo de 2004, 18:38 »
Hola. 1.- como trabajar con archivos .bmp en opengl y ponerle textura a los objetos La manera más fácil de cargar un BMP es usar una de las funciones de la librería glaux: AUX_RGBImageRec *auxDIBImageLoad(char *nombre);
Después, con glBindTexture() y glTexImage2D() creas la textura que usa OpenGL. Con esto hecho, cuando pintes un quad, por ejemplo, has de darle coordenadas de mapeado y seleccionar previamente la textura: glBindTexture(GL_TEXTURE_2D, textura); glBegin(GL_QUADS); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1, -1, 1); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1, -1, 1); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1, 1, 1); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1, 1, 1); glEnd();
2.- quiero saber sobre como indico la direccion de la luz ,como configurar la luz ambiente ,como darle "propiedades reflectivas" a los objetos glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Configura la luz ambiental glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Configura la luz difusa glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular); // Configura la luz especular glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); // Posición de la luz difusa glEnable(GL_LIGHT1); // Activa la luz glEnable(GL_LIGHTING); // Activa la iluminación
Esto sirve para configurar una luz (usa iluminación por vértices, así que se nota más en objetos complejos). Ten en cuenta que para cada triángulo o quad que introduzcas has de introducir su normal, para que el back-face removal y el cálculo de luz sea correcto: // Entre glBegin y glEnd, y antes de cada polígono glNormal3f( 0.0f, 0.0f, -1.0f);
Si las normal que le das no está normalizada deberás hacer esto al inicializar para que se normalice automáticamente (o la intensidad de luz dependerá del tamaño del polígono en vez de la orientación y la distancia): Consulta la referencia de estas funciones para más explicación. En cuanto a darle a un objeto propiedades reflexivas, tienes varias posibilidades: o bien renderizas un cubemap por fotograma y se lo aplicas como textura o, si se trata de algo plano (como un espejo), usas el stencil buffer para crear reflexiones en dos pasadas. De todas formas, si no sabes texturizar, mejor no te lies con esto. 3.- quiero escribir,tengo entendido que en glut se puede pero ¡no me sale! GLUT es una librería multiplataforma para aislar al programador de las partes en las que tiene que mediar con el sistema operativo. No es parte de OpenGL. No he usado GLUT, pero puedes escribir sin usarla (mira los links del final). 4.- y por ultimo [...] Usa los mensajes de Windows, leidos con el WndProc. No sé cómo va en GLUT, pero probablemente te esté dando el código de tecla, no el código ASCII. Tal vez haya una función para convertir el keycode a ASCII. Para saber a qué tecla le pertenece qué código lo mejor que puedes hacer es un programa que muestre el código de la tecla que pulses. Ten en cuenta que los cursores, las teclas de función y algunas más no tienen código ASCII que las representen, pero todas tienen un código de tecla. Por último, te darás cuenta de que no he profundizado mucho, pero es que has preguntado muy generalmente sobre todos los campos básicos de OpenGL, y no puedo escribir aqui un libro sobre el tema. Todo esto está muy bien explicado en los siguientes links, a través de tutoriales: Un saludo. Ruben3d
536
« en: Miércoles 26 de Mayo de 2004, 12:49 »
Tienes razón, no se me había ocurrido esa posibilidad que resulta ser (a mi parecer) la más apropiada. Por cierto: un integral gigante La traducción de integer es entero, no integral, que es la versión castellana de integral (sí, el cálculo de integrales (lo opuesto a la derivación), se escribe igual). Un saludo. Ruben3d
537
« en: Miércoles 26 de Mayo de 2004, 12:33 »
Hola. Sabiendo que en memoria la matriz se va a guardar linealmente, se puede definir la función que calcula el producto escalar de la siguiente manera: float productoEscalar(float *v1, int offset1, float *v2, int offset2, int size,);
La función retorna el valor del producto escalar. La explicación de los parámetros es: - v1: Puntero al primer elemento del primer vector.</li>
- offset1: Lo que hay que sumar al puntero para obtener el siguiente elemento.</li>
- v2: Puntero al primer elemento del segundo vector.</li>
- offset2: Lo que hay que sumar al puntero para obtener el siguiente elemento.</li>
- size: Número de elementos en cada vector (dimensión).</li>
Con esta función, para multiplicar la tercera fila por la segunda columna de una matriz m de orden 4 se haría así: // Hay que recordar que el tamaño es [0,n-1] float resultado = productoEscalar(&m[2][0], 1, &m[0][1], n, n);
De esta manera podemos elegir columnas, filas o vectores normales de igual manera, así que tenemos una función aplicable a muchos casos. Un saludo. Ruben3d
538
« en: Martes 25 de Mayo de 2004, 16:21 »
Hola. ¿Donde puedo encontrar información para crear ENGINE(webs,ejemplos,libros...)? Lo más normal es encontrar información sobre cómo crear algunas partes en concreto, como el grafo de escena, el sistema de colisiones, etc. Tú ya debes ver cómo ensamblar todo. De todas formas aqui tienes una serie de artículos que van explicando el desarrollo en C++ de un engine 3d desde el inicio (no está aún acabada la serie): Enginuity¿Teneis vuestras ENGINE a disposición en alguna WEB? No. Además, el interfaz de uso aún está sujeto a cambios y hay partes que hay que saber utilizar (o dicho de otra manera, o se utiliza como yo he pensado o falla). Cuando llegue a la primera versión estable (0.1, con el sistema de partículas más o menos funcional) no me importaría publicar el código: mejor que alguien lo pueda aprovechar por internet a que esté cogiendo polvo en el disco duro. Un saludo. Ruben3d
539
« en: Lunes 24 de Mayo de 2004, 21:24 »
Amilius, cuando dices Funcional, ¿te refieres a Estructurada, o a al paradigma funcional, en el que no pueden haber variables a parte del paso de parámetros, no se declaran tipos y no hay bucles, resolviendo todo por recursividad (basado en el lambda-calculus)?
Un saludo.
Ruben3d
540
« en: Lunes 24 de Mayo de 2004, 21:16 »
541
« en: Lunes 24 de Mayo de 2004, 21:09 »
Bueno, como te dije con el sistema que usa fd_set no puedes saber dónde empieza y acaba cada secuencia de bits, sino que hay una gran lista de bits que se pueden acceder por un índice (eso sí, van seguidos y no se pierde espacio). Tendrías que ingeniar un método para saber dónde está cada secuencia en su interior. En esta web select(), FD_SET(), FD_CLR(), FD_ISSET(), FD_ZERO()hablan de fd_set. Me parece que puedes ver en sys/select.h cómo están definidas las macros. Un saludo. Ruben3d
542
« en: Lunes 24 de Mayo de 2004, 18:41 »
Gracias por el link, no conocía esa web.
Un saludo.
Ruben3d
543
« en: Lunes 24 de Mayo de 2004, 17:57 »
La solución que te he propuesto te permite guardar todos los bits seguidos sin perder espacio (la primera de ellas), pero no te ofrece información de dónde acaba y dónde empieza cada secuencia de bits. ¿Necesitas esta información?
Un saludo.
Ruben3d
544
« en: Lunes 24 de Mayo de 2004, 15:20 »
Hola. Que yo sepa no hay ningún tipo de datos que ocupe un solo bit. El más apropiado para ello sería bool, pero ocupa un byte. Lo que he visto hacer en estos casos es coger un array de char e ir accediendo al bit que quieras posicionandote primero en el array y aplicando una máscara para obtener el bit deseado (esto es lo que se hace con el FD_SET que usa el select() en linux, con macros). Así no desperdicias nada de espacio, pues usas los 8 bits de cada char. También podrías acceder a cada uno directamente con un campo de bits: struct byte { char bit0:1; char bit1:1; char bit2:1; char bit3:1; char bit4:1; char bit5:1; char bit6:1; char bit7:1; };
Un saludo. Ruben3d
545
« en: Lunes 24 de Mayo de 2004, 14:58 »
Hola. Lo primero que tienes que hacer es separar cada uno de los tres números en hexadecimal en una cadena (cada uno va de 00 a FF). Después usa este código para obtener cada uno de ellos: char cadena[16]; // Aqui hay un número en hex. int numero; sscanf(cadena, "%x", &numero);
Tras esto tendrás, en la variable numero, el número en formato entero. NOTA: No sé si el número en hexadecimal a leer por scanf debe de empezar por '0x'. Si es así, añadeselo antes de hacer el sscanf. Un saludo. Ruben3d
546
« en: Lunes 24 de Mayo de 2004, 12:03 »
Hola.
Lo que describes es más bien una librería gráfica, a la que le adjuntas un sistema de partículas.
El engine que mencioné está programado en C++ usando como librería gráfica OpenGL. Entre otras, posee actualmente las siguientes características:
- Sistema de ficheros que permite acceder de manera transparente a archivos que estén en el disco o en un PAK de Quake, con soporte para redireccionar todos los accesos (para mods) y para poder parchear el contenido con sólo dejar en el mismo directorio el PAK con los cambios (gracias a prioridades).
- Sistema para aislar al programador del juego del API de Windows (crear ventanas, mensajes de Windows, etc).
- Sistema de gestión de eventos de entrada (ratón, teclado).
- Sistema de gestión de tiempo, con duración del último cuadro, FPS, cronómetros, cuentas atrás (versiones pausables), pausas por espera activa o SO, etc.
- Sistema de gestión de configuración, que permite crear variables en tiempo de ejecución de varios tipos, modificarlas, cargarlas y guardarlas en disco.
- Sistema de menús, que permite crear varias pantallas con enlaces entre ellas, crear opciones para cambiar las variables dinámicas y extender por herencia para rehacer el método Draw() para así poder cambiar totalmente su aspecto.
- Sistema para gestionar texturas, con soporte para texturas animadas de manera transparente, duplicar texturas (sin duplicar el almacenamiento de cada una), y métodos Play(), Stop(), Rewind(), etc. Es fácilmente extendible para soportar nuevas extensiones, gracias a que define una interfaz para registrar nuevos cargadores.
- Sistema de fuentes, con soporte para múltiples tipos basados en texturas del sistema de texturas (por lo que soporta fuentes animadas).
- El renderer propiamente dicho, con soporte para alpha blending y tintado de texturas.
- Librería matemática con soporte para vectores 2D, 3D y 4D (coordenadas homogéneas), círculos 2D, rectángulos 2D, quads 2D y matrices de orden 4. También diversas colisiones entre ellos y generación de números aleatorios.
- Sistema de log para facilitar la depuración.
- Definición de entidades del juego, ayudantes (estilo al Gizmo de 3dsmax), colisionables, etc.
- Gestor de escena con eventos de colisión programables, movimientos jerárquicos (es muy fácil hacer un sistema planetario con satélites en torno a planetas, y montar naves de múltiples piezas, con eventos de colisión diferentes para cada una).
- Interfaz a extender por el programador para registrar el código del juego en el engine y que lo use.
Aún me queda por hacer:
- Que funcione el sistema de partículas y estabilizar el interfaz de uso. - Profiler, para sacar el tiempo que gasta en cada parte y ver dónde hay que optimizar y eliminar cuellos de botella. - Sonido! - ?Que el código del juego vaya en un dll y no haya que recompilar todo?
Como ves, el engine gestiona más que sólo pintar por pantalla. Si tienes alguna duda en alguno de estos campos, no dudes en preguntar.
Un saludo.
Ruben3d
547
« en: Domingo 23 de Mayo de 2004, 23:46 »
Orientado a objetos, para mi es el mejor para esto (aunque conozco a uno que intenta hacer el juego Asteroides en Caml, siguiendo un paradigma funcional :S).
Un saludo.
Ruben3d
548
« en: Domingo 23 de Mayo de 2004, 18:15 »
Hola. Monopolio de conceptos, tecnicas y metodos en torno a uml No entiendo esta afirmación. Parece que describas más bien el Unified Process. No incluye integracion con otras tecnicas como patrones de diseño, interfaz de usuario, etc Cierto. UML se centra mucho en las clases y su comportamiento e interacción, pero descuida el interfaz con el usuario. De toda formas veo innecesario crear un diagrama que se encargue de describir interfaces, porque se puede hacer directamente un boceto de la interfaz (cualquier IDE moderno trae un editor de formularios con el que se hace muy rápido, como Visual Studio o JBuilder). Respecto a los patrones de diseño, no veo tampoco necesario que se especifiquen. Depende del programador saber cúando está viendo un singleton o un object factory. De todas formas recuerdo haber leido que en Visual Studio .NET 2005 sí iba a haber soporte para patrones, ya veremos cómo queda. definicion separada del proceso de desarrollo Claro, es un estándar de notaciones para diagramas. Necesitas una metodología que los use, como Unified Process, Métrica, Merise, etc. Un saludo. Ruben3d
549
« en: Domingo 23 de Mayo de 2004, 17:14 »
Hola.
UML fue pensado para programación orientada a objetos y, más específicamente, con Java y C++ en mente. Eso no quita que lo puedas usar si programas en C con orientación a objetos, aunque no te da soporte el Rose directamente (tendrías que convertir los diagramas a código manualmente y prescindir de la generación automática de código).
Respecto a la segunda pregunta, no te puedo ayudar, pues uso el Rose Enterprise, no el Rose Real Time.
Un saludo.
Ruben3d
550
« en: Sábado 22 de Mayo de 2004, 21:52 »
Hola.
Bueno, me fui desviando del tema. La verdad es que sí me gustaría ver los diagramas de diseño previos al juego y qué tanto de ellos se ha acabado reflejando en el producto final (aunque se deberían haber ido cambiando si se introducían cambios en el código).
Un saludo.
Ruben3d
Páginas: 1 ... 20 21 [22] 23 24 ... 30
|
|
|