基于MFC的单文档OpenGL程序中图形无法自动旋转的问题

zhaohuaxishi2010 2011-08-01 11:46:19
基于MFC的单文档OpenGL程序中,绘制了一个立方体,打算让它自动旋转,在视类中添加了成员函数:响应WM_TIMER消息的OnTimer函数,定义了定时器,但是程序运行后可以绘制出立方体,但是图形却不自动旋转,部分代码如下:
void CMFC_EXEView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);

if(cy>0) //yg
{

if((m_oldRect.right>cx)||(m_oldRect.bottom>cy))
RedrawWindow();
m_oldRect.right=cx;
m_oldRect.bottom=cy;
glMatrixMode(GL_PROJECTION); //将当前矩阵设置为投影矩阵,指明当前矩阵为GL_PROJECTION
glLoadIdentity(); //将当前矩阵置换为单位阵
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewport(0,0,cx,cy);
glMatrixMode(GL_MODELVIEW); //将当前矩阵设置为模型矩阵
glLoadIdentity(); //将当前矩阵置换为单位阵
SetTimer(1,45,NULL);//定义计时器
}

void CMFC_EXEView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_fAngleY+=10.0f;//绕Y轴的旋转角
m_fAngleX+=1.0f;
m_fAngleZ+=5.0f;
Invalidate(FALSE);

CView::OnTimer(nIDEvent);
}

不知程序哪里有问题,定义的定时器问什么没有发挥作用?请高手指点一下,谢谢!
...全文
181 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaohuaxishi2010 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 daxingxingya 的回复:]
1、设置像素格式时
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,双缓存 PFD_TYPE_RGBA,
24,……
[/Quote]
这些初始化像素格式的代码是不会有问题的 主要程序时某书中的例程
你的其他建议我都试验过了 还是不能解决问题 不过多谢关注
zhaohuaxishi2010 2011-09-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 doctorwing 的回复:]
GLUT_DOUBLE要用glutSwapBuffers()

GLUT_SINGLE要用glFlush()
[/Quote]

这些都没有问题 我的程序是一本书中的例程 但不能如期运行 修改后好转 但图形不能旋转 因此这个没有问题的 谢谢
zhaohuaxishi2010 2011-09-06
  • 打赏
  • 举报
回复
这段时间忙没有上网 今天才看到大家的回复 十分感谢大家的关心
Ondraw中的代码如下:
void CMFC_EXEView::OnDraw(CDC* pDC)
{
CMFC_EXEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

DrawScene(); //绘制场景 yg
// TODO: add draw code for native data here
}
void CMFC_EXEView::DrawScene() //绘制场景 yg
{
glClearColor(1.0f,1.0f,1.0f,0.0f); //设置背景色为白色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-4.5f);
glPushMatrix();
glRotatef(m_fAngleX,1.0f,0.0f,0.0f);
glRotatef(m_fAngleY,0.0f,1.0f,0.0f);
glRotatef(m_fAngleZ,0.0f,0.0f,1.0f);
//以连续填充四边形串图元方式绘制立方体的前、后、左、右4面
glBegin(GL_QUAD_STRIP);
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(-0.5f,0.5f,0.5f); //1点
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,0.5f); //2点
glColor3f(1.0f,1.0f,1.0f);
glVertex3f(0.5f,0.5f,0.5f); //3点
glColor3f(1.0f,1.0f,0.0f);
glVertex3f(0.5f,-0.5f,0.5f); //4点
glColor3f(0.0f,1.0f,1.0f);
glVertex3f(0.5f,0.5f,-0.5f); //5点
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0.5f,-0.5f,-0.5f); //6点
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-0.5f,0.5f,-0.5f); //7点
glColor3f(0.0f,0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,-0.5f); //8点
glColor3f(1.0f,0.0f,1.0f);

glVertex3f(-0.5f,0.5f,0.5f); //1点
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,0.5f); //2点
glEnd();

glBegin(GL_QUADS); //立方体顶面
glColor3f(1.0f,0.0f,1.0f);
glVertex3f(-0.5f,0.5f,0.5f); //1点
glColor3f(1.0f,1.0f,1.0f);
glVertex3f(0.5f,0.5f,0.5f); //3点

glColor3f(0.0f,1.0f,1.0f);
glVertex3f(0.5f,0.5f,-0.5f); //5点
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-0.5f,0.5f,-0.5f); //7点
glEnd();

glBegin(GL_QUADS); //立方体底面
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,0.5f); //2点

glColor3f(1.0f,1.0f,0.0f);
glVertex3f(0.5f,-0.5f,0.5f); //4点

glColor3f(0.0f,1.0f,0.0f);
glVertex3f(0.5f,-0.5f,-0.5f); //6点
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(-0.5f,-0.5f,-0.5f); //8点
glEnd();
glPopMatrix();
SwapBuffers(wglGetCurrentDC());
}

不过Ondraw中的代码没有问题,否则立方体是不可能绘制出来的
loving_hoping 2011-08-07
  • 打赏
  • 举报
回复
我看了半天,就没见你在哪用m_fAngleY等三个关于角度旋转的变量!
OnTimer里面调用了Invalidate(FALSE);
那你得把OnDraw的代码贴出来啊!
the_venus 2011-08-05
  • 打赏
  • 举报
回复
你应该在OnInitialUpdate()函数里面初始化并调用SetTimer(),在OnDestroy()里面调用KillTimer(),再个重载下OnEraseBkgnd()函数,直接返回TRUE,防止程序擦除背景。
OnSize()函数里面的代码好像不对,你看看这样行不行:
void CMFC_EXEView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
if(cy>0)
{
glViewport(0,0,cx,cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
}
OnTimer()函数这样写:
void CMFC_EXEView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_fAngleY+=10.0f;//绕Y轴的旋转角
m_fAngleX+=1.0f;
m_fAngleZ+=5.0f;
Invalidate(TRUE);
CView::OnTimer(nIDEvent);
}
在OnDraw()函数里面一般这样写:
void CMFC_EXEView::OnDraw(CDC*pDc)
{
CMFC_EXEDoc*pDoc=(CMFC_EXEDoc*)GetDocument();
ASSERT_VALID(pDoc);
//下面是你所要加的代码
glClear(GL_COLOR_BUFFER_BIT);//还可以是其他的缓冲区,用|连接
glLoadIdentity();

//...你的代码
SwapBuffers();//交换缓冲区
}
  • 打赏
  • 举报
回复
怎么看着这么眼熟阿 你是江。。。
l223909 2011-08-04
  • 打赏
  • 举报
回复
顶一下 还是不错的
daxingxing 2011-08-03
  • 打赏
  • 举报
回复
OnTimer(UINT nIDEvent) 里的东西不用边,Invalidate(FALSE)后会自动调用onpaint或ondraw
daxingxing 2011-08-03
  • 打赏
  • 举报
回复
1、设置像素格式时
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER,双缓存 PFD_TYPE_RGBA,
24, // 24-bit color.
0, 0, 0, 0, 0, 0, // Not concerned with these.
0, 0, 0, 0, 0, 0, 0, // No alpha or accum buffer.
32, // 32-bit depth buffer.
0, 0, // No stencil or aux buffer.
PFD_MAIN_PLANE, // Main layer type.
0, // Reserved.
0, 0, 0 // Unsupported.
2、不要把定时器设置在onsize里面,放在视图类得oncreate里面,视图建立放在onsize里你一旦窗口大小变化都是在重新设置定时器,这个是错误的,而是视图建立起来后就设置定时器
3、你在哪画图的立方体,画玩后需加下面几句
glFlush();//画完后就送到显卡计算
SwapBuffers(m_hDC);//交换缓存,只有双缓存能实现动画
4、你画图在ondraw里面或写在onpaint里,onpaint要自己加,一般放在ondraw里就可以啦
fandh 2011-08-01
  • 打赏
  • 举报
回复
貌似应该进栈出栈,pushm...popma...
记得不是很清楚了,应该是的!
我才是心翼 2011-08-01
  • 打赏
  • 举报
回复
GLUT_DOUBLE要用glutSwapBuffers()

GLUT_SINGLE要用glFlush()
月中蓝 2011-08-01
  • 打赏
  • 举报
回复
最关键的是OnDraw里的代码
天鹅梦 2011-08-01
  • 打赏
  • 举报
回复
绘制的函数里做了什么?也就是OnDraw

19,468

社区成员

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

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