opengl 键盘控制的图像平移为什么不能直接显示出来?

qq_39355004 2017-06-29 11:23:03
应该是少了某个函数?
按上下左右没有反应 但是再重新选择菜单重新显示会出现平移之后的图像 求大神解答

// Shadow.c
// OpenGL SuperBible, Chapter 6
// Demonstrates simple planar shadows
// Program by Richard S. Wright Jr.

//#include "stdafx.h"
#include <windows.h>
#include <glut.h>
#include <math.h>
#include <assert.h>
#pragma comment ( lib , "glut32.lib" )
// Define a constant for the value of PI

#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // Don't Start the Dos Windlw

void SetupRC(void) {
//设置窗口背景颜色为黑色
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void ChangeSize(GLint w, GLint h) {
if(h == 0) h = 1;
glViewport(0, 0, w, h);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

if(w <= h) {
glOrtho(-100.0f, 100.0f * h / w, -100.0f, 100.0f * h / w, -100.0f, 100.0f);
} else {
glOrtho(-100.0f * w / h, 100.0f * w / h, -100.0f, 100.0f, -100.0f, 100.0f);
}

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

//在窗口中绘制图形
void RenderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);

//设置点的大小以及线宽
glPointSize(5.0f);
glLineWidth(5.0f);



glClear(GL_COLOR_BUFFER_BIT); //glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西
glColor3f(0.0f, 1.0f, 1.0f);
glRectf(-60.0f, -60.0f, 60.0f, 60.0f); // glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标
glFlush();
glEnd();
glPopMatrix();
glutSwapBuffers();

}

/////////////////////////////////////////////////////////////////////////////////////////////////
//旋转
void SpecialKeys(GLint key, GLint x, GLint y) {
switch(key)
{
case GLUT_KEY_UP:
glTranslatef(0.0,5.0,0.0);
break;
case GLUT_KEY_DOWN:
glTranslatef(0.0,-5.0,0.0);
break;
case GLUT_KEY_LEFT:
glTranslatef(-5.0,0.0,0.0);
break;
case GLUT_KEY_RIGHT:
glTranslatef(5.0,0.0,0.0);
break;
}
}
///////////////////////////////////////////////////////

void idle()
{
glutPostRedisplay();//达到循环的效果
}



/////////////////////////////////////////////////////////////////////////////////////////////////////
void Open(void) {
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT); //glClear,清除。GL_COLOR_BUFFER_BIT表示清除颜色,glClear函数还可以清除其它的东西
glColor3f(0.0f, 1.0f, 1.0f);
glRectf(10.0f, 10.0f, 10.0f, 10.0f); // glRectf,画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标
glFlush();
glEnd();
glutSwapBuffers();

}

//////////////////////////////////////////////////////////////////////////////
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_COLOR_BUFFER_BIT);//GL_COLOR_BUFFER_BIT表示清除颜色
glColor3f(1.0f, 1.0f, 1.0f);
glRectf(-60.0f, -60.0f, 60.0f, 60.0f); //画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标
glFlush(); //保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待)。
glEnd();
glutSwapBuffers();
glutPostRedisplay();
glutMainLoop();

}

//////////////////////////////////////////////////////////////////////////////
const int n=40;
const GLfloat R=30.0f;
const GLfloat Pi=3.1415926536f;
void MyDisplay1()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glColor3f(1.0f, 1.0f, 1.0f);
for(int i=0;i<n;i++)
glVertex2f(R*cos(2*Pi/n*i),R*sin(2*Pi/n*i));
glEnd();
glFlush();
glPopMatrix();
glutSwapBuffers();
glutMainLoop();
}

//////////////////////////////////////////////////////////////////////////////////
void MyDisplay2()
{
glClear(GL_COLOR_BUFFER_BIT);
int p1 [] = {110, 50};
int p2 [] = {20, 0};

glBegin(GL_LINE_LOOP);
glVertex2iv(p1);
glVertex2iv(p2);
glEnd();

glFlush();

}



/////////////////////////////////////////////////////////////////////////
void mymenu(int value){ //菜单

switch(value)
{
case 1:
myDisplay();
glutSpecialFunc(SpecialKeys);
glutMainLoop();

case 2:
exit(0);
case 3:
MyDisplay1();
case 4:
MyDisplay2();
case 10:
//以线条的框架显示图
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
break;
default:
break;
}

}

///////////////////////////////////////////////////////////////////

void myMouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN)
{
glBegin(GL_POINTS);
glVertex2i(x,480-y);
glEnd();
glFlush();
}
}
///////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[]) {
GLint nModeMenu = 0;
GLint nMainMenu = 0;
GLint nColorMenu = 0;

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("多边形演示");
glutReshapeFunc(ChangeSize);

//glutDisplayFunc(Open);
glutDisplayFunc(myDisplay);


glutCreateMenu(mymenu);//注册菜单回调函数
//创建一个菜单

nModeMenu = glutCreateMenu(mymenu);

glutAddMenuEntry("正方形", 1);
glutAddMenuEntry("圆", 3);
glutAddMenuEntry("直线", 4);
glutAddMenuEntry("退出", 2);
//将创建菜单与右键关联,即把菜单设置为右键弹出式菜单
glutAttachMenu(GLUT_RIGHT_BUTTON);

glutMouseFunc(myMouse);
SetupRC();
glutSpecialFunc(SpecialKeys);
//glutPostRedisplay();//重回窗口
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
...全文
356 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2017-07-07
  • 打赏
  • 举报
回复
程序结构有问题! glutDisplayFunc(myDisplay);// 3 个Display 只 loop 这个 ?
schlafenhamster 2017-07-07
  • 打赏
  • 举报
回复
毛病在 void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 1.0f, 1.0f); glRectf(-60.0f, -60.0f, 60.0f, 60.0f); //画一个矩形。四个参数分别表示了位于对角线上的两个点的横、纵坐标 // glEnd(); glFlush(); glutSwapBuffers(); // glutPostRedisplay(); // glutMainLoop(); }
schlafenhamster 2017-07-06
  • 打赏
  • 举报
回复
//glutPostRedisplay();//重绘窗口 为什么 不要 ?
victor_woo 2017-07-06
  • 打赏
  • 举报
回复

void SpecialKeys(GLint key, GLint x, GLint y) {  
    switch(key)  
    {  
    case GLUT_KEY_UP:  
        glTranslatef(0.0,5.0,0.0);
        break;  
    case GLUT_KEY_DOWN:  
        glTranslatef(0.0,-5.0,0.0);  
        break;  
    case GLUT_KEY_LEFT:  
        glTranslatef(-5.0,0.0,0.0);  
        break;  
    case GLUT_KEY_RIGHT:  
        glTranslatef(5.0,0.0,0.0); 
        break; 
    }  
}  
你这里只是调用了函数改变视点位置? 但并未刷新显示,刷新看看
赵4老师 2017-06-30
  • 打赏
  • 举报
回复
搜网络教程“学OpenGL编3D游戏”。

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧