4,同样为了计算帧速率,修改OnDraw函数如下,在其中用glPushMatrix 和 glPopMatrix将RenderScene函数包裹起来,从而确保动画会正确运行。在SwapBuffers调用后我们调用PostRenderScene来显示帧速率信息到窗口标题。
void CCY457OpenGLView::OnDraw(CDC* pDC)
{
CCY457OpenGLDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// Get the system time, in milliseconds.
m_ElapsedTime = ::timeGetTime(); // get current time
if ( ElapsedTimeinMSSinceLastRender() < 30 )
return
// Clear out the color & depth buffers
::glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glPushMatrix();
RenderScene();
glPopMatrix();
// Tell OpenGL to flush its pipeline
::glFinish();
// Now Swap the buffers
::SwapBuffers( m_pDC->GetSafeHdc() );
//Perform Post Display Processing
// Only update the title every 15 redraws (this is about
// every 1/2 second)
PostRenderScene();
// the very last thing we do is to save
// the elapsed time, this is used with the
// next elapsed time to calculate the
// elapsed time since a render and the frame rate
m_previousElapsedTime = m_ElapsedTime;
}
4,在CCY457OpenGLView类中加入下述成员函数,用来显示帧速率信息到窗口标题
//////////////////////////////////////////////////////////////////////////////
// PostRenderScene
// perform post display processing
// The default PostRenderScene places the framerate in the
// view's title. Replace this with your own title if you like.
void CCY457OpenGLView::PostRenderScene( void )
{
// Only update the title every 15 redraws (this is about
// every 1/2 second)
static int updateFrame = 15;
if (16 > ++updateFrame )
return;
updateFrame = 0;
char string[256];
_snprintf( string, 200, "%s ( %d Frames/sec )",
(const char*)m_WindowTitle, FramesPerSecond() );
GetParentFrame()->SetWindowText( string );
}
//////////////////////////////////////////////////////////////////////////////
// FramesPerSecond
// fetch frame rate calculations
int CCY457OpenGLView::FramesPerSecond( void )
{
double eTime = ElapsedTimeinMSSinceLastRender();
if ( 0 == (int)eTime )
return 0;
return (int)(1000/(int)eTime);
}
DWORD ElapsedTimeinMSSinceLastStartup()
{
return(m_ElapsedTime - m_StartTime);
}
DWORD ElapsedTimeinMSSinceLastRender()
{
return(m_ElapsedTime - m_previousElapsedTime);
}
5,在OnTimer函数中,通过增加变量DayOfYear 和 HourOfDay的值来控制地球和月球的位置,并且调用InvalidateRect来刷新界面。
void CCY457OpenGLView::OnTimer(UINT nIDEvent)
{
if(DayOfYear < 365)
DayOfYear++;
else
DayOfYear = 1;
if(HourOfDay < 365)
HourOfDay++;
else
HourOfDay = 1;
InvalidateRect(NULL, FALSE);
CView::OnTimer(nIDEvent);
}
6,在RenderScene中加入绘制代码:
void CCY457OpenGLView::RenderScene ()
{//绘制函数
glTranslatef(0.0f,0.0f,-5.0f);
//Draw the Sun
glutWireSphere(1.0f,20,20);
//Rotate the Planet in its orbit
glRotatef((GLfloat) (360.0*DayOfYear)/365.0, 0.0f, 1.0f, 0.0f);
glTranslatef(4.0f,0.0f,0.0f);
glPushMatrix();
//Rotate the Planet in its orbit
glRotatef((GLfloat)(360*HourOfDay)/24.0, 0.0f,1.0f,0.0f);
//Draw the Planet
glutWireSphere(0.2f,20,20);
glPopMatrix();
glRotatef((GLfloat) (360.0*12.5*DayOfYear)/365.0, 0.0f, 1.0f, 0.0f);
glTranslatef(0.5f,0.0f,0.0f);
//Draw the Moon
glutWireSphere(0.01f,20,20);
}