• Sábado 21 de Diciembre de 2024, 11:11

Autor Tema:  Traslacion con OpenGL  (Leído 7960 veces)

dunkelheit

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Traslacion con OpenGL
« en: Domingo 3 de Octubre de 2010, 10:36 »
0
Hola bueno tengo este problema, estoy haciendo un programa que rebote por una region (bordes) haciendo uso de traslacion (el clasico ping pong entre los extremos), estoy diseñando el algoritmo lo malo q sirve para un punto pero si de inicio pongo otro punto no cuadra para el rebote, se que estoy haciendo mal uso de la traslacion, por eso necesito una ayuda de como resolver este problema. gracias de antemano  

Citar
#include <windows.h>
#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

#include <stdlib.h>
#include<conio.h>
#include<iostream>


using namespace std;

GLfloat v = 3.0,a=45,b=0,px=a,py=b,ancho,alto;

void mipoligono() {
    glShadeModel(GL_SMOOTH);
    glBegin(GL_POINTS);
    glVertex2f(a,b);
    glEnd();
}

void objeto_geometrico(void) {
    mipoligono();
}


void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glPointSize(10);
    glTranslatef(px,py,0.0);
    glColor3f(1.0,1.0,1.0);
    objeto_geometrico();
    glFlush();
    glutSwapBuffers();
}

void girar_objeto_geometrico () {
    if(py>=0 && px > 0){
       while(px < ancho-50){
            display();
            cout<<"el valor de a es "<<px<<"y el valor de b es"<<py<<endl;
            px += v;
            py -= v;
        }
    }
}


void reshape(int w, int h) {
    glViewport(0,0,(GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-w/2,w/2,-h/2,h/2, -1.0, 1.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    ancho = w/2;
    alto = h/2;
}

int main(int argc, char **argv) {

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutCreateWindow("mi objeto bajo rotaciones");
    glutReshapeFunc(reshape); // invocamos a display() para dibujar nuestra escena
    glutDisplayFunc(display); // esta funcion llama a girar_objeto_geométrico() mientras no haya evento alguno ocasionado por el usuario
    glutIdleFunc(girar_objeto_geometrico);
    glutKeyboardFunc(teclado); /*glutMouseFunc(mouse);*/
//    glutMouseFunc(control_de_Mouse);
    glEnable(GL_DEPTH_TEST);
    glutMainLoop();
    return 0;
}

dvspeed

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Traslacion con OpenGL
« Respuesta #1 en: Domingo 3 de Octubre de 2010, 13:42 »
0
Hola, la verdad es que no he entendido todo el codigo, pero yo hice hace poco un programa similar así que te cuento lo que hice (utilize una esfera no un punto):
-creas 2 parejas de variables, la primera con la posicion de la bola, y la segunda con la velocidad y direccion de la bola, EJ:
        x=0 y=0  la bola esta en el centro
        fx=0 fy=-1  la bola se mueve hacia abajo
-En la funcion IDLE compruebas que la bola no este fuera de un marco imaginario, y si lo está inviertes la variable fx o fy dependiendo de si la bola se sale por los laterales o por arriba o abajo. Despues de esto modificas las variables x y,  segun las variables fx fy. Ahora dibujas la esfera de esta forma, primero usas glTranslatef(x, y, 0.0) y despues dibujas la esfera(o lo que quieras) con glutWireSphere(1.0).

Hay un par de cosas que haria para que se leyera mejor tu codigo:
-Identa el codigo, aunque C no te oblige, es mejor si usas las tabulaciones
-No escribas funciones que solo llamen a una funcion como la funcion objeto_geometrico que solo llama a mipoligono
-No declares varias variables a la vez como en GLfloat v = 3.0,a=45,b=0,px=a,py=b,ancho,alto;

Además deberías añadir codigo para que los FPS siempre sean los mismos, es decir que el programa tenga siempre la misma velocidad.

A, y una ultima cosa en realidad importa poco, pero para solo usar cout podrias usar C y no C++, tus programas seran mas rapidos

dunkelheit

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Traslacion con OpenGL
« Respuesta #2 en: Domingo 3 de Octubre de 2010, 23:05 »
0
hola gracias por responder,
una consulta como haria para cambiar la coordenada de inicio del  glutWireSphere () para q no siempre sea  0,0

dvspeed

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Traslacion con OpenGL
« Respuesta #3 en: Lunes 4 de Octubre de 2010, 16:31 »
0
Hola, simplemente no puedes, lo mejor es que hagas uso de glLoadIdentity() y de glTranslatef(), con glLoadIdentity digamos que nos  colocamos en el 0 y con glTranslatef nos movemos, cada vez que uses un glTranslatef usara el ultimo punto al que te moviste como 0 por lo que estaras en un modelo relativo, si lo que quieres es mover las cosas usando valores absoultos desde un mismo centro siempre, cada vez que escribas  un glTransatef escribe un glLoadIdentity() justo antes.