百度首页 | 百度空间
 
查看文章
 
GL学习笔记(3)
2007-08-31 18:05


#include "animation.h"

//默认构造函数,初始化数据
Animation::Animation()
{
    r = 0;
    MX = 1024;        //场景x
    MY = 1024;        //场景y
    MZ = 1024;        //场景z

    oEye[0] = 0;    //观察点x
    oEye[1] = 10;    //观察点y
    oEye[2] = 100;    //观察点z
    oLtn[0] = 0;    //视点坐标x
    oLtn[1] = 0;    //视点坐标y
    oLtn[2] = 0;    //视点坐标z
    oAngle = 0;    //视点角度
    oEve    = 0;    //视点距离
   
    CreateTexture("C:\\Images\\FRONT.BMP",    oTexture[0]);
    CreateTexture("C:\\Images\\LEFT.BMP",    oTexture[1]);
    CreateTexture("C:\\Images\\RBACK.BMP",    oTexture[2]);
    CreateTexture("C:\\Images\\RIGHT.BMP",    oTexture[3]);
    CreateTexture("C:\\Images\\TOP.BMP",    oTexture[4]);
    CreateTexture("C:\\Images\\1.bmp",        oTexture[5]);
    CreateTexture("C:\\Images\\kkun.bmp",    oTexture[6]);
    CreateTexture("C:\\Images\\128.bmp",    oTexture[7]);   
    glEnable(GL_TEXTURE_2D);
}

//绘制天空盒
void Animation::DrawSky()
{
    SelectTexture(oTexture[0]);
    glBegin(GL_QUADS);
        //前面
        glTexCoord2f(0,0);        glVertex3f(-MX,0,-MZ);
        glTexCoord2f(1,0);        glVertex3f( MX,0,-MZ);
        glTexCoord2f(1,1);        glVertex3f( MX, MY/2,-MZ);
        glTexCoord2f(0,1);        glVertex3f(-MX, MY/2,-MZ);
    glEnd();

    SelectTexture(oTexture[1]);
    glBegin(GL_QUADS);
        //左面
        glTexCoord2f(0,0);        glVertex3f(-MX,    0, MZ);
        glTexCoord2f(1,0);        glVertex3f(-MX,    0,-MZ);
        glTexCoord2f(1,1);        glVertex3f(-MX,    MY/2, -MZ);
        glTexCoord2f(0,1);        glVertex3f(-MX, MY/2, MZ);
    glEnd();

    SelectTexture(oTexture[2]);
    glBegin(GL_QUADS);
        //后面
        glTexCoord2f(0,0);        glVertex3f( MX,    0, MZ);
        glTexCoord2f(1,0);        glVertex3f(-MX, 0, MZ);
        glTexCoord2f(1,1);        glVertex3f(-MX,    MY/2, MZ);
        glTexCoord2f(0,1);        glVertex3f( MX, MY/2, MZ);
    glEnd();

    SelectTexture(oTexture[3]);
    glBegin(GL_QUADS);
        //右面
        glTexCoord2f(0,0);        glVertex3f( MX,    0, -MZ);
        glTexCoord2f(1,0);        glVertex3f( MX,    0, MZ);
        glTexCoord2f(1,1);        glVertex3f( MX,    MY/2, MZ);
        glTexCoord2f(0,1);        glVertex3f( MX, MY/2, -MZ);
    glEnd();

    SelectTexture(oTexture[4]);
    glBegin(GL_QUADS);
        //顶面
        glTexCoord2f(0,0);        glVertex3f(-MX,    MY/2, -MZ);
        glTexCoord2f(1,0);        glVertex3f(-MX,    MY/2, MZ);
        glTexCoord2f(1,1);        glVertex3f( MX,    MY/2, MZ);
        glTexCoord2f(0,1);        glVertex3f( MX, MY/2, -MZ);
    glEnd();
}
//渲染窗口
void Animation::RenderWindow()
{
    this->DrawSky();

    SelectTextureRepeat(oTexture[5]);
    glBegin(GL_QUADS);           
        //地面       
        glTexCoord2f(0,0);        glVertex3f(-MX/16,0,-MZ/2);
        glTexCoord2f(2,0);        glVertex3f( MX/16,0,-MZ/2);
        glTexCoord2f(2,20);    glVertex3f( MX/16,0, MZ/2);
        glTexCoord2f(0,20);    glVertex3f(-MX/16,0, MZ/2);
    glEnd();

    glTranslatef(0,-1,0);
    SelectTextureRepeat(oTexture[6]);
    glBegin(GL_QUADS);           
        glTexCoord2f(0,0);        glVertex3f(-MX/2,0,-MZ/2);
        glTexCoord2f(10,0);        glVertex3f( MX/2,0,-MZ/2);
        glTexCoord2f(10,10);    glVertex3f( MX/2,0, MZ/2);
        glTexCoord2f(0,10);        glVertex3f(-MX/2,0, MZ/2);
    glEnd();
}

//从文件创建纹理
bool Animation::CreateTexture(char *filename,GLuint &texture)
{
    AUX_RGBImageRec *pImage = NULL;
    //CBitmap oBitmap;
    //oBitmap.LoadBitmap("IDB_BITMAP1");
    pImage = auxDIBImageLoad(filename);
    if(pImage == NULL)        return false;
    glGenTextures(1, &texture);   
    glBindTexture    (GL_TEXTURE_2D,texture);
    gluBuild2DMipmaps(GL_TEXTURE_2D,4, pImage->sizeX,
                    pImage->sizeY,GL_RGB, GL_UNSIGNED_BYTE,pImage->data);
    free(pImage->data);
    free(pImage);   
    return true;
}

//选择纹理
void Animation::SelectTexture(GLuint texture)
{
    glBindTexture (GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}

//选择纹理重复
void Animation::SelectTextureRepeat(GLuint texture)
{
    glBindTexture (GL_TEXTURE_2D, texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
}

//启用光照
void Animation::SetupLight()
{
    GLfloat light_position[] = {1.0,5.0,1.0,1.0};
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
}

//键盘控制
void Animation::InitInput()
{
    float v = 0.5f;

    if(KEY_DOWN(VK_SHIFT)) v = v * 4;        //Shift
    if(KEY_DOWN(65)) oAngle -= v*2;        //A
    if(KEY_DOWN(68)) oAngle += v*2;        //D

    oRad = float(3.14159 * oAngle/180.0f);    //半径

    if(KEY_DOWN(VK_PRIOR)) oEve += v;        //Page Up
    if(KEY_DOWN(VK_NEXT)) oEve -= v;        //Page Down
    if(oEve < -360) oEve = -360;            //边界检查
    if(oEve > 360) oEve = 360;            //边界检查

    if(KEY_DOWN(87))                        //W
    {
        oEye[2] += (float)sin(oRad) * v;
        oEye[0] += (float)cos(oRad) * v;
    }

    if(KEY_DOWN(83))                        //S
    {
        oEye[2] -= (float)sin(oRad) * v;
        oEye[0] -= (float)cos(oRad) * v;
    }

    if(KEY_DOWN(81)) oEye[1] += v;            //Q
    if(KEY_DOWN(69)) oEye[1] -= v;            //E

    oLtn[0] = (float)(oEye[0] + 100*cos(oRad));
    oLtn[2] = (float)(oEye[2] + 100*sin(oRad));
    oLtn[1] = oEye[1] + oEve;

    //设置观察点和视点坐标
    gluLookAt(oEye[0], oEye[1], oEye[2], oLtn[0], oLtn[1], oLtn[2], 0.0, 1.0, 0.0);

}

类别:探索 | 浏览() | 评论 (0)
 
网友评论:
本篇日志被作者设置为禁止发表新评论

     

©2008 Baidu