VC的OpenGL程序旋转的问题

zhaohuaxishi2010 2011-09-24 08:28:53
实际上我的这个程序是《实战OpenGL三维可视化系统开发与源码精解》吕希奎等编著的书中第2章中的例子,不过我按照书中重新创建了这个程序并修改后(光盘中没有这个源程序) 发现不能旋转立方体,如果哪位高手有兴趣 希望留下QQ号或邮箱,我把完整程序发送过去 帮我指点或调试一下,或者哪位高手有这个程序并调试成功了给我发送过来也可以,我的QQ号是550411871,离线发送或发送到邮箱都行,多谢了
...全文
156 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vrace 2011-10-07
  • 打赏
  • 举报
回复
你试试在 OnDraw 里面输出点文字之类的看看呢,会不会是 OnDraw 后面没有被调用了?
另外 OpenGL 画图一般都不会是在 WM_PAINT 里面画的
zhaohuaxishi2010 2011-10-06
  • 打赏
  • 举报
回复
wangyingyingqq:你好,资料已经发送到你邮箱。
vrace:你好,你有信箱吗,如果对程序感兴趣,我可以发送到你信箱,部分程序如下:
文件MFC_EXEView.cpp中的所有代码如下:
// MFC_EXEView.cpp : implementation of the CMFC_EXEView class
//

#include "stdafx.h"
#include "MFC_EXE.h"

#include "MFC_EXEDoc.h"
#include "MFC_EXEView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMFC_EXEView

IMPLEMENT_DYNCREATE(CMFC_EXEView, CView)

BEGIN_MESSAGE_MAP(CMFC_EXEView, CView)
//{{AFX_MSG_MAP(CMFC_EXEView)
ON_WM_CREATE()
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMFC_EXEView construction/destruction

CMFC_EXEView::CMFC_EXEView()
{
// TODO: add construction code here

}

CMFC_EXEView::~CMFC_EXEView()
{
}

BOOL CMFC_EXEView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs

cs.style =cs.style|WS_CLIPSIBLINGS|WS_CLIPCHILDREN; //yg
return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_EXEView drawing

void CMFC_EXEView::OnDraw(CDC* pDC)
{
CMFC_EXEDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

DrawScene(); //绘制场景 yg
// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_EXEView printing

BOOL CMFC_EXEView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}

void CMFC_EXEView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}

void CMFC_EXEView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMFC_EXEView diagnostics

#ifdef _DEBUG
void CMFC_EXEView::AssertValid() const
{
CView::AssertValid();
}

void CMFC_EXEView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}

CMFC_EXEDoc* CMFC_EXEView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFC_EXEDoc)));
return (CMFC_EXEDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMFC_EXEView message handlers

int CMFC_EXEView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here

//获取客户区的设备描述表 //yg
m_pDC=new CClientDC(this);
InitializeOpenGL(m_pDC); //初始化OpenGL
SetTimer(1,45,NULL);//定义计时器

return 0;
}

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);//定义计时器
}

// TODO: Add your message handler code here

}

BOOL CMFC_EXEView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default

// return CView::OnEraseBkgnd(pDC);
return TRUE; //yg
}

void CMFC_EXEView::OnDestroy()
{
if(wglGetCurrentContext()!=NULL)
{
wglMakeCurrent(m_pDC->m_hDC,NULL);

}

if(m_hRC!=NULL)
{
wglDeleteContext(m_hRC);
}

if(m_pDC)
delete m_pDC;


CView::OnDestroy();

// TODO: Add your message handler code here

}

BOOL CMFC_EXEView::InitializeOpenGL(CDC *pDC) //yg
{
m_pDC=pDC;
//先把DC的像素格式调整为指定的格式,一边后面对DC的使用
SetupPixelFormat();
//根据DC来创建RC
m_hRC=::wglCreateContext(m_pDC->GetSafeHdc());
//设置当前的RC,以后的画图操作都画在m_pDC指向的DC上
::wglMakeCurrent (m_pDC->GetSafeHdc(),m_hRC);

//下面可以进行画图操作了
GetClientRect(&m_oldRect);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

return TRUE;
}

BOOL CMFC_EXEView::SetupPixelFormat() //yg
{
//初始化象素格式以及选取合适的格式来创建RC
PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR) , // pfd结构的大小
1 , // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持 OpenGL
PFD_DOUBLEBUFFER| // 双缓存模式
PFD_STEREO | //支持立体模式
PFD_TYPE_RGBA , // RGBA 颜色模式
24 , // 24 位颜色深度
0 , 0 , 0 , 0 , 0 , 0 , // 忽略颜色位
0 , // 没有非透明度缓存
0 , // 忽略移位位
0 , // 无累加缓存
0 , 0 , 0 , 0 , // 忽略累加位
32 , // 32 位深度缓存
0 , // 无模板缓存
0 , // 无辅助缓存
PFD_MAIN_PLANE , // 主层
0 , // 保留
0 , 0 , 0 // 忽略层 , 可见性和损毁掩模
};
//在DC中选择合适的象素格式并返回索引号
int pixelformat;
pixelformat=::ChoosePixelFormat(m_pDC->GetSafeHdc() , &pfd);
if (pixelformat==0)
{
MessageBox("选择像素格式失败!" , "设置像素格式" , MB_ICONERROR);
return FALSE;
}
//设置指定象素格式
if (::SetPixelFormat(m_pDC->GetSafeHdc() , pixelformat , &pfd)==FALSE)
{
MessageBox("设置像素格式失败!" , "设置像素格式" , MB_ICONERROR);
return FALSE;
}
return TRUE;

}

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());

}


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

CView::OnTimer(nIDEvent);
}

望指点一二,不胜感激。
vrace 2011-10-03
  • 打赏
  • 举报
回复
你得把画图的代码贴出来啊,光有 WM_TIMER 和 WM_SIZE 不够啊
wangyingyingqq 2011-10-03
  • 打赏
  • 举报
回复
楼主您好,请问如何在基于mfc的单文档下建立opengl框架?我是初学者,好多地方不懂,还请多帮忙,能否提供一下源程序啊,不胜感激!可以的话麻烦发到AnotherHeaven@yeah.net
zhaohuaxishi2010 2011-10-02
  • 打赏
  • 举报
回复
gaohl:
你好,我添加过了glFlush()了,没有什么变化,我看你的排名和技术分很不错,不知有没有兴趣帮我指点一下这个程序,如果有兴趣烦请告知我你的QQ或邮箱,我可以把程序发送过去,请你帮我调试一下程序如何,先谢过了。
量子 2011-09-29
  • 打赏
  • 举报
回复
看看ondraw里面的有没有 glFlush();
天鹅梦 2011-09-29
  • 打赏
  • 举报
回复
你们俩互相日吧
alpha.5 2011-09-29
  • 打赏
  • 举报
回复
楼上的对话很有意思啊; 顶下先..
zhaohuaxishi2010 2011-09-28
  • 打赏
  • 举报
回复
bhybhybhy2:
你明明是女的 为啥要搞个男的头像 你就搞成男的图像 我还是知道你是女的 日啊
  • 打赏
  • 举报
回复
你明明是男的 为啥要搞个女的头像 这个女的我认识 日阿
zhaohuaxishi2010 2011-09-24
  • 打赏
  • 举报
回复
基于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);
}

不知程序哪里有问题,定义的定时器问什么没有发挥作用?请高手指点一下,谢谢!

19,468

社区成员

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

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