|
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 ... 13 14 [15] 16 17 ... 30
351
« en: Miércoles 7 de Julio de 2004, 13:41 »
Hola. Lo otro que estaba pensando, es simplemente ver si ambos objetos se intersectan, calcular el nivel de penetración ,separarlos esta distancia , y aplicar un impulso a uno o ambos objetos Esto se puede hacer de manera sencilla sabiendo que las bounding boxes están alineadas con los ejes de coordenadas. Digamos que la esfera la tienes representada como un punto que representa el centro y un flotante que representa el radio: struct punto3d { float x, y, z; }; struct esfera3d { punto3d centro; float radio; };
nota: Estoy usando un LHS. Y cada bounding box está representada por un punto situado en su centro, su anchura/2, su longitud/2 y su altura/2 (recordemos que está alineada con los ejes). Puedes representarla de muchas maneras, pero esta me biene bien para la explicación: struct bbox { punto3d centro; float anchura2; // Eje X float altura2; // Eje Y float longitud2; // Eje Z };
Imaginemos que tenemos el árbol ya construido, y que cada nodo tiene una operación llamada ComprobarColision. En seudocódigo sería algo así: bool nodo::ComprobarColision(esfera3D esfera) { if (esfera abarca la bounding box) return true; if (esfera intersecta la bounding box) { if (este nodo es una hoja) { if (colisiona con la geometría englobada) return true; else return false; } else { for (cada hijo de este nodo) { if (hijo->ComprobarColision(esfera)) return true; } } } return false; }
Según tu pregunta, la parte que quieres saber es la de averiguar si la esfera ha tocado la bounding box, y saber cuánto. Con la representación que te he dado antes es bastante sencillo, y te voy a poner una versión sencilla, la cual detecta más de lo que debería en las esquinas, pero es muy eficiente: // Retorna la cantidad de unidades que la esfera ha penetrado en la caja float bbox_esfera(bbox bb, esfera3d esfera) { if ( bb.centro.x + bb.anchura2 > esfera.centro.x - esfera.radio && // +X bb.centro.x - bb.anchura2 < esfera.centro.x + esfera.radio && // -X bb.centro.y + bb.altura2 > esfera.centro.y - esfera.radio && // +Y bb.centro.y - bb.altura2 < esfera.centro.y + esfera.radio && // -Y bb.centro.z + bb.longitud2 > esfera.centro.z - esfera.radio && // +Z bb.centro.z - bb.longitud2 < esfera.centro.z + esfera.radio ) // -Z { return 0.0f; // No hay colisión } float xgt = bb.anchura2 - esfera.centro.x + bb.centro.x; /* Se calcula de igual manera para las otras cinco caras, eliges la menor, o la que quieras, y la retornas. */ }
Espero que esto te sirva. Un saludo. Ruben3d
352
« en: Miércoles 7 de Julio de 2004, 12:23 »
pero la solucion de Ruben es para C++ O se me ha ido mucho la cabeza , o Ticos está preguntando cómo hacerlo en C++: función privada de una clase Un saludo. Ruben3d
353
« en: Miércoles 7 de Julio de 2004, 01:32 »
Hola. La única manera que hay de pasar un método de una clase como parámetro a una función ya hecha de C es si el método es estático. Si el método no lo es, o bien diseñas una función que acepte punteros a métodos en vez de usar la función de la librería, o bien le pasas otra función y te olvidas del método. Si en cambio tú creas una función que quieres que pueda aceptar métodos (no estáticos) de objetos o funciones tienes dos opciones: - Sobrecargar la función para que acepte ambos casos.</li>
- Que la función acepte un functor, con dos clases hijas que hagan de wrapper para un método y para una función.</li>
El método del functor es, para mi, el más elegante y el que más flexibilidad para muchas cosas da, pero también el que más conocimientos de C++ requiere. Por ello te voy a mostrar el otro: <!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td> XCODE </td></tr><tr><td id='XCODE'><!--exc1--> //// main.cpp//#include <iostream>#include <string>using namespace std; // Esta es nuestra función de pruebavoid funcion(string texto) { cout << "Este texto se escribe desde una funcion:" << endl; cout << " " << texto << endl; } // Esta es nuestra clase de pruebaclass CMiClase { public: void metodo(string texto) { cout << "Este texto se escribe desde un metodo:" << endl; cout << " " << texto << endl; } static void metodoEstatico(string texto) { cout << "Este texto se escribe desde un metodo estatico:" << endl; cout << " " << texto << endl; } }; // Versión que acepta punteros a funcionesvoid enlace( void (*pFunc)(string texto)) { pFunc( "Texto de prueba"); } // Versión que acepta punteros a métodosvoid enlace(CMiClase *pObj, void (CMiClase::*pFunc)(string texto)) { (pObj->*pFunc)( "Texto de prueba"); } int main() { // La versión para funciones. enlace(funcion); // También funciona para métodos estáticos. enlace(CMiClase::metodoEstatico); // La sintaxis para métodos no estáticos varía y, además, hace // falta tener una instancia de la clase. CMiClase objeto; enlace(&objeto, &CMiClase::metodo); cout << "Presione ENTER para finalizar." << endl; getchar(); return 0; }<!--xc2--></td></tr></table><div class='postcolor'><!--exc2--> Como ves, la sintaxis de a versión para métodos difiere. Además, hay que saber el tipo de objeto al crear la función enlace. Con el método de los functors sólo habría que crear una función enlace y se tratarían todos los casos igual. Si estás interesado en ello dimelo y te posteo cómo se hace. Un saludo. Ruben3d
354
« en: Miércoles 7 de Julio de 2004, 00:57 »
me gustaria en VB Pues ponlo en el foro de Visual Basic.
355
« en: Miércoles 7 de Julio de 2004, 00:55 »
Hola. Yo aprendí C con el curso de Nacho Cabanes, que está en esta web. Un saludo. Ruben3d
356
« en: Martes 6 de Julio de 2004, 16:03 »
Pues ni idea de cómo usar la impresora. Eso prueba a preguntarlo en el foro de C/C++. Si quieres te puedo decir cómo obtener la imagen, pero imprimirla ya es otra cosa.
Un saludo.
Ruben3d
357
« en: Martes 6 de Julio de 2004, 16:02 »
Tiene toda la pinta de estar reservando continuamente memoria y no liberarla después.
358
« en: Martes 6 de Julio de 2004, 00:33 »
VS 6.0 Horror Yo lo estuve usando un tiempo y tampoco encontré esa opción. Lo siento.
359
« en: Lunes 5 de Julio de 2004, 14:46 »
Cuando dices imprimir, ¿te refieres a sacarlo por la impresora?
360
« en: Lunes 5 de Julio de 2004, 02:19 »
En VS.NET haz clic en el menú Herramientas. Abre el diálogo Opciones. Haz clic en la categoría Editor de texto, en la subcategoría C/C++. A la derecha, bajo la etiqueta Mostrar, aparecerá la opción Números de línea.
Un saludo.
Ruben3d
361
« en: Domingo 4 de Julio de 2004, 15:03 »
Hola. A mi particularmente no me importa que la gente hable mucho en la taberna del bit. Sin embargo, puestos a limitarlo, se me ocuren varias posibilidades, algunas basadas en lo ya dicho: Limitar la vida de cada discusión. Que sólo se pueda contestar en los primeros X días. Creo que esto podría ocasionar que surgieran nuevas discusiones para poder continuar las caducadas, del estilo "Discusión absurda", "Discusión absurda - Parte 2", "Discusión absurda - Parte 3", etc. Limitar el número de respuestas por discusión. Creo que tendría los mismos problemas que la propuesta anterior. Limitar el número de respuestas/nuevas discusiones por usuario al día. Esto evitaría que un usuario hablara demasiado en ese foro en concreto, y permitiría participar a todos los que quisiesen en cualquier momento. De esta forma, se eliminarían muchos post de contenido nulo, vacío, porque la gente se lo pensaría más al escribir (y si no lo hace, tendría que esperar al día siguiente). La opción de poder postear en ese foro en función del número de mensajes en el resto no me convence, ya que hay periodos en los que la actividad es bastante baja (vacaciones, por ejemplo). Además, se corre el riesgo de que se posteen muchos mensajes sin contenido útil en el resto de foros para poder alcanzar la cota. Se me ocurren variaciones a los anteriores, pero creo que esas son las mejores opciones. Un saludo. Ruben3d edit: Ejemplo de posts vacíos, que no aportan nada: Linux -> Grafico (hay cinco, ver los dos últimos).
362
« en: Domingo 4 de Julio de 2004, 14:44 »
Hola.
A mi me ocurre a veces también lo que mencionas. No sé por qué, muchas veces no se conecta al emulador para transmitir el programa. Finalmente opté por tener siempre abierto el emulador y configurarlo para que tomara como tarjeta de memoria el directorio en donde se compila. De esta manera puedo hacer clic sobre el ejecutable con el explorador de archivos.
En cuanto a depurar, uso un sistema de log y examino los resultados tras la ejecución.
Un saludo.
Ruben3d
363
« en: Domingo 4 de Julio de 2004, 14:40 »
Hola. Me ocurre lo mismo que a ti . He probado diferentes configuraciones y proyectos y me ocurre lo mismo en todos. Me he fijado en que la función pertenece al Windows CE Standard SDK. Como PocketPC es una adaptación reducida, tal vez esté para Windows CE pero no para PocketPC. De todas formas, he probado varias configuraciones para Windows CE y tampoco funciona. No se me ocurre lo que puede estar sucediendo, porque se comporta como si no estuviera linkando la librería, pero sí lo hace. Prueba a preguntar en los foros de PocketPC Development Network, tal vez te puedan ayudar. Un saludo. Ruben3d
364
« en: Domingo 4 de Julio de 2004, 13:21 »
Hola. Lo único que he encontrado sobre pasar imágenes a ASCII es esto: AA ProjectEstá en C, pero no he encontrado nada en Pascal. Un saludo. Ruben3d
365
« en: Domingo 4 de Julio de 2004, 13:11 »
No sé cómo queréis hacerlo exactamente. Lo mejor sería unir los dos árboles sobre un tercero. Pero decís que no podéis usar nada auxiliar. ¿Quiere decir eso que se une sobre uno de los dos?
Un saludo.
Ruben3d
366
« en: Domingo 4 de Julio de 2004, 12:54 »
Creo que sería mejor que cuando alguien se enterara de esos eventos los publicara como noticia.
Un saludo.
Ruben3d
367
« en: Sábado 3 de Julio de 2004, 21:08 »
En la sección Tutorials de la web hay diversos tutoriales, entre ellos están cómo usar el motor con Visual Studio, con Dev-C++ y con CodeWarrior. Eso quiere decir que con esos tres debe funcionar bien. Elige el que más te agrade (o el que más sencillo te resulte de conseguir).
Un saludo.
Ruben3d
368
« en: Sábado 3 de Julio de 2004, 21:02 »
No conocía ese programa, y no sé qué herramientas tendrá, ni qué formato usa para almacenar el audio. Prueba a preguntar en webs dedicadas al programa.
Un saludo.
Ruben3d
369
« en: Sábado 3 de Julio de 2004, 20:55 »
Hola!
También yo estoy contento por el crecimiento del foro, y porque no se ha convertido en un lugar de peticiones de trabajos hechos (como otros foros del tema, donde la mayor parte de los post son del estilo 'Necesito un código que haga tal cosa').
Un saludo.
Ruben3d
PD: Gracias JuanK!
371
« en: Viernes 2 de Julio de 2004, 17:53 »
Hola.
Efectivamente, si el hilo de ejecución está en main con return saldrás de la función, y en este caso, del programa.
En cambio, si estás en alguna subfunción has de usar exit. Esta función realiza las misma acciones que un return en main: para la ejecución del programa y ejecuta las tareas de limpieza (se pueden registrar funciones para que se ejecuten al finalizar) y, a continuación, devuelve al sistema operativo el código de retorno.
Sin embargo, dependiendo de la gravedad de lo sucedido para tener que abortar la ejecución, podrías necesitar el uso de abort. Esta función cancela la ejecución sin realizar las tareas de limpieza y devuelve el control al SO inmediatamente.
En C++ la diferencia entre exit y abort es aún mayor. Con la primera los destructores de los objetos son llamados, mientras que con la segunda no.
Un saludo.
Ruben3d
372
« en: Viernes 2 de Julio de 2004, 17:41 »
Hola. Ya vi tu problema. No es fopen el que da el error, es la asignación de lo que retorna a la variable miembro, a través del '='. Si te fijas, en vez de declarar los objetos declaras punteros a los objetos, y los utilizas sin haber reservado memoria para ellos. Por ello, cuando al método se le pasa el puntero this, que apunta a las variables miembro del objeto, se le pasa un puntero sin inicializar. De esta manera, cuando desde el método intentas escribir en la variable miembro estás incurriendo en una violación de protección de memoria, pues no se ha reservado. ¿Cómo hacer esto? Así: archivo *nuevo = new archivo;
y cuando acabes de usarlo, has de hacer: Con estas llamadas se realiza también las llamadas a los constructores y destructores. Un saludo. Ruben3d
373
« en: Viernes 2 de Julio de 2004, 12:02 »
Hola.
Ayudaría que dijeras de qué juego se trata. Muchos están basados en un engine común y disponen de utilidades para manipular sus archivos de datos.
Un saludo.
Ruben3d
374
« en: Viernes 2 de Julio de 2004, 12:00 »
Hola. Yo te recomendaría que antes de hacer un juego 3D practicaras haciendo juegos 2D, para luego poder saber diferenciar los problemas debidos a la dimensión adicional de los de diseño del juego. Si quieres ahorrar trabajo de recomiendo algún engine ya hecho. Para lo que quieres creo que este te vendría muy bien: Irrlicht EngineUn saludo. Ruben3d
375
« en: Miércoles 30 de Junio de 2004, 22:42 »
De acuerdo, mañana te lo pruebo.
Páginas: 1 ... 13 14 [15] 16 17 ... 30
|
|
|