Opengl/GLUT - obsługa myszy

0

Jak w GLUT'cie mam dodać obsługę myszy ???

0

Mam takie funkcje:

void ruchMychyP(int x,int y)
{
 mouse_x = x;
 mouse_y = y;

 itoa(x, board, 10);
 // to potem wyświetlam
}

 
//Funckja wywołana po wciśnięciu klawisza 
void mButtonPressed(int button, int state, int x, int y)
{
 mouse_x = x;
 mouse_y = y;
}

I tak je wywołuje:

glutMotionFunc(&ruchMychyP);         // po ruchu myszki z przyciskiem
glutMouseFunc(&mButtonPressed);        // po wciśnięciu przycisku

Ale nic mi się nie wyświetla - czy to w ogóle działa ???

0

Odświeżam

0

Ale nic mi się nie wyświetla - czy to w ogóle działa ???

Myślę że raczej w dokumentacji jest błąd i te funkcje tak naprawdę nic nie robią.

</irony>Jasne że działają, ale wklejasz wycinek kodu który nie robi właściwie nic (+ potem to wyświetlam), więc nie za bardzo jest jak pomóc.

Napisany z pamięci prosty przykład czegoś co powinno coś wyświetlać (poruszanie myszą + LPM)

float x, y;

void display(void) {
	glBegin(GL_POINTS); glVertex2f(x, y); glEnd();
	glutSwapBuffers(); glutPostRedisplay();
}

void motion(int x_, int y_) {
    x = x_ / 400.0 - 1; y = y_ / -300.0 + 1;
}

int main(int argc, char *argv[]) {
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
	glutInitWindowSize(800, 600);
	glutCreateWindow("Paint 2.0");
	glutDisplayFunc(display);
    glutMotionFunc(motion);
	glutMainLoop();
	return 0;
}
0

Funkcja działa ale gdy próbuje wyświetlić położenie myszki to nie idzie.

0

Funkcja działa ale gdy próbuje wyświetlić położenie myszki to nie idzie.

Ech, nie idzie to faktycznie dokładny opis problemu.

Podsumowując, nie działa Ci kod którego nie podałeś, i spodziewasz się odpowiedzi.

Podaj /cały/ kod, wtedy może ktoś będzie w stanie pomóc...

0

Funkcja od ruchu myszy:

void MouseMotion( int x_, int y_ )
{
    x = x_ / 400.0 - 1; y = y_ / -300.0 + 1;
}

Funkcja wyświetlająca napis:

void DrawString( int x, int y, char *board )
{
    // położenie napisu
    glRasterPos2i( x, y );
   
    // wyświetlenie napisu
    int len = strlen( board );
    for( int i = 0; i < len; i++ )
		 glutBitmapCharacter( GLUT_BITMAP_9_BY_15, board[ i ] );     
}

Funkcja ze sceną 3D:

void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );
   
    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT );
    
     glColor3f(0.0, 0.0, 0.0);
     glBegin(GL_POINTS); 
     glVertex2f(x, y); 
     glEnd();

    // skierowanie poleceń do wykonania
    glFlush();
   
    // zamiana buforów koloru
    glutSwapBuffers();
}

Funkcja główna:

int main( int argc, char * argv[] )
{
    // inicjalizacja biblioteki GLUT
    glutInit( & argc, argv );
   
    // inicjalizacja bufora ramki
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );
   
    // rozmiary głównego okna programu
    glutInitWindowSize( width, height );
   
    // utworzenie głównego okna programu
    #ifdef WIN32
   
    glutCreateWindow( "Program testowy I" );
    #else
   
    glutCreateWindow( "Program testowy I" );
    #endif
   
    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( Display );
   
    // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
    glutReshapeFunc( Reshape );
   
    // dołączenie funkcji obsługi klawiatury
    glutKeyboardFunc( Keyboard );
   
    // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
    glutSpecialFunc( SpecialKeys );

	// obsługa przycisków myszki
    //glutMouseFunc( &MouseButton );
   
    // obsługa ruchu kursora myszki
	glutMotionFunc(MouseMotion);                // po ruchu myszki z przyciskiem

   
    // utworzenie menu podręcznego
    glutCreateMenu( Menu );
   
    // dodanie pozycji do menu podręcznego
    #ifdef WIN32
   
    glutAddMenuEntry( "Aspekt obrazu - całe okno", FULL_WINDOW );
    glutAddMenuEntry( "Aspekt obrazu 1:1", ASPECT_1_1 );
    glutAddMenuEntry( "Wyjście", EXIT );
    #else
   
    glutAddMenuEntry( "Aspekt obrazu - cale okno", FULL_WINDOW );
    glutAddMenuEntry( "Aspekt obrazu 1:1", ASPECT_1_1 );
    glutAddMenuEntry( "Wyjscie", EXIT );
    #endif
   
    // określenie przycisku myszki obsługującej menu podręczne
    glutAttachMenu( GLUT_RIGHT_BUTTON );
   
    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
	return 1;
	
}
0

Rysowanie wywołuje w funkcji Display.

Dlaczego return 1 ?

A dlaczego return 0 ???

0

Wypróbowałem kilka kombinacji i mi nie idzie.
Jak powinna wyglądać funkcja odpowiadająca za ruch myszą a jak za klikanie np. lewym przyciskiem myszy ???

PS: Jak mam zapętlić program bo on tylko coś robi jak się naciśnie klawisz itd. ???

0

Help me

0

Funkcje (callbacki) odpowiedzialne za mysz i klawiaturę zmieniają stan programu (ustawiają jakieś zmienne), a w display rysujesz to co potrzeba.

0

Nie lepiej uzyc czegos nowszego? FreeGLUT, GLFW, SDL (nowszy)? :-)

0
void MouseMotion( int x, int y )
{
 mouse_x = x;
 mouse_y = y;
}
void MouseButton( int button, int state, int x, int y )
{
 mouse_x = x;
 mouse_y = y;
}

I tak je wywołuje:

glutMotionFunc( MouseMotion);
glutMouseFunc(MouseButton);  

I moje pytanie jak wyświetlić kordy położenia myszy ???

0

I moje pytanie jak wyświetlić kordy położenia myszy ???

nooo... przerobić int na string (czy tam char*) dowolnym działającym sposobem i wyświetlić?

... a teraz padnie pytanie jak wyświetlić tekst pod OpenGL/GLUT.
No to niech padnie.
Nauczysz się zadawania prawidłowych pytań :-)

PS. czy ja nie zrobiłem się ostatnio zgryźliwy? :-]

0

... a teraz padnie pytanie jak wyświetlić tekst pod OpenGL/GLUT.
No to niech padnie.

Nie to umiem.

PS. czy ja nie zrobiłem się ostatnio zgryźliwy? :-]

No skąd ...

Dobra w końcu mi się udało.
Moje następne pytanie to zapętlić program ??? Bo on (program) tylko coś robi jak się naciśnie klawisz na klawiaturze.

0

z tego co pamiętam, GLUT ma wewnętrzną pętlę, w której wywołuje funkcję podaną przez glutIdleFunc.

0

z tego co pamiętam, GLUT ma wewnętrzną pętlę, w której wywołuje funkcję podaną przez glutIdleFunc.

Dokładnie, przy czym wykonuje ją wtedy kiedy nic innego się nie dzieje.

Inne rozwiązanie to dopisanie glutPostRedisplay() pod koniec funkcji rysującej (co spowoduje że display() będzie wywoływane w kółko)

0

Użyłem glutIdleFunc() i działa dobrze. Jeszcze jedno pytanie czy moja aplikacja będzie działać tak samo na wszystkich komputerach (raczej nie) ???
Czytałem coś kiedyś o timerach ale nie wiem jak ich używać - GLUT ma takie coś ???

0

Ma (glutTimerFunc), ale o co /dokładnie/ Ci chodzi? Jesli chcesz żeby animacja była tak samo szybka na wszystkich komputerach, obliczasz w każdej klatce ile czasu minęło od poprzedniej (seealso: glutGet(GLUT_ELAPSED_TIME), glut timestep) i odpowiednio zmieniasz scenę.

0

Te timery zostawię na później jednak mam kolejny problem.

Otóż ukł. współ. mysz zaczyna się w lewym górnym rogu sceny natomiast ukł współ. mojej sceny (punkt 0, 0) zaczyna się w jej centralnym punkcie.
Gdy próbuje go przesunąć tam gdzie mysz (ukł. współ.) to obiekty, które są rysowane ulegają deformacji.
Czy będe musiał je jeszcze raz napisać (pozmieniać koordynaty) ???

1 użytkowników online, w tym zalogowanych: 0, gości: 1