C++图形旋转问题 菜鸟真心求教 在线等答案 50
我将正方形移动撞击和三角形旋转两个示例代码结合在一起,希望达到建立一个正方形,方向键可控制旋转,右键响应可开始移动撞击,但撞击功能依然可以实现,旋转的时候只有最初的一帧画...
我将正方形移动撞击和三角形旋转两个示例代码结合在一起,希望达到建立一个正方形,方向键可控制旋转,右键响应可开始移动撞击,但撞击功能依然可以实现,旋转的时候只有最初的一帧画面,一旦按下方向键整个图形都消失了,本人小菜鸟一只,真心求教各位高手指点,在线等答案,另,移动撞击调用的是glutTimerFunc函数,是否可以设置另一个响应使移动停止呢?
#include <windows.h>
#include <gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h>
// 旋转参数
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
//确定多边形绕法的方向
BOOL bWinding = TRUE;
// 参数指定正方形的位置和大小
GLfloat x1 = 100.0f;
GLfloat y1 = 150.0f;
GLsizei rsize = 50;
// 正方形运动变化的步长
GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;
// 窗口的大小
GLfloat windowWidth;
GLfloat windowHeight;
void RenderScene(void)
{
// 旋转图形
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
glRectf(x1, y1, x1+rsize, y1+rsize);
glEnd();
glPopMatrix();
//清空命令缓冲区并交换帧缓存
glutSwapBuffers();
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP) xRot-= 5.0f;
if(key == GLUT_KEY_DOWN) xRot += 5.0f;
if(key == GLUT_KEY_LEFT) yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT) yRot += 5.0f;
if(xRot > 356.0f) xRot = 0.0f;
if(xRot < -1.0f) xRot = 355.0f;
if(yRot > 356.0f) yRot = 0.0f;
if(yRot < -1.0f) yRot = 355.0f;
// 刷新窗口
glutPostRedisplay();
}
void ChangeSize(GLsizei w, GLsizei h)
{
if(h == 0) h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
{
windowHeight = 250.0f*h/w;
windowWidth = 250.0f;
}
else
{
windowWidth = 250.0f*w/h;
windowHeight = 250.0f;
}
glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void TimerFunction(int value)
{
// 处理到达窗口边界的正方形,使之反弹
if(x1 > windowWidth-rsize || x1 < 0) xstep = -xstep;
if(y1 > windowHeight-rsize || y1 < 0) ystep = -ystep;
if(x1 > windowWidth-rsize) x1 = windowWidth-rsize-1;
if(y1 > windowHeight-rsize) y1 = windowHeight-rsize-1;
// 根据步长修改正方形的位置
x1 += xstep;
y1 += ystep;
// 用新坐标重新绘图
glutPostRedisplay();
glutTimerFunc(33,TimerFunction, 1);
}
void ProcessMenu(int value)
{
switch(value)
{
case 1:
glutTimerFunc(33, TimerFunction, 1);
break;
default:
break;
}
glutPostRedisplay();
}
void SetupRC(void)
{
//设置窗口清除色为蓝色
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
int main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Bounce");
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
// 创建右键菜单
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("移动撞击",1);
glutAttachMenu(GLUT_RIGHT_BUTTON);
SetupRC();
glutMainLoop();
} 展开
#include <windows.h>
#include <gl/glut.h>
#include<gl/gl.h>
#include<gl/glu.h>
// 旋转参数
static GLfloat xRot = 0.0f;
static GLfloat yRot = 0.0f;
//确定多边形绕法的方向
BOOL bWinding = TRUE;
// 参数指定正方形的位置和大小
GLfloat x1 = 100.0f;
GLfloat y1 = 150.0f;
GLsizei rsize = 50;
// 正方形运动变化的步长
GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;
// 窗口的大小
GLfloat windowWidth;
GLfloat windowHeight;
void RenderScene(void)
{
// 旋转图形
glPushMatrix();
glRotatef(xRot, 1.0f, 0.0f, 0.0f);
glRotatef(yRot, 0.0f, 1.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
glRectf(x1, y1, x1+rsize, y1+rsize);
glEnd();
glPopMatrix();
//清空命令缓冲区并交换帧缓存
glutSwapBuffers();
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_UP) xRot-= 5.0f;
if(key == GLUT_KEY_DOWN) xRot += 5.0f;
if(key == GLUT_KEY_LEFT) yRot -= 5.0f;
if(key == GLUT_KEY_RIGHT) yRot += 5.0f;
if(xRot > 356.0f) xRot = 0.0f;
if(xRot < -1.0f) xRot = 355.0f;
if(yRot > 356.0f) yRot = 0.0f;
if(yRot < -1.0f) yRot = 355.0f;
// 刷新窗口
glutPostRedisplay();
}
void ChangeSize(GLsizei w, GLsizei h)
{
if(h == 0) h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
{
windowHeight = 250.0f*h/w;
windowWidth = 250.0f;
}
else
{
windowWidth = 250.0f*w/h;
windowHeight = 250.0f;
}
glOrtho(0.0f, windowWidth, 0.0f, windowHeight, 1.0f, -1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void TimerFunction(int value)
{
// 处理到达窗口边界的正方形,使之反弹
if(x1 > windowWidth-rsize || x1 < 0) xstep = -xstep;
if(y1 > windowHeight-rsize || y1 < 0) ystep = -ystep;
if(x1 > windowWidth-rsize) x1 = windowWidth-rsize-1;
if(y1 > windowHeight-rsize) y1 = windowHeight-rsize-1;
// 根据步长修改正方形的位置
x1 += xstep;
y1 += ystep;
// 用新坐标重新绘图
glutPostRedisplay();
glutTimerFunc(33,TimerFunction, 1);
}
void ProcessMenu(int value)
{
switch(value)
{
case 1:
glutTimerFunc(33, TimerFunction, 1);
break;
default:
break;
}
glutPostRedisplay();
}
void SetupRC(void)
{
//设置窗口清除色为蓝色
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}
int main(void)
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Bounce");
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
// 创建右键菜单
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("移动撞击",1);
glutAttachMenu(GLUT_RIGHT_BUTTON);
SetupRC();
glutMainLoop();
} 展开
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询