estoy haciendo un proyecto de fin de carrera y he empezado hace poco con opengl. por ahora un problema con opengl, es el siguiente:
hago un suelo con una textura, me sale bien.
despues intento poner una esfera o algo de un color determinado, por ejemplo rojo, y lo que me hace es dibujarme la esfera roja y tambien la textura.
intento solucionarlo guardando matrices en la pila pero aun asi no me funciona bien.
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glPushMatrix();
camara.Update();
drawTerreno();
PushMatrix();
glColor3f(1.0,0.0, 0.0);
glTranslated(90.0, 13.0, -90.0);
glRotatef(Ang,0.0,1.0,0.0);
glScalef(10.0, 10.0, 10.0);
glutSolidSphere (1.0, 16, 16);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
glFlush();
}
drawTerreno() dibuja el suelo y encima quiero dibujar una esfera de color rojo sin que me dibuje el terreno de rojo. tal y como lo he puesto me lo dibuja todo rojo. he probado distintas maneras pero no acierto. como deberia ponerlo????
Yo ni idea de esto, pero vamos... puede ser que al hacer glColor3f(1.0,0.0, 0.0);, aunq lo hagas despues de pintar el terreno, asignas a openGL el color de pintado rojo, y entonces la proxima vez que llames a display() pintara el terreno en rojo... (en resumidas cuentas, que asignar el color rojo despues de pintar el terreno solo te sirve la primera vez, luego siempre pintas en rojo a no ser q lo cambies..)
No se, son especulaciones, como ya te dije ni idea :P
Saludos!
ya he solucionado el problema.
al terreno le doy el color blanco y tambien activo y desactivo la textura antes de hacer la esfera.asi ya funciona
graciasssss
Hace muuuuchiiisiiimoooo que no toco OpenGL, ahora bien, si activas texturas es lógico que todo te lo pintara con esta ella mientras este activa.
Buceando por código que había hecho hace tiempo y tal ... desactivaras las texturas con glDisable(GL_TEXTURE_2D);, si usas texturas 2D, y GL_TEXTURE_1D para las unidimensionales. Esto debería bastar, supongo. Recuerda activarla para usarlas otra vez!
Saludos, ya nos contaras.
UPS! Se me adelanto! :ph34r: :P
gracias. se soluciona como dices.
ahora toca ponerle niebla, transparencias y cosas asi.
buenas a todos!!!!
ahora voy a empezar con el juego 2d. tengo pensado hacer un juego como el arkanoid.
lo que me parece dificil de este juego aparte de todo, , es el tema de controlar que la bola choque en la pared y rebote o choque con algun ladrillo este se destruya y rebote la bola.
aber si me podrias decis alguna manera para hacerlo, antes de ponerme a rebanarme los sesos .
hasta luegoooo
Mira lo que comentan en este post, igual puede servirte de ayuda.
ArkanoidUn saludo.
Citar
aber si me podrias decis alguna manera para hacerlo, antes de ponerme a rebanarme los sesos .
Yo creo q lo mejor es que primero q rebanes los sesos, y si no te sale te ayudamos. Es la mejor forma de aprender :D
Echa un ojo al post que te dice n3k0
Saludos!
gracias chicos!!!
el otro post por ahora no me sirve de mucho, ademas el link para bajarse el juego no me funciona asi que no puedo ver el codigo.
he estado rebanandome los sesos de como detectar las colisiones, pero no lo veo claro.
no se como hacer para saber en que sitio de que ladrillo a colisionado. (nooo)
En el link no estaba disponible el código, solo el ejecutable. Además comentaban que poner más de un punto de control a la bola ayuda bastante a detectar las colisiones. Si pones en la bola 2 puntos de control por lado como comentaba marcode te será más fácil saber como ha golpeado la bola el ladrillo y como tiene que rebotar.
buenas!!!!
tengo un problema programando,aber si me podeis ayudar(programo en C++,OpenGL, GLUT):
void proba()
{
laukitxoak z;
Matrizea m[1][2];
float zutabe =0.0;
float lerro=35.0;
for (int i=0; i<2; i++)
{
z.sortu(0, 35, 3, 35, 3, 38, 0, 38);
m[0][i].sortu(z,true, 0.0, 0.0, 1.0);
m[0][i].marraztu();
z.sortu(-5, 35, -3, 35, -3, 38, -5, 38);
m[0][i].sortu(z,true, 0.0, 0.0, 1.0);
m[0][i].marraztu();
}
/*for (i=0; i<2; i++)
{
m[0][i].marraztu();
}*/
}
tengo una clase laukitxoak donde asigno las coordenadas, solo x e y porque z es 0.asi crea una cara de un cuadrado.
la clase Matrizea tiene como parametros : laukitxoak, true(bool), y las coordenadas de los colores(3 floats).
la funcion sortu() le da a la clase los valores.
la funcion marraztu() dibuja el cuadrado en las coordenadas pasadas.
el problema es el siguiente:
puesto asi el codigo me dibuja los dos cuadrados, pero si pongo los primeros dos marraztu() como comentario y pongo el ultimo marraztu() normal, unicamente me dibuja el ultimo cuadrado.
creo que la matriz sobreescribe siempre la misma direccion de memoria por eso se dibujan unicamente las ultimas coordenadas, pero no se como arreglarlo.
siento aber escrito tanto, pero llevo bastante tiempo con este problema.
ya esta solucionado el problema anterior.
Menos mal, pues lo habia leido un par de veces y seguía sin entender.
buenas!!!!
aqui estoy de nuevo con quebraderos de cabeza del arkanoid. primero quiero decir que es la primera cosa que hago en opengl y el primer juego, asi que puede que os parezca un poco corto, jeje.
he leido el post del andoroid, le esta quedando muy bien, pero hay cosas que no entiendo.
por ejemplo yo no uso el tiempo para multiplicar la posicion de la pelota. tengo puesta una funcion que dibuja la esfera cada 33 milisegundos.
bueno, aqui va mi problema:
ya tengo dibujado el arkanoid, por ahora sin texturas, solo colorines. he implementado las clases, paredes, pelota, ladrillos,...
ahora la duda me viene con el rebote de la pelota dichosa.
he pensado en hacerlo de esta manera:
en la siguiente posicion de la esfera, calculo la distancia del borde del ladrillo con el centro de la esfera, si es menor que el radio de la esfera habra colision. pero no se como calcular el angulo de rebote. todavia no lo he implementado ya que puede que alguien me diga un metodo mas facil y provechoso.
para la pala me parece muy bueno el metodo que comentan en el post del andoroid.
El ángulo de rebote contra la pared es el mismo que lleva antes de chocar pero con el signo cambiado en X o en Y. Si revotas contra una pared vertical cambias el signo horizontal, si chocas con pared horizontal cambias el signo vetical.
Si lo quieres contra una pared de inclinación arbitraria, necesitas guardar la normal de la línea (pared) o el ángulo del vector que la define. A base de multiplicar vectores (dirección DOT normal) o de combinar directamente sus ángulos hayas el vector dirección destino. Atento a normalizar antes y después.
EDIT: Con pared me refiero a cualquier linea de colisión, un ladrillo alineado tendría 4 lineas de borde paralelas a los ejes horizontal y vertical.
Truco sucio: Si te lias, cuando detectes algún tipo de colisión (solapamiento de las figuras) simplemente cambiale el signo a la componente más pequeña en valor absoluto (X o Y) de la velocidad de la pelota. Visualmente da el pego aunque no sea matemáticamente correcto.
buenasss!!!!
gracias por las explicaciones, me han sido de gra ayuda. el juego ya funciona, ahora faltan algunos detalles, como la puntuacion y cosas asi.
tengo una pregunta:
sabeis de donde puedo bajar texturas en bmp para ponerselas a los ladrillos, paredes,..... es que tengo unas pero son feas, es para poner el juego mas vistoso.
cuando lo termine ya lo pondre aqui para que lo veais.
hasta luegooo