1、计算机图形学opengl动画的实现源代码清华大学 理学院 数学系实验报告基于opengl的简单动画的实现小组成员姓名学号班级姓名学号班级指导教师成绩 2012年5 月2日实验目的:在VC6.0的opengl的环境下,实现固定物体的连续变化,从而使简单动画得以实现。实验思想:由于是简单图形的变化过程,所以问题关键在于:1、物体的位置变化如何实现,而位置变化在opengl中体现在坐标的变化中,因而设置坐标的每一步物体的位置变化情况是该问题的关键,此关键代码如下:wAngleX += 1.0f; wAngleY += 10.0f; wAngleZ += 5.0f;2、再有就是如何使得连续的变化得以实
2、现,这就实现了手动变化相自动变化的转变,为了实现这一问题,我们想到设置一个变化时间,使得物体在每个时间段变换一次位置,当这个时间适当小时,就实现了物体的连续变化;这就需要引进一个计时器,通过设置间隔时间实现物体的连续变化,此关键代码如下: SetTimer(1, 150, NULL);实验步骤:1、 初始化OpenGL。2、 设置菜单与关联函数初始化,设置视口与窗口匹配,重新设置坐标系统。3、 建立正交变换下的剪切体(即变换物体)。4、 编写变换幅度函数,设置没不变换情况。5、 编写连续变换计时器,使得在一定间隔下连续变换。实验关键代码:/ AnimateView.cpp : implemen
3、tation of the CAnimateView class/#include stdafx.h#include Animate.h#include AnimateDoc.h#include AnimateView.h/add down#include glgl.h#include glglu.h#include glglaux.h/add up/add down#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE = _FILE_;#endif/ CAnimateViewIMPLEMENT_DYNC
4、REATE(CAnimateView, CView)BEGIN_MESSAGE_MAP(CAnimateView, CView) /AFX_MSG_MAP(CAnimateView) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_ERASEBKGND() ON_WM_SIZE() ON_COMMAND(ID_FILE_PLAY, OnFilePlay) ON_UPDATE_COMMAND_UI(ID_FILE_PLAY, OnUpdateFilePlay) ON_WM_TIMER() /AFX_MSG_MAP / Standard printing commands
5、 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()/ CAnimateView construction/destructionCAnimateView:CAnimateView() /add down m_pDC = NULL; m_play = FALSE; /add upCAnimateView
6、:CAnimateView()BOOL CAnimateView:PreCreateWindow(CREATESTRUCT& cs) / TODO: Modify the Window class or styles here by modifying / the CREATESTRUCT cs /add down cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN; /add up return CView:PreCreateWindow(cs);/ CAnimateView drawingvoid CAnimateView:OnDraw(CDC* p
7、DC) CAnimateDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here /add down DrawScene(); /add up/ CAnimateView printingBOOL CAnimateView:OnPreparePrinting(CPrintInfo* pInfo) / default preparation return DoPreparePrinting(pInfo);void CAnimateView:OnBeginPrinting(CD
8、C* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add extra initialization before printingvoid CAnimateView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) / TODO: add cleanup after printing/ CAnimateView diagnostics#ifdef _DEBUGvoid CAnimateView:AssertValid() const CView:AssertValid();void CAnimateView
9、:Dump(CDumpContext& dc) const CView:Dump(dc);CAnimateDoc* CAnimateView:GetDocument() / non-debug version is inline ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CAnimateDoc); return (CAnimateDoc*)m_pDocument;#endif /_DEBUG/ CAnimateView message handlersint CAnimateView:OnCreate(LPCREATESTRUCT lpCreateSt
10、ruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1; /add down Init(); /初始化OpenGL /add up return 0;void CAnimateView:OnDestroy() /add down HGLRC hrc; /撤消时间步 KillTimer(1); hrc = :wglGetCurrentContext(); :wglMakeCurrent(NULL, NULL); if (hrc) :wglDeleteContext(hrc); if (m_pDC) delete m_pDC; /add u
11、p CView:OnDestroy();BOOL CAnimateView:OnEraseBkgnd(CDC* pDC) return TRUE;void CAnimateView:OnSize(UINT nType, int cx, int cy) CView:OnSize(nType, cx, cy); /add down int w=cx; int h=cy; /避免除数为0 if(h=0) h=1; /设置视口与窗口匹配 glViewport(0, 0, (GLsizei) w, (GLsizei) h); /重新设置坐标系统 glMatrixMode(GL_PROJECTION); glLoadIdentity(); /根据窗口大小设置调整正射投影矩阵 if (cx GetSafeHdc(); :DescribePixelFormat(m_pDC-GetSafeHdc(), n, sizeof(pfd), &pfd); hrc = wglCreateContext(m_pDC-GetSafeHdc(); wglMakeCurrent(m_pDC-GetSafeHdc(), hr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1