mb_adjustGLfloat(m_redCorner, 0.0f, 1.0f); m_blueCorner=1.0f-m_redCorner;
m_angle+=1.0; if (m_angle>360) m_angle=0.0; mb_calculatePoint( ); } // 函数mb_nextFrame结束
6.在COpenGLPlatView类开头添加
#include \
在view中添加一个WM_TIMER函数
void COpenGLPlatView::OnTimer(UINT_PTR nIDEvent) {
// TODO: 在此添加消息处理程序代码和/或调用默认值 COpenGLPlatDoc* pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return;
pDoc->m_star.mb_nextFrame(); Invalidate(); }
CView::OnTimer(nIDEvent);
在COpenGLPlatDoc类中添加m_star变量:
public:
Star m_star;
7.在view中的OnCreate函数中添加时间触发:
int COpenGLPlatView::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
……….. ……….
SetTimer(1,33,NULL); }
return 0;
8.在view中的OnDestroy函数中添加代码:
KillTimer(1);
9.在OpenGLPlatView.cpp中OnDraw函数中添加以下代码
void CMy4View::OnDraw(CDC* pDC)
{
CMy4Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);
if (!pDoc) return;
wglMakeCurrent(pDC->m_hDC,m_hRC); glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_COLOR_MATERIAL); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS);
glEnable(GL_AUTO_NORMAL);
glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //设置光源参数
glRotated(pDoc->m_star.m_angle, 1.0, 1.0, 1.0); pDoc->m_star.mb_draw();
// TODO: 在此处为本机数据添加绘制代码 wglMakeCurrent(NULL,NULL); SwapBuffers(pDC->m_hDC);
GLfloat light_position[]={1.0f,1.0f,1.0f,0.0f}; GLfloat light_ambient[]={0.2f,0.2f,0.2f,0.2f}; GLfloat light_diffuse[]={0.5f,0.5f,0.2f,0.2f}; GLfloat light_specular[]={0.5f,0.5f,0.5f,0.2f}; glLightfv(GL_LIGHT0,GL_POSITION,light_position); glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular); //设置材质参数
GLfloat material_ambient[]={0.2f,0.2f,0.2f,0.2f}; GLfloat material_diffuse[]={0.2f,0.8f,0.4f,0.8f}; GLfloat material_specular[]={0.2f,0.8f,0.4f,0.8f}; GLfloat material_emission[]={0.2f,0.2f,0.2f,1.0f}; GLfloat material_shiness[]={10.0f};
glMaterialfv(GL_BACK,GL_DIFFUSE,material_diffuse); glMaterialfv(GL_BACK,GL_SPECULAR,material_specular); glMaterialfv(GL_BACK,GL_EMISSION,material_emission); glMaterialfv(GL_BACK,GL_SHININESS,material_shiness);
glMaterialfv(GL_BACK,GL_AMBIENT,material_ambient);//FRONT_AND_BACK
}
实验六 OpenGL交互与动画
一:实验目的:
1. 掌握利用glut实现OpenGL鼠标键盘交互的方法。 2. 掌握利用glut实现OpenGL动画的方法。
二:实验内容:
1. 利用鼠标点击、拖动和键盘按键实现一个矩形的移动。 2. 使用双缓存绘制旋转正方形。 3. 反弹方块动画。
三:实验要求
通过本实验,掌握鼠标点击、拖动和键盘按键的响应方法,利用空闲函数和定时器函数实现动态绘制的方法,利用双缓存机制连贯地显示动画图形的方法。
四:实验步骤
1:实现一个利用鼠标点击、拖动和键盘按键移动矩阵的程序。
1)File->New->Project 选择Win32应用程序 输入名称HelloOpenGL
2)点击“OK”后,在后续的对话框中选中Empty project,然后点击Finish。
3)右击项目名,选择属性(property),再选择链接器(Linker)中的输入选项(Input),附加依赖项(Additional Dependencies):opengl32.lib glu32.lib glaux.lib