这一篇基本上是从Nehe的第7课改编而来的,我将他的Win32代码改写为MFC框架下来实现。
第一个遇到的问题就是MFC窗口中如何响应键盘消息,搜索了下资料,发现只需要重载PreTranslateMessage函数就可以让窗口监听按键消息了。
BOOLCOpenGLDemoView::PreTranslateMessage(MSG*pMsg)
{
//TODO:Addyourspecializedcodehereand/orcallthebaseclass
if(pMsg->message==WM_KEYDOWN)
{
SendMessage(pMsg->message,pMsg->wParam,pMsg->lParam);
returntrue;
}
else
{
returnCView::PreTranslateMessage(pMsg);
}
}
为了监视按键的情况,增设了下面几个变量来负责按键的控制:
GLbooleanbLighting;//是否启用光照
boollPressed;//’L’键是否按下
boolfPressed;//’F’键是否按下
目的是防止用户长时间按住一个键不动(例如‘L’不动,从而导致光照持续地开关)这种情况。
GLfloatxspeed;//X旋转速度
GLfloatyspeed;//Y旋转速度
GLfloatz;//深入屏幕的距离
这几个变量是让用户用来增减旋转速度和Z轴深度用的。
voidCOpenGLDemoView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
caseVK_LEFT:
{//左键
yspeed-=0.01f;
break;
}
caseVK_RIGHT:
{//右键
yspeed+=0.01f;
break;
}
caseVK_NEXT:
{//Page_Down键按下
z+=0.05f;
break;
}
caseVK_PRIOR:
{//Page_Up键按下
z-=0.05f;
break;
}
caseVK_UP:
{//Page_Up键按下
xspeed-=0.01f;
break;
}
caseVK_DOWN:
{//Page_Up键按下
xspeed+=0.01f;
break;
}
case'F':
{
fPressed=TRUE;
break;
}
case'L':
{
lPressed=TRUE;
break;
}
default:
break;
}
CView::OnKeyDown(nChar,nRepCnt,nFlags);
}
voidCOpenGLDemoView::OnKeyUp(UINTnChar,UINTnRepCnt,UINTnFlags)
{
//TODO:Addyourmessagehandlercodehereand/orcalldefault
switch(nChar)
{
case'F':
{
if(fPressed==TRUE)
{
filter=(filter+1)%3;
}
fPressed=FALSE;
break;
}
case'L':
{
if(lPressed==TRUE)
{//防止长时间按着'L'键而导致光照持续变化
bLighting=!bLighting;
if(bLighting)
{
glEnable(GL_LIGHTING);
}
else
{
glDisable(GL_LIGHTING);
}
}
lPressed=FALSE;
break;
}
default:
break;
}
CView::OnKeyUp(nChar,nRepCnt,nFlags);
}
具体的绘制代码如下:
intCOpenGLDemoView::DrawGLScene()
{//Here'sWhereWeDoAllTheDrawing
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//ClearScreenAndDepthBuffer
glPushAttrib(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_CURRENT_BIT);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0f,0.0f,z);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
//纹理模式切换,这里提供三种纹理模式
glBindTexture(GL_TEXTURE_2D,texture[this->filter]);//绑定到选定的纹理上
glBegin(GL_QUADS);//绘制正方形
//FrontFace
glNormal3f(0.0f,0.0f,1.0f);//法线指向观察者
glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);
//BackFace
glNormal3f(0.0f,0.0f,-1.0f);//法线背向观察者
glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);
//TopFace
glNormal3f(0.0f,1.0f,0.0f);//法线向上
glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);
//BottomFace
glNormal3f(0.0f,-1.0f,0.0f);//法线朝下
glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
//Rightface
glNormal3f(1.0f,0.0f,0.0f);//法线朝右
glTexCoord2f(1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);
//LeftFace
glNormal3f(-1.0f,0.0f,0.0f);//法线朝左
glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f);
glTexCoord2f(1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);
glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);
glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);
glEnd();//正方形绘制结束
glPopMatrix();
glPopAttrib();
glFlush();
xrot+=xspeed;
yrot+=yspeed;
returnTRUE;//EverythingWentOK
}
最后效果图如下:
分享到:
相关推荐
opengl进行光照,通过键盘控制光照的开启和关闭,以及关照物体的位置等。并且通过键盘按键,动态切换三种模式的贴图纹理,线性、最简以及mipmapped
教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。这一课包含了很多内容,如果您对前面的课程有疑问的话,先回头复习一下。进入后面的代码之前,很好的理解基础知识十分重要。
ArchieOpenGL第九课光照和键盘控制 参考 http://blog.csdn.net/whucv/article/details/8169362
做的是把一个旋转立方体的6个面贴上6幅不同的图片,设置了两个键盘控制,一个是通过glutKeyboardFunc(keyboard);来控制灯光的开和关,用glutSpecialFunc(special);来分别改变立方体延x,y,z轴的旋转角度。
Nehe第7课光照和键盘控制.教您如何使用三种不同的纹理滤波方式。教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。
利用OPENGL编写的程序..实现键盘鼠标的响应,并且能都实现交互。
此程序绘制了带6个纹理的立方体,明实现了键盘和鼠标控制,其中键盘控制如下: L :控制光照光照 ←:向左旋转速度增加 →:向右旋转速度增加 ↑:向上旋转速度增加 ↓:向下旋转速度增加 PgUp:立方体向屏幕里移动...
此程序使用Opengl绘制了带6个纹理的立方体(立方体的每个面用bezier曲面表示),实现了键盘和鼠标控制,其中键盘控制如下: L :控制光照光照 ←:向左旋转速度增加 →:向右旋转速度增加 ↑:向上旋转速度增加 ↓:向...
opengl中用c++语言编写的三棱锥,可通过控制键盘控制它的旋转
小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:二维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 ...
在MFC平台上上利用OPENGL实现三维立体图形的绘制,进行了光照和材料等的渲染,并且利用键盘控制物体的旋转、移动、缩放!程序已经过调试,可直接使用!
可以交互实现光照颜色变化,交互控制物体位置,旋转,放缩。对比了有无消隐,增加了纹理。可选择多种加载的物体。
纹理滤波, 光照和键盘控制: 好的,我希望到现在你已经理解了所有的东西,因为这是一个巨大的教程。我想教给你两个新的方法来过滤(filter)你的纹理,简单的光照,键盘控制并且还可能更多 :) .如果你对到这一课为止你...
利用opengl实现了太阳系中行星的运行,包括了行星的公转和自转,并且使用贴图纹理技术使行星更加真实。另外还可以利用键盘的方向键来控制改变视角。
在vc++6.0的环境下使用OpenGL实现的地月模型,通过键盘控制,月亮可绕地球旋转,有纹理映射、光照模型以及物体的旋转运动
利用opengl实现了太阳系中球体的运行,并且利用贴图技术和光照技术使场景更加逼真。此外还可以利用键盘控制视角,修改转速等。
利用NEHE教程中的代码进行了简单的改进,实现了一个茶壶DEMO
利用三角形图元生成黑白相间的圆锥台,要求通过键盘或鼠标能够改变圆锥台地大端和小端直径 实验2、 编程任务1——绘制钟表 编写一个程序,实现交互式的移动摄像机。显示一个或多个对象,并确保摄像机在移动时总是...
一个很好的基于对话框的OpenGL程序框架,在图片控件上作图,可以实现光照、键盘、全屏、纹理等的控制。该框架能很好的将NeHe教程的代码移植过来。
7.纹理滤波, 光照和键盘控制: 好的,我希望到现在你已经理解了所有的东西,因为这是一个巨大的教程。我想教给你两个新的方法来过滤(filter)你的纹理,简单的光照,键盘控制并且还可能更多 :) .如果你对到这一课为止...