新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → OpenGL中的光照和键盘控制 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3507 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: OpenGL中的光照和键盘控制 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 OpenGL中的光照和键盘控制

    这一篇基本上是从Nehe的第7课改编而来的,我将他的Win32代码改写为MFC框架下来实现。

    第一个遇到的问题就是MFC窗口中如何响应键盘消息,搜索了下资料,发现只需要重载PreTranslateMessage函数就可以让窗口监听按键消息了。


    BOOL COpenGLDemoView::PreTranslateMessage(MSG* pMsg)
    {
        // TODO: Add your specialized code here and/or call the base class
        if(pMsg->message == WM_KEYDOWN)
        {       
            SendMessage(pMsg->message, pMsg->wParam, pMsg->lParam);
            return true;
        }
        else
        {
            return CView::PreTranslateMessage(pMsg);
        }
    }


    为了监视按键的情况,增设了下面几个变量来负责按键的控制:


        GLboolean bLighting;//是否启用光照
        bool lPressed;//’L’键是否按下
        bool fPressed;//’F’键是否按下

    目的是防止用户长时间按住一个键不动(例如‘L’不动,从而导致光照持续地开关)这种情况。


        GLfloat xspeed;                                    // X 旋转速度
        GLfloat yspeed;                                    // Y 旋转速度
        GLfloat    z;                                // 深入屏幕的距离

    这几个变量是让用户用来增减旋转速度和Z轴深度用的。


    void COpenGLDemoView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        // TODO: Add your message handler code here and/or call default
        switch(nChar)
        {
        case VK_LEFT:
            {//左键
                yspeed-=0.01f;
                break;
            }
        case VK_RIGHT:
            {//右键
                yspeed+=0.01f;
                break;
            }
        case VK_NEXT:
            {//Page_Down键按下
                z+=0.05f;
                break;
            }
        case VK_PRIOR:
            {//Page_Up键按下
                z-=0.05f;
                break;
            }
        case VK_UP:
            {//Page_Up键按下
                xspeed-=0.01f;
                break;
            }
        case VK_DOWN:
            {//Page_Up键按下
                xspeed+=0.01f;
                break;
            }
        case 'F':
            {
                fPressed = TRUE    ;
                break;
            }
        case 'L':
            {
                lPressed = TRUE;
                break;
            }
        
        default:
            break;
        }

        CView::OnKeyDown(nChar, nRepCnt, nFlags);
    }

    void COpenGLDemoView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        // TODO: Add your message handler code here and/or call default
        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);
    }

    具体的绘制代码如下:


    int COpenGLDemoView::DrawGLScene()                                   
    {// Here's Where We Do All The Drawing
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // Clear Screen And Depth Buffer
        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);                            //  绘制正方形
            // Front Face
            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);
            // Back Face
            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);
            // Top Face
            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);
            // Bottom Face
            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);
            // Right face
            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);
            // Left Face
            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;
        return TRUE;                                        // Everything Went OK
    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/1/16 17:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/26 20:57:25

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms