OpenGL添加地板和灯光

这篇文章简单记载下对之前读取bvh文件的问题2的完善。

1.添加灯光:

用键盘按键动态开关灯光效果。glutKeyboardFunc(normal);的normal函数中,对按键‘L’添加响应——改变开/关、以及初始化灯光效果drawLight()。在drawLight()函数中,只是设置了灯光、材料的属性,并glEnable(GL_LIGHT0);但是没有glEnable(GL_LIGHTING),也就是没有真正"开灯"。真正控制灯光开关的是全局函数isLight(Bool类型)。在按键‘L’的响应中,主要工作是isLight=!isLight,如果isLight==True则调用drawLight(),即初始化,并glEnable(GL_LIGHTING)

在glutDisplayFunc (display);中再判断isLight,如果True就glEnable(GL_LIGHTING),否则glDisable(GL_LIGHTING)

虽然这么做很麻烦,而且好像完全可以在‘L’响应中就全部完成,而不必在不断刷图中判断,但是后面设置地板后,我不得不这么改。后面我会说明原因。当然程序有待改进。

2.添加地板

其实就是画四边形,然后相邻块不同颜色,就可以了。存在的问题是:如果就这样画出地板,当启动灯光效果时,虽然画出的人物有了3D效果,地板也上色了。试了好多方法,最后看了别人的代码才发现,在画地板的四边形之前,要先关闭灯光glDisable(GL_LIGHTING)。但是这里有个问题还没解决,我最初也想用按键控制添加地板,但是,不知道问什么完全没有效果,只有放在glutDisplayFunc (display);中调用drawFloor(),和画帧的函数一同不断刷图才出现。

所以,这样不断调用drawFloor(),就会不断glDisable(GL_LIGHTING).。。囧。。因此,我才在下面不断判断isLight,判断是否启动/关闭灯光效果。

最好是:在按键‘L’响应中,一次性的添加地板、一次性开启关闭灯光,这样才是最好的。但是drawFloor()没反应,只好这样迂回实现效果了。后面如果突然发现哪里错误,实现了在补充吧。。。

相关代码:

main()中:

glutDisplayFunc (display);  //对应display()刷图函数

glutKeyboardFunc(normal); //对应normal()键盘响应函数

------------------------------------------------

void normal(unsigned char key,int x,int y)
{
    switch(key)
    {

    case 'l':
        isLight = !isLight;
        if (isLight)
        {
            mym->drawLight(); /*设置灯光材料*/
             glEnable(GL_LIGHTING);
        }
        glutPostRedisplay();

        break;

    case '\r':
        loopr=!loopr;  
        if (loopr)
        {
            glutTimerFunc(50,timer,0);
        }    
        break;
//     case 'f'://这里还是无结果---好吧我暂时放弃
//         isFloor=true;
//         mym->drawFloor();
//         glutPostRedisplay();
//         break;

    }
}

-------------------

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//刷新背景颜色+刷新背景深度

    glPushMatrix();

    mym->drawMotion3(0,frame_num);
    mym->drawFloor();
    if (!isLight) /*打开light 要放在floor之后*/
    {
        glDisable(GL_LIGHTING);    
    }
    else
        glEnable(GL_LIGHTING);


    glPopMatrix();
    glFlush();
    glutSwapBuffers();  //更新窗口
}

还需继续改进。。。

你可能感兴趣的:(OpenGL)