`
dato0123
  • 浏览: 913401 次
文章分类
社区版块
存档分类
最新评论

OpenGL中的光照和键盘控制

 
阅读更多

这一篇基本上是从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
}

最后效果图如下:

200780903.jpg

分享到:
评论

相关推荐

    opengl光照和键盘响应

    opengl进行光照,通过键盘控制光照的开启和关闭,以及关照物体的位置等。并且通过键盘按键,动态切换三种模式的贴图纹理,线性、最简以及mipmapped

    光照和键盘控制

    教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。这一课包含了很多内容,如果您对前面的课程有疑问的话,先回头复习一下。进入后面的代码之前,很好的理解基础知识十分重要。

    ArchieOpenGL第九课光照和键盘控制

    ArchieOpenGL第九课光照和键盘控制 参考 http://blog.csdn.net/whucv/article/details/8169362

    opengl光照、纹理映射和键盘控制

    做的是把一个旋转立方体的6个面贴上6幅不同的图片,设置了两个键盘控制,一个是通过glutKeyboardFunc(keyboard);来控制灯光的开和关,用glutSpecialFunc(special);来分别改变立方体延x,y,z轴的旋转角度。

    Nehe第7课光照和键盘控制

    Nehe第7课光照和键盘控制.教您如何使用三种不同的纹理滤波方式。教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的光照。

    opengl实现键盘鼠标等交互

    利用OPENGL编写的程序..实现键盘鼠标的响应,并且能都实现交互。

    openGL简单例子

    此程序绘制了带6个纹理的立方体,明实现了键盘和鼠标控制,其中键盘控制如下: L :控制光照光照 ←:向左旋转速度增加 →:向右旋转速度增加 ↑:向上旋转速度增加 ↓:向下旋转速度增加 PgUp:立方体向屏幕里移动...

    opengl实现bezier曲面的纹理贴图、鼠标交互与光照

    此程序使用Opengl绘制了带6个纹理的立方体(立方体的每个面用bezier曲面表示),实现了键盘和鼠标控制,其中键盘控制如下: L :控制光照光照 ←:向左旋转速度增加 →:向右旋转速度增加 ↑:向上旋转速度增加 ↓:向...

    opengl加光照的可旋转的三棱锥

    opengl中用c++语言编写的三棱锥,可通过控制键盘控制它的旋转

    计算机图形学 OpenGL实验源码+实验文档

    小实验3:键盘控制 13 小实验4:鼠标控制【试着单击鼠标左键或者右键,试着按下鼠标左键后再移动】 14 实验三 几何变换、观察变换、三维对象 16 小实验1:二维几何变换 16 小实验2:建模观察(MODELVIEW)矩阵堆栈 ...

    opengl在MFC平台上绘制三维图形并实现旋转移动缩放

    在MFC平台上上利用OPENGL实现三维立体图形的绘制,进行了光照和材料等的渲染,并且利用键盘控制物体的旋转、移动、缩放!程序已经过调试,可直接使用!

    opengl实现平移缩放旋转消隐纹理

    可以交互实现光照颜色变化,交互控制物体位置,旋转,放缩。对比了有无消隐,增加了纹理。可选择多种加载的物体。

    Nehe的OpenGL教程电子书

    纹理滤波, 光照和键盘控制: 好的,我希望到现在你已经理解了所有的东西,因为这是一个巨大的教程。我想教给你两个新的方法来过滤(filter)你的纹理,简单的光照,键盘控制并且还可能更多 :) .如果你对到这一课为止你...

    利用OpenGl实现3D太阳系源代码

    利用opengl实现了太阳系中行星的运行,包括了行星的公转和自转,并且使用贴图纹理技术使行星更加真实。另外还可以利用键盘的方向键来控制改变视角。

    OpenGL实现的地月模型

    在vc++6.0的环境下使用OpenGL实现的地月模型,通过键盘控制,月亮可绕地球旋转,有纹理映射、光照模型以及物体的旋转运动

    OpenGl实现太阳系

    利用opengl实现了太阳系中球体的运行,并且利用贴图技术和光照技术使场景更加逼真。此外还可以利用键盘控制视角,修改转速等。

    OpenGL的一个简单的茶壶

    利用NEHE教程中的代码进行了简单的改进,实现了一个茶壶DEMO

    电子科大UESTC_OPENGL三维图形程序设计实验_指导老师为周川

    利用三角形图元生成黑白相间的圆锥台,要求通过键盘或鼠标能够改变圆锥台地大端和小端直径 实验2、 编程任务1——绘制钟表 编写一个程序,实现交互式的移动摄像机。显示一个或多个对象,并确保摄像机在移动时总是...

    基于对话框的OpenGL程序框架

    一个很好的基于对话框的OpenGL程序框架,在图片控件上作图,可以实现光照、键盘、全屏、纹理等的控制。该框架能很好的将NeHe教程的代码移植过来。

    OPenGL编程书籍

    7.纹理滤波, 光照和键盘控制: 好的,我希望到现在你已经理解了所有的东西,因为这是一个巨大的教程。我想教给你两个新的方法来过滤(filter)你的纹理,简单的光照,键盘控制并且还可能更多 :) .如果你对到这一课为止...

Global site tag (gtag.js) - Google Analytics