社区
图形处理/算法
帖子详情
VC的OpenGL程序旋转的问题
zhaohuaxishi2010
2011-09-24 08:28:53
实际上我的这个程序是《实战OpenGL三维可视化系统开发与源码精解》吕希奎等编著的书中第2章中的例子,不过我按照书中重新创建了这个程序并修改后(光盘中没有这个源程序) 发现不能旋转立方体,如果哪位高手有兴趣 希望留下QQ号或邮箱,我把完整程序发送过去 帮我指点或调试一下,或者哪位高手有这个程序并调试成功了给我发送过来也可以,我的QQ号是550411871,离线发送或发送到邮箱都行,多谢了
...全文
156
11
打赏
收藏
VC的OpenGL程序旋转的问题
实际上我的这个程序是《实战OpenGL三维可视化系统开发与源码精解》吕希奎等编著的书中第2章中的例子,不过我按照书中重新创建了这个程序并修改后(光盘中没有这个源程序) 发现不能旋转立方体,如果哪位高手有兴趣 希望留下QQ号或邮箱,我把完整程序发送过去 帮我指点或调试一下,或者哪位高手有这个程序并调试成功了给我发送过来也可以,我的QQ号是550411871,离线发送或发送到邮箱都行,多谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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:
你明明是女的 为啥要搞个男的头像 你就搞成男的图像 我还是知道你是女的 日啊
谁是我的谁的谁
2011-09-24
打赏
举报
回复
你明明是男的 为啥要搞个女的头像 这个女的我认识 日阿
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);
}
不知程序哪里有问题,定义的定时器问什么没有发挥作用?请高手指点一下,谢谢!
OpenGL
.rar_
OPENGL
纹理
旋转
_
VC
6 open_
opengl
v_
opengl
vc
6.0_
vc
6.0 op
VC
6.0+
OpenGL
实现纹理立方体
旋转
,
程序
比较简单,适合入门者学习。
OpenGL
立方体
旋转
程序
自己编的立方体
旋转
的
程序
VC
6.0环境下 初学
OpenGL
VC
图像编程的可能会有点点用吧
opengl
.rar_
openGL
缩放_
opengl
旋转
_
opengl
缩放_
opengl
缩放
旋转
_
opengl
茶壶
一个使用
vc
opengl
实现的画茶壶兔子以及实现
旋转
缩放的小
程序
OpenGL
第一个
程序
自己调试的第一个
OpenGL
程序
,内含一个立方体
旋转
示例的
VC
6.0的工程以及调试
程序
时包含的头文件glew.h,glut.h。调试方法可以用
VC
6.0打开工程文件,将压缩包里的.dll文件放在C:WINDOWS和C:WINDOWS\System32的目录...
复件 d4.rar_
opengl
vc
_
旋转
该
程序
将
OpenGL
和
vc
.net结合,开发三维操作平台,解决了在
vc
中移植
OpenGL
的关键技术,以及实现了平台的原地平移和
旋转
技术
图形处理/算法
19,468
社区成员
50,698
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章