You are not logged in.

  • Login

1

Sunday, February 7th 2010, 1:45am

OpenGL/GLUT Problem mit glutkeyboardfunc

Hallo Zusammen,

ich will ein OpenGL/Glut Program schreiben, dass seine Hintergrundfarbe ändert,
wenn man die Taste 'r' oder 'w' drückt. Dazu habe ich folgendes geschrieben:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 void tasten (unsigned char key, int xmouse, int ymouse)
{	
	switch (key){
		case 'w':
			glClearColor (1.0, 0.0, 0.0, 0.0);
			break;

		case 'r': 
			glClearColor (0.0, 1.0, 0.0, 0.0);
		break;

		default:
         break;
	}
}


Mein Problem ist jetzt, dass es die Farbe zwar ändert aber erst dann wenn man nach der Taste auch noch die Maus drückt.
Benutze ich die falsche Funktion? Oder mach ich irgendwas anderes falsch? Ich will, dass es die Farbe direkt ändert, wenn
man die Taste drückt.
Vielen Dank für eure Hilfe.

Bobby253

Hier der ganze Code falls ihr ihn braucht:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdlib.h>
#include <GL/glut.h>   /* includes the necissarie libaries, etc*/

static GLfloat spin = 0.0;

void init(void) 
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glShadeModel (GL_FLAT);
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT);
   glPushMatrix();
   glRotatef(spin, 0.0, 0.0, 1.0);
   glColor3f(1.0, 1.0, 1.0);
   glBegin(GL_POLYGON);
		glVertex2f(-25.0, -25.0);
		glVertex2f(-25.0, 25.0);
		glVertex2f(25.0, 25.0);
		glVertex2f(25.0, -25.0);
		glVertex2f(0.0, 40.0);
   glEnd();
   glPopMatrix();
   glutSwapBuffers();
}

void spinDisplay(void)
{
   spin = spin + 0.10;
   if (spin > 360.0)
      spin = spin - 360.0;
   glutPostRedisplay();
}

void spinDisplay2(void)
{
   spin = spin - 0.10;
   if (spin > 360.0)
      spin = spin - 360.0;
   glutPostRedisplay();
}

void reshape(int w, int h)
{
   glViewport (0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void tasten (unsigned char key, int xmouse, int ymouse)
{	
	switch (key){
		case 'w':
			glClearColor (1.0, 0.0, 0.0, 0.0);
			break;

		case 'r': 
			glClearColor (0.0, 1.0, 0.0, 0.0);
		break;

		default:
         break;
	}
}

void motionleft (int mousex,int mousey)
{
	
	static int lx, ly;
		if (!lx) lx=mousex;			//worng : only choosen first time 
		if (!ly) ly=mousey;
		int dy;
		dy=ly-mousey;        //wrong: only measures movments 
		spin=spin+dy*0.1;

}

void mouse(int button, int state, int x, int y) 
{
   switch (button) {
	  case GLUT_LEFT_BUTTON:
		  if(state == GLUT_DOWN);
			glutIdleFunc(spinDisplay);
		 if (state == GLUT_DOWN)
			 glutMotionFunc(motionleft);
		 if (state == GLUT_UP)
			 glutIdleFunc(NULL);
		 if (state == GLUT_UP)
			 glutMotionFunc(NULL);
         break;
      case GLUT_RIGHT_BUTTON:
         if (state == GLUT_DOWN)
            glutIdleFunc(spinDisplay2);
		 if (state == GLUT_UP)
			 glutIdleFunc(NULL);
         break;
      default:
         break;
   }
}


		
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
   glutInitWindowSize (250, 250); 
   glutInitWindowPosition (100, 100);
   glutCreateWindow ("***- Assignment 2");
   init ();
   glutDisplayFunc(display); 
   glutReshapeFunc(reshape); 
   glutKeyboardFunc(tasten);
   glutMouseFunc(mouse);
   glutMainLoop();
   return 0;
}

This post has been edited 1 times, last edit by "Bobby253" (Apr 5th 2010, 4:32am)


2

Sunday, February 7th 2010, 4:39am

Okay,
hab die Lösung gefunden. Das Bild wurde nur neu gezeichnet, wenn die Maus gedrückt wurde. Deswegen hat sich
nichts getan. Wenn ich ein glutPostRedisplay(); bei meiner tastenfunction einfüge geht es.
Falls jemand das gleiche Problem hat...

Trotzdem Danke.

Vielleicht kann mir jemand erklären wie die glutmotionfunc genau funktioniert. Ich dachte das sie mir mit (int mousex, int mousey)
die Position der Maus mitteilt, aber irgendwie stimmt das nicht ganz.

Ich hätte gerne, dass wenn ich die Maus drücke und gedrückt halte und sie dann nach oben bewege, dass sich das Polyeder schneller dreht und wenn
ich die Maus nachunten bewegen, dass es sich dann langsam dreht. (Bei dem Punkt an dem ich das erste Mal drücke (0,0) will ich Geschwindigkeit v und
dann will ich dass sich die Geschwindigkeit linear ändert, das heißt das zum Beispiel bei (x,1) die Geschwindigkeit v+0.1*1 ist bei (x,2) die Geschwindigkeit
v+0.1*2 ist usw.) Sorry ich hoffe, dass ist verständlich erklärt.

was mein Program macht wenn ich die Maus überhalb meines Startpunktes in Bewegung halte wird die Geschwindigkeit erhöht (je schneller ich die
Maus bewege desto schneller dreht es sich) Bwege ich die Maus unterhalb meines Startpunktes verlangsamt sich die Geschwindigkeit entsprechend. Bewege ich
die Maus nicht (egal wo sie still steht) ist die Geschwindigkeit wieder normal v (meine Startgeschwindigkeit).

Ich hoffe, man versteht was ich meine.

Danke schon Mal für eure Hilfe

Similar threads

Social bookmarks