




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenGL新手入门实验3view类代码 /Exam3View.h:interface ofthe CExam3View class/#include#include#include#include#includeDlgAngle.h#if!defined(AFX_EXAM3VIEW_H_BCC1829A_1BA5_4C57_A92A_F2DE14AD7505_INCLUDED_)#define AFX_EXAM3VIEW_H_BCC1829A_1BA5_4C57_A92A_F2DE14AD7505_INCLUDED_#if_MSC_VER1000#pragma once#endif/_MSC_VER1000class CExam3View:public CViewprotected:/create fromserialization onlyCExam3View();DECLARE_DYNCREA TE(CExam3View)/Attributes public:CExam3Doc*GetDocument();/Operations public:/Overrides/ClassWizard generatedvirtual functionoverrides/AFX_VIRTUAL(CExam3View)public:virtual voidOnDraw(CDC*pDC);/overridden todraw thisview virtual BOOL PreCreateWindow(CREATESTRUCT&cs);protected:virtualBOOLOnPreparePrinting(CPrintInfo*pInfo);virtual voidOnBeginPrinting(CDC*pDC,CPrintInfo*pInfo);virtual voidOnEndPrinting(CDC*pDC,CPrintInfo*pInfo);/AFX_VIRTUAL/Implementation public:void gl_point(GLint x,GLint y);/声明+定义一些列的变量+函数来方便以后使用void DrawSence();void DrawCube();HGLRC m_hRC;HDC m_hDC;void Draw();void gl_Init();BOOL m_play;BOOL my_play;GLfloat m_fDeltaAngleZ;/标识角度GLfloat m_fDeltaAngleY;/标识角度GLfloat m_fDeltaAngleX;/标识角度GLfloat m_fAngleZ;/传递的参数GLfloat m_fAngleY;GLfloat m_fAngleX;virtualCExam3View();virtual voidAssertValid()const;#ifdef_DEBUG virtualvoid Dump(CDumpContext&dc)const;#endif protected:/Generated messagemap functionsprotected:/AFX_MSG(CExam3View);afx_msg voidOnPlayPause();afx_msg voidOnUpdatePlayPause(CCmdUI*pCmdUI);afx_msg voidOnDeltaAngle();afx_msg voidOnTimer(UINT nIDEvent);afx_msg voidOnSize(UINT nType,int cx,int cy);afx_msg intOnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg voidOnDestroy();/AFX_MSG DECLARE_MESSAGE_MAP()#ifndef_DEBUG/debug versionin Exam3View.cpp inlineCExam3Doc*CExam3View:GetDocument()return(CExam3Doc*)m_pDocument;#endif/AFX_INSERT_LOCATION/Microsoft VisualC+will insertadditional declarationsimmediately beforethe previousline.#endif/!defined(AFX_EXAM3VIEW_H_BCC1829A_1BA5_4C57_A92A_F2DE14AD7505_INCLUDED_)/Exam3View.cpp:implementation ofthe CExam3View class/#include#include#include#include#includeDlgAngle.h#includestdafx.h#includeExam3.h#includeExam3Doc.h#includeExam3View.h#ifdef_DEBUG#define newDEBUG_NEW#undef THIS_FILE statihar THIS_FILE=_FILE_;#endif/CExam3View IMPLEMENT_DYNCREATE(CExam3View,CView)BEGIN_MESSAGE_MAP(CExam3View,CView)/AFX_MSG_MAP(CExam3View)ON_MAND(IDM_PLAY_PAUSE,OnPlayPause)ON_UPDATE_MAND_UI(IDM_PLAY_PAUSE,OnUpdatePlayPause)ON_MAND(IDM_DELTA_ANGLE,OnDeltaAngle)ON_WM_TIMER()ON_WM_SIZE()ON_WM_CREATE()ON_WM_DESTROY()/AFX_MSG_MAP/Standard printingmands ON_MAND(ID_FILE_PRINT,CView:OnFilePrint)ON_MAND(ID_FILE_PRINT_DIRECT,CView:OnFilePrint)ON_MAND(ID_FILE_PRINT_PREVIEW,CView:OnFilePrintPreview)END_MESSAGE_MAP()/CExam3View construction/destruction CExam3View:CExam3View()/构造函数中进行变量初始化/TODO:add constructioncode herem_fDeltaAngleX=10.0f;/定义刚开始的时候的窗口坐标初始值m_fDeltaAngleY=1.0f;/定义刚开始的时候的窗口坐标初始值m_fDeltaAngleZ=5.0f;/定义刚开始的时候的窗口坐标初始值CExam3View:CExam3View()BOOL CExam3View:PreCreateWindow(CREATESTRUCT&cs)/CExam3View drawingvoid CExam3View:OnDraw(CDC*pDC)CExam3Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);DrawSence();/一定记得调用哦/TODO:add drawcode fornative datahere/TODO:Modify theWindow classor styleshere bymodifying/the CREATESTRUCTcs returnCView:PreCreateWindow(cs);m_fAngleX=m_fDeltaAngleX;/令变量等于框获取的数值m_fAngleY=m_fDeltaAngleY;/令变量等于框获取的数值m_fAngleZ=m_fDeltaAngleZ;/令变量等于框获取的数值m_play=FALSE;/刚开始的状态时不转动的/CExam3View printingBOOL CExam3View:OnPreparePrinting(CPrintInfo*pInfo)/default preparationreturn DoPreparePrinting(pInfo);void CExam3View:OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)/TODO:add extrainitialization beforeprintingvoid CExam3View:OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)/TODO:add cleanupafter printing/CExam3View diagnostics#ifdef_DEBUG void CExam3View:AssertValid()constCView:Dump(dc);CExam3Doc*CExam3View:GetDocument()/non-debug versionis inlineASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CExam3Doc);CView:AssertValid();void CExam3View:Dump(CDumpContext&dc)const return(CExam3Doc*)m_pDocument;#endif/_DEBUG/CExam3View message handlers void CExam3View:OnPlayPause()/定时器的使用调用/TODO:Add yourmand handlercode here/TODO:Add yourmand handlercode herevoid CExam3View:OnUpdatePlayPause(CCmdUI*pCmdUI)void CExam3View:OnDeltaAngle()CDlgAngle angleDlg;/声明CDlgAngle类的变量angleDlg angleDlg.m_DeltaAngleX=m_fDeltaAngleX;/初始化框angleDlg.m_DeltaAngleY=m_fDeltaAngleY;/对象的某属性=所取数值angleDlg.m_DeltaAngleZ=m_fDeltaAngleZ;/对象.属性=所取数值if(angleDlg.DoModal()=IDOK)/如果点击OK(创建对话框)/TODO:Add yourmand updateUI handlercode herem_play=m_play?FALSE:TRUE;/变量赋值if(m_play)SetTimer(1,45,NULL);/这个定时器的iD;时间延迟45毫秒启动一次else KillTimer (1);/停止定时器/则更新刚才所取到的数值,应用新的数值m_fDeltaAngleX=angleDlg.m_DeltaAngleX;/更新变量m_fDeltaAngleY=angleDlg.m_DeltaAngleY;m_fDeltaAngleZ=angleDlg.m_DeltaAngleZ;void CExam3View:OnTimer(UINT nIDEvent)/时间控制器MW_TIMER/TODO:Add yourmessage handlercode hereand/or calldefault m_fAngleY+=m_fDeltaAngleX;/随着时间的增加,每次围绕旋转的角度改变m_fAngleX+=m_fDeltaAngleY;/随着时间的增加,每次围绕旋转的角度改变m_fAngleZ+=m_fDeltaAngleZ;/随着时间的增加,每次围绕旋转的角度改变Invalidate(FALSE);CView:OnTimer(nIDEvent);void CExam3View:OnSize(UINT nType,int cx,int cy)CView:OnSize(nType,cx,cy);glViewport(0,0,cx,cy);/设定视口大小glMatrixMode(GL_PROJECTION);/设置当前矩阵元素值/用当前矩阵去乘*m所指定的矩阵,并将结果存放于*m中。 当前矩阵可以是用glLoadMatrix()/指定的矩阵,也可以是其它矩阵变换函数的综合结果glLoadIdentity();/单位矩阵的导入/glFrustum(-cx/2,cx/2,-cy/2,cy/2,-10,10);/设置用户定义的绘图区域/glFrustum();/glOtho2D();设置投影方式glOrtho(-cx/100,cx/100,-cy/100,cy/100,-10,10);/设置用户定义的绘图区域int CExam3View:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CView:OnCreate(lpCreateStruct)=-1)return-1;gl_Init();/初始化OpenGL绘图环境return0;void CExam3View:OnDestroy()CView:OnDestroy();:wglMakeCurrent(NULL,NULL);:wglDeleteContext(m_hRC);KillTimer (1);/增加对KillTimer()的调用/TODO:Add yourmessagehandlercode herevoid CExam3View:gl_Init()/下面的结构说明绘图设备的像素格式,例如像素的表示方法、各种颜色表示位数等PIXELFORMATDESCRIPTOR pfd=sizeof(PIXELFORMATDESCRIPTOR),/数据结构大小;1,/数据结构版本号PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,/缓冲区可以在窗口上绘图,支持OpenGL绘图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,/忽略层,可见性和损毁掩模/得到当前正在使用的绘图设备句柄m_hDC=GetDC()-GetSafeHdc();/*根据当前绘图设备的特性,为之选择一个与pfd所指定的格式相匹配的像素格式,存于nPixelFormat中。 */int nPixelFormat=:ChoosePixelFormat(m_hDC,&pfd);/将当前绘图设备的像素格式设为nPixelFormat:SetPixelFormat(m_hDC,nPixelFormat,&pfd);/根据当前绘图设备,创建一个像素格式与之相匹配的OpenGL的绘图上下文m_hRC=:wglCreateContext(m_hDC);/*指定OpenGL的绘图上下文是m_hRC,并且建立它与当前绘图设备m_hDC间的连接,下列函数执行后,所有绘图命令的结果都出现在设备m_hDC上*/:wglMakeCurrent(m_hDC,m_hRC);glEnable(GL_DEPTH_TEST);/实际就是消隐,可以测试不加的时候会出现什么情况void CExam3View:Draw()glClearColor(1.0f,1.0f,1.0f,1.0f);glClear(GL_COLOR_BUFFER_BIT);/置窗口底色为白色glColor3f(0.0f,0.0f,0.0f);/设置绘图颜色为黑色DrawCube();/SwapBuffers(m_hDC);/glFlush();/显示上述OpenGL命令的执行效果void CExam3View:DrawCube()/用坐标法绘制立方体/glRotatef(m_play,1.0f,1.0f,1.0f);/在XYZ轴上旋转立方体glBegin(GL_QUADS);glColor3f(0.0f,1.0f,0.0f);/颜色改为蓝色glVertex3f(1.0f,1.0f,-1.0f);/四边形的右上顶点(顶面)glVertex3f(-1.0f,1.0f,-1.0f);/四边形的左上顶点(顶面)glVertex3f(-1.0f,1.0f,1.0f);/四边形的左下顶点(顶面)glVertex3f(1.0f,1.0f,1.0f);/四边形的右下顶点(顶面)glColor3f(1.0f,0.5f,0.0f);/颜色改成橙色glVertex3f(1.0f,-1.0f,1.0f);/四边形的右上顶点(底面)glVertex3f(-1.0f,-1.0f,1.0f);/四边形的左上顶点(底面)glVertex3f(-1.0f,-1.0f,-1.0f);/四边形的左下顶点(底面)glVertex3f(1.0f,-1.0f,-1.0f);/四边形的右下顶点(底面)/接着画立方体的前面。 保持Z坐标为一单位,前面正对着我们。 /glColor3f(1.0f,0.0f,0.0f);/颜色改成红色glVertex3f(1.0f,1.0f,1.0f);/四边形的右上顶点(前面)glVertex3f(-1.0f,1.0f,1.0f);/四边形的左上顶点(前面)glVertex3f(-1.0f,-1.0f,1.0f);/四边形的左下顶点(前面)glVertex3f(1.0f,-1.0f,1.0f);/四边形的右下顶点(前面)立方体后面的绘制方法与前面类似。 只是位于屏幕的里面。 注意Z坐标现在保持-1不变。 glColor3f(1.0f,1.0f,0.0f);/颜色改成黄色glVertex3f(1.0f,-1.0f,-1.0f);/四边形的右上顶点(后面)glVertex3f(-1.0f,-1.0f,-1.0f);/四边形的左上顶点(后面)glVertex3f(-1.0f,1.0f,-1.0f);/四边形的左下顶点(后面)glVertex3f(1.0f,1.0f,-1.0f);/四边形的右下顶点(后面)/还剩两个面就完成了。 您会注意到总有一个坐标保持不变。 这一次换成了X坐标。 因为我们在画左侧面。 glColor3f(0.0f,0.0f,1.0f);/颜色改成蓝色glVertex3f(-1.0f,1.0f,1.0f);/四边形的右上顶点(左面)glVertex3f(-1.0f,1.0f,-1.0f);/四边形的左上顶点(左面)glVertex3f(-1.0f,-1.0f,-1.0f);/四边形的左下顶点(左面)glVertex3f(-1.0f,-1.0f,1.0f);/四边形的右下顶点(左面)/立方体的最后一个面了。 X坐标保持为一单位。 逆时针绘制。 您愿意的话,留着这个面不画也可以,这样就是一个盒子:)/或者您要是有兴趣可以改变立方体所有顶点的色彩值,象金字塔那样混合颜色。 您会看见一个非常漂亮的彩色立方体,各种颜色在它的各个表面流淌。 glColor3f(1.0f,0.0f,1.0f);/颜色改成紫罗兰色glVertex3f(1.0f,1.0f,-1.0f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小区室外路灯施工方案
- 小学篮球趣味活动策划方案
- 老旧小区施工方案暗标
- 决策咨询建议专刊方案
- 新疆阿拉沟水库施工方案
- 沈阳大赛活动会议方案策划
- 大学创意活动策划方案公司
- 五一永州景区活动策划方案
- 火锅店过年开业营销方案
- 造价咨询综合协调方案
- 2024从“小众运动”到“全民热潮”解码网球人群与市场机遇
- ktv营销管理方案
- 2025-2030中国质子治疗系统行业市场发展趋势与前景展望战略研究报告
- 输血规范培训制度
- 第一单元与班级共成长 教学设计-2023-2024学年道德与法治四年级上册(部编版)
- 干道工程(道路、燃气、雨污水管线、再生水管线)投标方案(技术方案)
- 房子互换简单协议书
- 钢结构厂房基础施工承包合同
- 江苏连云港历年中考作文题与审题指导(2003-2024)
- 劳务分包加采购合同标准文本
- 带状疱疹护理课件
评论
0/150
提交评论