要求用户不干涉的情况下让物体自由旋转,这如果用win32的sdk直接来实现的话,就像Nehe的教程上那样是比较容易做的,可以在空闲事件的情况下调用绘图部分代码;
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))//IsThereAMessageWaiting?
{
TranslateMessage(&msg);//TranslateTheMessage
DispatchMessage(&msg);//DispatchTheMessage
}
else//IfThereAreNoMessages
{
DrawGLScene();
}
但MFC中我不了解到底该怎么弄才好,起先也是想放到空闲事件处理程序中去调用绘图代码,就写了如下代码:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->BOOLCOpenGLDemoApp::OnIdle(LONGlCount)
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
CFrameWnd*pw=(CFrameWnd*)AfxGetMainWnd();
((COpenGLDemoView*)pw->GetActiveView())->DrawGLScene();
returnCWinApp::OnIdle(lCount);
}
可发现效果不对劲,必须要用户的鼠标在上面滑动才会旋转,和要求完全不符合呀。于是我就换了个想法,试着用了一个定时器,让它定时刷新重绘,从而产生出旋转的效果,代码如下:
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->intCOpenGLDemoView::OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CView::OnCreate(lpCreateStruct)==-1)
return-1;
//TODO:Addyourspecializedcreationcodehere
HWNDhWnd=this->GetSafeHwnd();
HDChDC=::GetDC(hWnd);
if(this->SetWindowPixelFormat(hDC)==FALSE)
{//设置像素格式
return0;
}
if(this->CreateViewGLContext(hDC)==FALSE)
{//创建RC并选为所用
return0;
}
if(!this->InitGL())
{//初始化openGL
return0;
}
this->SetTimer(1,10,NULL);
return0;
}
voidCOpenGLDemoView::OnPaint()
{
CPaintDCdc(this);//devicecontextforpainting
this->DrawGLScene();
}
voidCOpenGLDemoView::OnTimer(UINTnIDEvent)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
//控制旋转角度
rTri+=1.2f;
if(rTri>=360.0f)
{
rTri-=360.0f;
}
rQuads-=1.15f;
if(rQuads<=-360.0f)
{
rQuads+=360.0f;
}
InvalidateRect(NULL,FALSE);//角度更新了,通知其重绘
CView::OnTimer(nIDEvent);
}
intCOpenGLDemoView::DrawGLScene()
{//Here'sWhereWeDoAllTheDrawing
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//ClearScreenAndDepthBuffer
glShadeModel(GL_SMOOTH);
glLoadIdentity();//ResetTheCurrentModelviewMatrix
glTranslatef(-1.5f,0.0f,-6.0f);//物体左移1.5,向内移6,相当于移动镜头一样,让物体进入镜头中
glRotatef(rTri,0.0f,1.0f,0.0f);
glBegin(GL_TRIANGLES);//绘制三角形
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(0.0f,1.0f,0.0f);//上顶点
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(-1.0f,-1.0f,0.0f);//左下
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,0.0f);//右下
glEnd();//三角形绘制结束
glShadeModel(GL_FLAT);
glLoadIdentity();
glTranslatef(1.5f,0.0f,-6.0f);
glRotatef(rQuads,1.0f,0.0f,0.0f);
glBegin(GL_QUADS);//绘制正方形
glColor3f(1.0f,0.0f,0.0f);
glVertex3f(-1.0f,1.0f,0.0f);//左上
glColor3f(1.0,1.0f,1.0f);
glVertex3f(-1.0f,-1.0f,0.0f);//右下
glColor3f(0.0f,0.0f,1.0f);
glVertex3f(1.0f,-1.0f,0.0f);//左下
glColor3f(0.0f,1.0f,0.0f);
glVertex3f(1.0f,1.0f,0.0f);//右上
glEnd();//正方形绘制结束
glFlush();
rTri+=1.2f;
if(rTri>=360.0f)
{
rTri-=360.0f;
}
rQuads-=1.15f;
if(rQuads<=-360.0f)
{
rQuads+=360.0f;
}
HWNDhWnd=this->GetSafeHwnd();
HDChDC=::GetDC(hWnd);
SwapBuffers(hDC);
returnTRUE;//EverythingWentOK
}
这下旋转的效果是有的,但由于是强制其重绘,所以画面刷新不过来,即使我用了双缓冲,画面还是闪烁得很。这个问题困惑了我一晚上,到底应该怎么弄呢?
分享到:
相关推荐
mfc+opengl 开发框架,有缩放、旋转、移动功能。
基于MFC的opengl图形 采用几何算法生成图形 实现旋转功能
基于MFC单文档OpenGL打开3D模型,可以打开3DMAX另存为的3ds文件,并将读取文件进行移动、旋转和缩放功能
基于vs2010,建立mfc框架的opengl编程,同时加入鼠标控制,可以使视图进行旋转和缩放,代码亲测有效
在MFC中用 OpenGL 实现三维模型旋转
软件平台VS2010,使用的是MFC+OpenGL,旋转是通过ArcBall实现。左键按下旋转,鼠标滚轮实现缩放,右键平移。
MFC+OPENGL实现3D茶壶的旋转、平移,在运行前先下载需要的GLUT头文件,DLL和Lib文件,把gltu.h放到"VC98/Include/GL"下,把glut.lib和glut32.lib放到"VC9/Lib" 下,glut32.dll和glut.dll放到你创建的应用程序的运行...
在VS2010的MFC下结合OpenGL开发的对于三维图形的旋转,缩放,移动,主要在做多线激光雷达扫描构图时,学习的这部分内容
基于mfc的opengl编程 包含 直线圆 旋转 剪切
MFC框架下OpenGL三角形,四边形,多边形建模和旋转源码和详细完整注释。摘自《Visual C++ OpenGL 应用程序开发》一书的第四章。
MFC OpenGL 中子发射模型 包括文件读取、坐标旋转、图像截取、投影、对话框交互等
创建一个单文档结构的MFC程序, 绘制XYZ轴,并能通过鼠标键盘进行控制,缩放,旋转,移动...窗口大小改变,图形也保持不变形
MFC 单文档 实现opengl 三维旋转 缩放 光照MFC 单文档 实现opengl 三维旋转 缩放 光照MFC 单文档 实现opengl 三维旋转 缩放 光照MFC 单文档 实现opengl 三维旋转 缩放 光照MFC 单文档 实现opengl 三维旋转 缩放 光照...
MFC+OpenGl实现的魔方有旋转动画支持旋转球调节方向,记录操作顺序可以回转。功能还能扩展。
在VC 6.0中配属好OpenGL的环境,并调用OpenGL函数画线和画星星,可以旋转,变色,OpenGL入门
基于MFC的OpenGL实现动态图 vs2010下实现三维图形的旋转、平移、缩放 主要是在xxxView.cpp中的代码
MFC单文档中多视图opengl立方体旋转和文本编辑
在MFC下使用Open GL的一个小例子 简单的实现了物体旋转
基于MFC单文档和OpenGL的三维图像平台,实现图形的平移、旋转、缩放等功能,对初学者有很大的帮助。
OpenGL基于MFC框架下的三球旋转,模拟太阳、地球和月亮的公转与自转。没有贴图