"Ningún juego dura tanto hasta que te lo terminas como el que te programas tú mismo,
ninguno te absorbe tanto y ninguno te produce tanta satisfacción cuando lo has acabado"
Programacion de videojuegos
Domingo 05 de Febrero del 2012

Menu principal
Colaborar (con PayPal)

Para continuar con el trabajo de esta Web y poder pagar el hosting, viene bien la ayuda que sea. Gracias a todos.

Importe: 

Ultimas descargas

 Foro de UnSitioWeb :: Sobre el curso de programación de juegos
Bienvenido/a Visitante   
Normas del foro   por Vicengetorix el 04-10-2009 02:30
 Asunto :pregunta sobre el codigo.. 16-11-2009 20:33 
cristiaan3003
Incorporado: 12-11-2009 06:22
Posts: 14
Localización
Hola, ahora estoy leyendo el codigo mirando que hace y tratando de entender ya que estoy haciendo y tp y me lo van a preguntar en detalle

¿Como trabaja leerlinea?
te pregunto sobre la funcion leelinea de la clse fichero.
vos haces un getline de log 200, porque cad tiene esa longuitud, la pregunta es porque 200 de largo, ¿ es porque el fichero cob sus lineas tiene 200 caracteres de largo?
y en esta linea que haces?
porque la variable c va hasta 10?
veo que comparas con \0, eso seria si ha terminado el string?
while( cad != '\0' && (cad == ' ' || cad == '\t') ) i++;
while( cad != '\0' && c < 10 )

En la variable campo , cuando la defines pones

// Aqui dejaremos troceada, la linea,
// en campos separados por espacio o
// tabulador.
char campo[10][200];
, pero despus no entiendo como la usas dentro de la funcion leer linea y afuera pones por ejmplo cob.campo[0], o cob.campo[2].
y no entiendo y me pierdo en el codigo
IP Logged
 Asunto :Respuesta:pregunta sobre el codigo.. 16-11-2009 23:31 
Vicengetorix
Incorporado: 27-12-2008 18:54
Posts: 79
Localización
Vamos por partes.

-200 es también el tamaño con el que he definido el array "char cad[200]" (ahora que lo pienso debería haberla definido con 201 por lo menos para que no pueda dar error de memoria nunca).
Al leer del fichero, es suficiente para leer la mayoria de las líneas y hay que poner el límite en algún sitio. Es una cifra que me ha parecido bien. Si la línea es más larga, la próxima lectura la empezará donde terminó en la última línea.

-La variable "c" la he puesto como máximo en 10 porque creo que el fichero COB no tiene ninguna línea con más de 10 parámetros separados por espacios en una misma línea.

-Efectivamente, '\0' es el carácter nulo que termina las cadenas de caracteres. Si detectas '\0' en una cadena es que ha terminado.

-En el array "char campo[10][200]" guardo 10 cadenas de carácteres (variable "c") de 200 carácteres de longitud (lo que se lee del fichero como máximo, aunque deberían ser de 201 por seguridad). Esas cadenas serán cada uno de los trozos separados por espacios o tabulador ('\t') de la línea del fichero COB. En el caso que la línea sea una con las coordenadas de un vértice, campo[0] contendra un puntero a la cadena de carácteres con la coordenada X, campo[1] con la coordenada Y y campo[2] con la coordenada Z. Si, como en este caso, son campos numéricos se convierten a float con la función atof( campo[0] ), por ejemplo.
En la función "leelinea" se lee del fichero COB una linea (la gran mayoría de las veces entera) y luego, mientras se recorre la cadena que se ha leido, se rellena el array campo[][] con los trozos de la línea que estaban separados por espacios. Si hubiera más de 10 campos, del 11 hacia delante se desprecian, no se usarán. Si hubiera menos de 10, se rellenarán filas del array campo[][] hasta terminar la línea y las últimas ´filas del array no se rellenarán.

Espero que se entienda mejor así.
IP Logged
 Asunto :Respuesta:pregunta sobre el codigo.. 16-11-2009 23:32 
Vicengetorix
Incorporado: 27-12-2008 18:54
Posts: 79
Localización
Perdona, ¿haciendo tp?
IP Logged
 Asunto :Respuesta:pregunta sobre el codigo.. 17-11-2009 03:08 
cristiaan3003
Incorporado: 12-11-2009 06:22
Posts: 14
Localización
hamm entiedno
en la variable "c" guardas digamos el muero de maximo de espacios por linea y en campo lo que hay entre cada espacio. y el 200 es que va a leer una linea de max 200 caracteres .

otra cosa
en
//es como que saltar la 7 primera lineas para empezar a leer desde donde
me interesa que es desde la matris de transformacion??
cob.leelinea(7);??

// Sumo el numero de vertices de esta malla al
// de vertices que llevamos.
V+=atoi(cob.campo[2]);
para que acumulas? en por ejemplo rino.cob tiene 229 Wold Vertices, asi que la primera ves que pasa pone V=229, con eso no estaria ya??

strtok que hace con--> "<34,270>".
lei ayuda en internet de la funcion pero no entiendo la explicacion, no tienes una explicacion tuya clara y cortita?
en
int IndiceCara(puntero a la cadena,int p=1-->esto que seria??)
tp:trabajo practico. tengo un trabajo practico de computacion grafica con opengl
IP Logged
 Asunto :Respuesta:pregunta sobre el codigo.. 17-11-2009 15:24 
Vicengetorix
Incorporado: 27-12-2008 18:54
Posts: 79
Localización
Claro. El formato COB da muchos datos que yo no uso en el programa porque no me hacen falta.
Voy leyendo líneas hasta que encuentro el dato que me interesa.

Acumulo en V el número de vértices porque podría encontrarme más de un malla formando el objeto (el rino es una sola pero es triciclo son varias, mira dentro del archivo COB). En caso de ser más de una malla las cargo en mi programa como si fueran una y luego ordeno los vértices por el material de cada triángulo para ahorrar cambios de material al pintar.

strtok es una función que sirve para trocear una cadena en tokens (trozos) separados por un carácter: http://www.conclase.net/c/librerias/funcion.php?fun=strtok
La primera vez le dices la cadena a trocear y la cadena que contiene los carácteres delimitadores. Ejemplo:
Cadena: "aaaaaa bbbbbbb ccccccc-ddddddd/eeeeeee"
la llamada a strtok(cadena," -/") dara por retorno un puntero a la cadena "aaaaaa".
Las sucesivas veces la llamas con NULL como primer parámetro retronaran los siguientes campos o tokens.
La segunda llamada sería strtok(NULL, " -/"), ya no haría falta decirle la cadena.
Retornaría un puntero a la cadena "bbbbbbb".
Una tercera llamada retornaria "ccccccc", una cuarta "ddddddd" y la quinta "eeeeeee".
Siguientes llamadas retornan NULL.

En una función puedes dar un valor por defecto a los parametros. En el caso concreto de la función IndiceCara, si el segundo parámetro no se lo pongo asumirá que tiene un valor de 1 (1 retorna el primer valor -34- y 2 retorna el segundo -270-).

Te aconsejo que alguna función, como esta, la rehagas tú mismo. No me siento particularmente contento de su implementación.
IP Logged
 Asunto :normales.. 24-11-2009 00:36 
cristiaan3003
Incorporado: 12-11-2009 06:22
Posts: 14
Localización
hola , bueno ahora la consula es sobre para mi una de la parte mas complicada e importante del asunto, no entiendo la parte matematica de calcular las normales

lo hice en papel para horientarme pero me falta vertices
http://img687.imageshack.us/img687/4680/091123193309.jpg
, nose como hace el dibujito, no tens un esquemita como para verlo?

Calculando las normales.

Caras.normal = i*3;
// Pongo en v1 y v2 dos vectores que pertenecen
// a esta cara.
//Vertices=new GLfloat[NVertices][3];
//Vertices[Caras.vertices[1]][0] seria algo asi como Vertices[triangulo.vertice[1][0] de ese triangulo]

v1[0] = Vertices[Caras.vertices[1]][0] -
Vertices[Caras.vertices[0]][0];

v1[1] = Vertices[Caras.vertices[1]][1] -
Vertices[Caras.vertices[0]][1];

v1[2] = Vertices[Caras.vertices[1]][2] -
Vertices[Caras.vertices[0]][2];

v2[0] = Vertices[Caras.vertices[2]][0] -
Vertices[Caras.vertices[0]][0];

v2[1] = Vertices[Caras.vertices[2]][1] -
Vertices[Caras.vertices[0]][1];

v2[2] = Vertices[Caras.vertices[2]][2] -
Vertices[Caras.vertices[0]][2];

// Calculo el producto vectorial(me da un vector normal)
ProdVectorial(v2, v1, r);
// y lo normalizo(para que tng magnitud uno)
Normaliza(r);
IP Logged
 Asunto :Respuesta:pregunta sobre el codigo.. 24-11-2009 02:33 
Vicengetorix
Incorporado: 27-12-2008 18:54
Posts: 79
Localización
El producto vectorial de dos vectores es otro vector perpendicular a los anteriores.
Una vez sabido esto, hallar la normal a un triángulo es facil.
Si un triángulo tiene 3 vértices, se usan estos para encontrar dos de los lados del triángulo y usarlos como vectores. Se halla el producto vectorial de estos dos lados y el resultado sera la normal al triangulo. Luego se normaliza para que el vector normal sea de longitud 1.
La explicación de lo que es la normal está en el capítulo 8 de iluminación:
http://unsitioweb.com/videojuegos/76-8-iluminacion
IP Logged
Página # 


Powered by ccBoard




Banner
Banner