es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo pausar la rotación de formas 2D con entrada de mouse?

Logré hacer que estas formas 2D se muevan cuando presiono una tecla especial, y también giran por sí solas. Mi próximo objetivo es hacer que la rotación se detenga cuando haga clic con el mouse. ¿Algún consejo sobre cómo hacerlo, por favor?

Incluya <GL/glut.h>
Incluya

GLfloat angle = 0.0f;
int refreshMills = 30;

std::map< int, bool > keys;
void special( int key, int x, int y )
{
keys[ key ] = true;
}
void specialUp( int key, int x, int y )
{
keys[ key ] = false;
}

/* Funcion de devolución de llamada para eventos de mouse */
void mouse(int button, int state, int x, int y) {
// No tengo idea de qué poner aquí
}

void display()
{
static float xpos = 0;
static float ypos = 0;
static float xpos1 = 0;
static float ypos1 = 0;
static float xpos2 = 0;
static float ypos2 = 0;

const float speed = 0.02;
if( keys[ GLUT_KEY_LEFT ] )
{
    xpos -= speed;
}
if( keys[ GLUT_KEY_RIGHT ] )
{
    xpos += speed;
}
if( keys[ GLUT_KEY_UP ] )
{
    ypos += speed;
}
if( keys[ GLUT_KEY_DOWN ] )
{
    ypos -= speed;
}
if( keys[ GLUT_KEY_F1 ] )
{
    xpos1 -= speed;
}
if( keys[ GLUT_KEY_F2 ] )
{
    xpos1 += speed;
}
if( keys[ GLUT_KEY_F3 ] )
{
    ypos1 += speed;
}
if( keys[ GLUT_KEY_F4 ] )
{
    ypos1 -= speed;
}if( keys[ GLUT_KEY_F5 ] )
{
    xpos2 -= speed;
}
if( keys[ GLUT_KEY_F6 ] )
{
    xpos2 += speed;
}
if( keys[ GLUT_KEY_F7 ] )
{
    ypos2 += speed;
}
if( keys[ GLUT_KEY_F8 ] ) 
{
    ypos2 -= speed;
}


glClearColor( 0, 0, 0, 1 );
glClear( GL_COLOR_BUFFER_BIT );

glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho( -2, 2, -2, 2, -1, 1 );

glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

glPushMatrix();
glTranslatef( xpos, ypos, 0 );
glTranslatef(-0.9, 0.90, 0);
glRotatef(angle, 0.0f, 0.0f, 1.0f); // rotar por ángulo en grados
glBegin ( GL_QUADS ); // Cada conjunto de 4 vértices forma un cuadrilátero
glColor3f (1.0f , 0.0f , 0.0f ); // Rojo
glVertex2f (- 0.6f , 0.2f ); // Definir vértices en sentido contrario a las agujas del reloj (CCW)
glVertex2f (- 0.2f , 0.2f ); // para que la normal (frontal) esté frente a ti
glVertex2f (- 0.2f , 0.4f );
glVertex2f (- 0.6f , 0.4f );
glEnd();
glPopMatrix();

glLoadIdentity();
 glPushMatrix(); 
 glTranslatef( xpos1, ypos1, 0 );
 glTranslatef(-0.9, 0.90, 0);

glRotatef(angle, 0.0f, 0.0f, 1.0f); // rotar por ángulo en grados
glBegin ( GL_TRIANGLES ); // Cada conjunto de 3 vértices forma un triángulo
glColor3f (0.0f , 0.0f , 1.0f ); // Azul
glVertex2f ( – 0.4f , 0.5f );
glVertex2f ( 0.0f , 0.5f );
glVertex2f ( – 0.2f , 0.8f );
glEnd();
glPopMatrix();

glLoadIdentity();
 glPushMatrix(); 
 glTranslatef( xpos2, ypos2, 0 );
 glTranslatef(-0.9, 0.90, 0);

glRotatef(angle, 0.0f, 0.0f, 1.0f); // rotar por ángulo en grados
glBegin( GL_POLYGON ); // Estos vértices forman un polígono cerrado
glColor3f (0.0f , 1.0f , 0.0f ); // Verde
glVertex2f ( 0.6f , 0.3f );
glVertex2f ( 0.8f , 0.3f );
glVertex2f ( 0.9f , 0.5f );
glVertex2f ( 0.7f , 0.7f );
glVertex2f ( 0.5f , 0.5f );
glEnd();
glPopMatrix();

 glutSwapBuffers();
    angle += 2.0f;

}

void Timer( int value )
{
glutPostRedisplay();
glutTimerFunc(refreshMills, Timer, 0); // la próxima llamada a Timer es en milisegundos
}

int main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE );
glutInitWindowSize( 600 , 600 );
glutInitWindowPosition ( 50 , 50 ); // La posición de la esquina superior izquierda inicial de la ventana
glutCreateWindow( “GLUT” );
glutDisplayFunc( display );
// glutMouseFunc ( mouse ); // registrarse el controlador de devolución de llamada para eventos de mouse
glutSpecialFunc( special );
glutSpecialUpFunc( specialUp );
glutTimerFunc( 0, Timer, 0 );
glutMainLoop();
return 0;
}

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para detener la rotación de las formas al hacer clic en el mouse, deberá agregar la función de devolución de llamada del evento del mouse y establecer una señal para indicar si la rotación debe detenerse o no. Aquí hay una implementación de ejemplo:

    En primer lugar, declare una variable booleana global para indicar si la rotación debe detenerse o no:

    “`c++
    bool stopRotation = false;


    A continuación, actualice la función de devolución de llamada del evento del mouse para establecer la señal `stopRotation` en verdadera cuando se hace clic en el botón izquierdo del mouse: ```c++ void mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { stopRotation = true; } }

    Finalmente, actualice la función display para actualizar solo la variable de ángulo y rotar las formas si la señal stopRotation es falsa:

    c++
    void display() {
    // ...
    if (!stopRotation) {
    angle += 2.0f;
    }
    glRotatef(angle, 0.0f, 0.0f, 1.0f); // rotar por ángulo en grados
    // ...
    }

    Con estos cambios, la rotación de las formas se detendrá cuando se haga clic en el botón izquierdo del mouse.

Comments are closed.