【发布时间】:2017-08-24 07:58:36
【问题描述】:
我正在制作一个程序,当我单击鼠标按钮时,它会旋转两个三角形重叠的六点星。
- 点击鼠标右键:星星旋转
- 点击鼠标中键:星星的颜色变化(白→蓝)
我已经应用了代码来旋转一个矩形,但是当我单击鼠标右键时,它不会旋转并且会跳转。
而当鼠标中键点击时,变色成功但通过旋转星形进行初始化。我想通过在旋转时单击中间按钮来旋转改变颜色的星星。
请告诉我是什么问题。
/////////////////////////// Header /////////////////////////////
#include <stdlib.h>
#include <GL/glut.h>
float v1[3] = { 365.0, 465.0, 0.0 };
float v2[3] = { 365.0, 420.0, 0.0 };
float v3[3] = { 400.0, 485.0, 0.0 };
float v4[3] = { 400.0, 400.0, 0.0 };
float v5[3] = { 435.0, 465.0, 0.0 };
float v6[3] = { 435.0, 420.0, 0.0 };
static GLfloat spin = 0.0;
//////////////////////// Functions ////////////////////////////
void init(void) {
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void reshape(int w, int h) {
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 500.0, 0.0, 500.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void spinDisplay(void) {
spin = spin + 2.0;
if (spin > 360.0) {
spin = spin - 360.0;
}
glutPostRedisplay();
}
void triangle_1(void) { /////////// first triangle ///////////
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3fv(v1);
glVertex3fv(v4);
glVertex3fv(v5);
glEnd();
}
void triangle_2(void) { ///////// second triangle /////////
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3fv(v2);
glVertex3fv(v3);
glVertex3fv(v6);
glEnd();
}
void triangle_1p(void) { ///// first triangle (color changed) /////
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3fv(v1);
glVertex3fv(v4);
glVertex3fv(v5);
glEnd();
}
void triangle_2p(void) { ///// second triangle (color changed) /////
glColor3f(0.0, 1.0, 0.0);
glBegin(GL_TRIANGLE_FAN);
glVertex3fv(v2);
glVertex3fv(v3);
glVertex3fv(v6);
glEnd();
}
void display(void) { ///////// star display /////////
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
triangle_1();
triangle_2();
glPopMatrix();
glutSwapBuffers();
}
void display_p(void) { ///// star display (color changed) /////
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glRotatef(spin, 0.0, 0.0, 1.0);
triangle_1p();
triangle_2p();
glPopMatrix();
glutSwapBuffers();
}
/////////////////////// Mouse Click ///////////////////////
void mouse(int button, int state, int x, int y) {
switch (button) {
case GLUT_LEFT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(NULL);
break;
case GLUT_MIDDLE_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(display_p);
break;
case GLUT_RIGHT_BUTTON:
if (state == GLUT_DOWN)
glutIdleFunc(spinDisplay);
break;
default:
break;
}
}
//////////////////////////// Main /////////////////////////////
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(300, 300);
glutCreateWindow("6-Point Star");
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
【问题讨论】:
标签: opengl rotation mouselistener