图形学实验三:Texture Mapping

图形学实验三:Texture Mapping

唉,还是上学期做的实验,不过由于快到期末要复习考试,没有来得及整理。。。这学期刚开学没多久,时间比较多,就赶紧整理整理下~~

纹理映射学习参考

推荐一个老师给我们的网站,很好,虽然是英文,但讲得很详细!
NeHe’s OpenGL Tutorials
里面第八个就是讲关于Texture Mapping的
Texture Mapping
讲得很好,我也懒得整理了,而且英文也挺容易看懂的,看看也正好可以练练英语,对吧,嘿嘿。“

实验内容

本次实验内容,是老师让我们在第二个实验的基础上,增加纹理映射,以及移动。也就是在我第二个实验中的“火柴人”的基础上,给它穿点衣服,顺便让它手、脚能动起来。手、脚动起来,这就要涉及分层设计,这个在我第二个实验的文章中一开始就已经提到了:
图形学实验二:画个火柴人

我画的火柴人,手和脚能自动动起来,就像在走路。顺便还加了个键盘控制:

  • ‘q’:控制Larm1;’w’:控制Larm2
  • ‘a’:控制Rarm1;’s’:控制Rarm2
  • ‘e’:控制Left leg1;’r’:控制Left leg2
  • ‘d’:控制Right leg1;’f’:控制Right leg2
  • ‘z’:控制整个火柴人绕y轴旋转
  • ‘x’:控制整个火柴人绕x轴旋转
  • ‘c’:控制整个火柴人向右平移
  • ‘v’:控制整个火柴人向左平移

具体的就不说了,贴上代码和截图吧~~

#define _STDCALL_SUPPORTED
#define _WCHAR_T_DEFINED
#include <GL/glut.h>
#include <windows.h>        // Header File For Windows
#include <gl\gl.h>      // Header File For The OpenGL32 Library
#include <gl\glu.h>     // Header File For The GLu32 Library
#include <GL\glaux.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>


static float x_move = 20.0;
static float  y_move = 20.0;
static float q_Rotated = 0.0;
static float q_hand = 0.0;
static float q_hand2 = 90.0;
static int count = 0;




static int slices = 16;
static int stacks = 16;
static float rtri =0;
static float rquad =0;


static float xrot =0;           // X Rotation ( NEW )
static float yrot =0;           // Y Rotation ( NEW )
static float zrot =0;           // Z Rotation ( NEW )
GLUquadricObj   *uquadric;  //二次曲面声明类型
float Lfleg1=0,Lfleg2=0,Rgleg1=0,Rgleg2=0,Larm1=0,Larm2=0,Rarm1=0,Rarm2=0;
float hipy=0,hipx=0;
int LL1change=5,LL2change=5;
int RL1change=5,RL2change=5;
int LA1change=5,LA2change=5;
int RA1change=5,RA2change=5;
int hipychange=5;
int hipxchange=5;
float dischange=0.1;
float dis=0;
GLuint texture[9];      // Storage For One Texture ( NEW )


void drawHip();
void drawTorso();
void drawLeftleg1();
void drawRightleg1();
void drawLeftarm1();
void drawLefttarm2();
void drawRightarm1();
void drawRightarm2();
void drawNeck();
void drawHead();
void selfRotateRL1();




// Load Bitmaps And Convert To Textures
void LoadGLTextures()
{
    // Load Texture
    AUX_RGBImageRec *texture2[9];
    texture2[0] = auxDIBImageLoad("head/face.bmp");
    texture2[1]=auxDIBImageLoad("head/behind.bmp");
    texture2[2]=auxDIBImageLoad("head/left.bmp");
    texture2[3]=auxDIBImageLoad("head/right.bmp");
    texture2[4]=auxDIBImageLoad("head/top.bmp");
    texture2[5]=auxDIBImageLoad("clothes/before.bmp");
    texture2[6]=auxDIBImageLoad("clothes/after.bmp");
    texture2[7]=auxDIBImageLoad("clothes/left.bmp");
    texture2[8]=auxDIBImageLoad("clothes/right.bmp");
    // Create Texture
    //head
    //face
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[0]->sizeX, texture2[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[0]->data);


    //behind
    glGenTextures(2, &texture[1]);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[1]->sizeX, texture2[1]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[1]->data);


    //left
    glGenTextures(3, &texture[2]);
    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[2]->sizeX, texture2[2]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[2]->data);


    //right
    glGenTextures(4, &texture[3]);
    glBindTexture(GL_TEXTURE_2D, texture[3]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[3]->sizeX, texture2[3]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[3]->data);


    //top
    glGenTextures(5, &texture[4]);
    glBindTexture(GL_TEXTURE_2D, texture[4]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[4]->sizeX, texture2[4]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[4]->data);


    //clothes
    //before
    glGenTextures(6, &texture[5]);
    glBindTexture(GL_TEXTURE_2D, texture[5]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[5]->sizeX, texture2[5]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[5]->data);
    //after
    glGenTextures(7, &texture[6]);
    glBindTexture(GL_TEXTURE_2D, texture[6]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[6]->sizeX, texture2[6]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[6]->data);
    //left
    glGenTextures(8, &texture[7]);
    glBindTexture(GL_TEXTURE_2D, texture[7]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[7]->sizeX, texture2[7]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[7]->data);
    //right
    glGenTextures(9, &texture[8]);
    glBindTexture(GL_TEXTURE_2D, texture[8]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, texture2[8]->sizeX, texture2[8]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, texture2[8]->data);


}


void InitGL(GLsizei Width, GLsizei Height)
{
    LoadGLTextures();               // Load The Texture(s) ( NEW )
    glEnable(GL_TEXTURE_2D);            // Enable Texture Mapping ( NEW )


    glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
    glClearDepth(1.0);
    glDepthFunc(GL_LESS);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_SMOOTH);
    gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);
}


void ChangeSize(GLsizei w,GLsizei h)
{
    GLfloat nRange = 1;
    InitGL(w,h);
    if(h == 0)
        h=1;
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h)
        glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);
    else
        glOrtho(-nRange*w/h,nRange*w/h,-nRange,nRange,-nRange,nRange);


    glMatrixMode(GL_MODELVIEW);
    //selfRotateWhole();
    glLoadIdentity();


}
static float rotateAngle = 0;
static int times1 = 0;
void selfRotateWhole(){
    times1++;
    if(times1 > 50)
    {
        times1 = 0;
    }


    if(times1 % 50 == 0)
    {
        Rarm1=((int)Rarm1-RA1change);
        if(Rarm1>60)
            RA1change=-RA1change;
        if(Rarm1<-60)
            RA1change=-RA1change;


        Larm1=((int)Larm1+LA1change);
        if(Larm1>60)
            LA1change=-LA1change;
        if(Larm1<-60)
            LA1change=-LA1change;
        Lfleg1=((int)Lfleg1+LL1change);
        if(Lfleg1>60)
            LL1change=-LL1change;
        if(Lfleg1<-60)
            LL1change=-LL1change;
        Rgleg1=((int)Rgleg1-RL1change);
        if(Rgleg1>60)
            RL1change=-RL1change;
        if(Rgleg1<-60)
            RL1change=-RL1change;


    }


}
static void display(void)
{
    //如果缺少GL_DEPTH_BUFFER_BIT,那么人转动后,就会消失,偶尔只能看见一部分!!!
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //清除当前可写的颜色缓冲
    //InitGL();
    //glMatrixMode(GL_MODELVIEW);
    glColor3f(1.0,0.0,0.0);
    //glLoadIdentity();
    glLoadIdentity();
    glScalef(0.5,0.5,1.0); //先缩放下,不然木头人会很大。。。
    glPushMatrix();


    selfRotateWhole();
    glRotatef(hipy,0.0,1.0,0.0);
    glRotatef(hipx,1.0,0.0,0.0);
    drawHip();
    //glutWireCube(0.3);
    glPopMatrix();
    glFlush();
    glutSwapBuffers();
}


static void idle(void)
{
    glutPostRedisplay();
}


void keyboard(unsigned char key, int x, int y)
{
    switch (key) {
    //Leftarm1
    case 'q':
        Larm1=((int)Larm1+LA1change);
        if(Larm1>60)
            LA1change=-LA1change;
        if(Larm1<-60)
            LA1change=-LA1change;
        glutPostRedisplay();
        break;
    //Leftarm2
    case 'w':
        Larm2=((int)Larm2+LA2change);
        if(Larm2>60)
            LA2change=-LA2change;
        if(Larm2<-60)
            LA2change=-LA2change;
        glutPostRedisplay();
        break;
    //Rightarm1
    case 'a':
        Rarm1=((int)Rarm1+RA1change);
        if(Rarm1>60)
            RA1change=-RA1change;
        if(Rarm1<-60)
            RA1change=-RA1change;
        glutPostRedisplay();
        break;
    //Rightarm2
    case 's':
        Rarm2=((int)Rarm2+RA2change);
        if(Rarm2>60)
            RA2change=-RA2change;
        if(Rarm2<-60)
            RA2change=-RA2change;
        glutPostRedisplay();
        break;
    //Leftleg1
    case 'e':
        Lfleg1=((int)Lfleg1+LL1change);
        if(Lfleg1>60)
            LL1change=-LL1change;
        if(Lfleg1<-60)
            LL1change=-LL1change;
        glutPostRedisplay();
        break;
    //Leftleg2
    case 'r':
        Lfleg2=((int)Lfleg2+LL2change);
        if(Lfleg2>60)
            LL2change=-LL2change;
        if(Lfleg2<-60)
            LL2change=-LL2change;
        glutPostRedisplay();
        break;
    //Rightleg1
    case 'd':
        Rgleg1=((int)Rgleg1+RL1change);
        if(Rgleg1>60)
            RL1change=-RL1change;
        if(Rgleg1<-60)
            RL1change=-RL1change;
        glutPostRedisplay();
        break;
    //Rightleg2
    case 'f':
        Rgleg2=((int)Rgleg2+RL2change);
        if(Rgleg2>60)
            RL2change=-RL2change;
        if(Rgleg2<-60)
            RL2change=-RL2change;
        glutPostRedisplay();
        break;
    case 'z':
        hipy=((int)hipy+hipychange);
        if(hipy>360)
            hipy-=360;
        glutPostRedisplay();
        break;
    case 'x':
        hipx=((int)hipx+hipxchange);
        if(hipx>360)
            hipx-=360;
        glutPostRedisplay();
        break;
    case 'c':
        dis=dis+dischange;
        glutPostRedisplay();
        break;
    case 'v':
        dis=dis-dischange;
        glutPostRedisplay();
        break;
    }
}


void init(){
    //glClearColor(0.0,0.0,0.0,0.0); //glClearColor(R,G,B,AFA)清空当前颜色,并且设定颜色值
    glShadeModel(GL_FLAT);  //设置着色模式。
    uquadric = gluNewQuadric();
}


const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };


const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };


/* Program entry point */


int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(10,10);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    //glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH);
    glutCreateWindow("GLUT Shapes");
    init();


    glutDisplayFunc(display);
    glutReshapeFunc(ChangeSize);
    glutIdleFunc(idle);
    glutKeyboardFunc(keyboard);
    glutMainLoop();


    return 0;
}


//画臀部,根节点
void drawHip(){
    //glScalef(0.5,0.5,1.0); //先缩放下,不然木头人会很大。。。
    glScalef(2.0,0.5,1.0);
    glPushMatrix();
    glColor3f(1.0,1.0,0.0);
    glTranslatef(dis,-1.0,0.0);
    //glutWireCube(0.3);
    glutSolidCube(0.3);
    drawTorso();
    drawLeftleg1();
    drawRightleg1();
    glPopMatrix();
}


//画肩膀
void drawShoulder(){
    glScalef(2.0,0.5,2.0);  //先还原成1:1
    glScalef(2.0,0.5,1.0);
    glPushMatrix();
    glColor3f(1.0,1.0,0.0);
    glTranslatef(0.0,1.45,0.0);
    //glutWireCube(0.4);
    glutSolidCube(0.4);
    drawRightarm1();
    drawLeftarm1();
    drawNeck();
    drawHead();
    glPopMatrix();
}
//画躯干
void drawTorso(){
    glScalef(0.5,2.0,1.0);  //先还原成1:1
    glScalef(0.5,2.0,0.5);  //躯干Z轴方向缩短一半,不然躯干太粗
    glPushMatrix();
    glColor3f(1.0,1.0,0.0);
    glTranslatef(0.0,0.35,0.0);
    //glutWireCube(0.6);
    //glutSolidCube(0.6);


    //before
    glBindTexture(GL_TEXTURE_2D, texture[5]);
    glBegin(GL_QUADS);
        // Front Face
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-0.3f, -0.3f,  0.3f);    // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( 0.3f, -0.3f,  0.3f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 0.3f,  0.3f,  0.3f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-0.3f,  0.3f,  0.3f);    // Top Left Of The Texture and Quad


        // Bottom Face
        //glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-0.3f, -0.3f, -0.3f);    // Top Right Of The Texture and Quad
        //glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 0.3f, -0.3f, -0.3f);    // Top Left Of The Texture and Quad
        //glTexCoord2f(0.0f, 0.0f);
        glVertex3f( 0.3f, -0.3f,  0.3f);    // Bottom Left Of The Texture and Quad
        //glTexCoord2f(1.0f, 0.0f);
        glVertex3f(-0.3f, -0.3f,  0.3f);    // Bottom Right Of The Texture and Quad
    glEnd();
    //after
    glBindTexture(GL_TEXTURE_2D, texture[6]);
    glBegin(GL_QUADS);
        // Back Face
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(-0.3f, -0.3f, -0.3f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-0.3f,  0.3f, -0.3f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 0.3f,  0.3f, -0.3f);    // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( 0.3f, -0.3f, -0.3f);    // Bottom Left Of The Texture and Quad
    glEnd();


    //left
    //behind
    glBindTexture(GL_TEXTURE_2D, texture[7]);
    glBegin(GL_QUADS);
        // Left Face
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-0.3f, -0.3f, -0.3f);    // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(-0.3f, -0.3f,  0.3f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-0.3f,  0.3f,  0.3f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-0.3f,  0.3f, -0.3f);    // Top Left Of The Texture and Quad
    glEnd();


    //right
    glBindTexture(GL_TEXTURE_2D, texture[8]);
    glBegin(GL_QUADS);
        // Right face
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( 0.3f, -0.3f, -0.3f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 0.3f,  0.3f, -0.3f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 0.3f,  0.3f,  0.3f);    // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( 0.3f, -0.3f,  0.3f);    // Bottom Left Of The Texture and Quad
    glEnd();


    //top
    //glBindTexture(GL_TEXTURE_2D, texture[4]);
    glBegin(GL_QUADS);
        // Top Face
        //glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-0.3f,  0.3f, -0.3f);    // Top Left Of The Texture and Quad
        //glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-0.3f,  0.3f,  0.3f);    // Bottom Left Of The Texture and Quad
        //glTexCoord2f(1.0f, 0.0f);
        glVertex3f( 0.3f,  0.3f,  0.3f);    // Bottom Right Of The Texture and Quad
        //glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 0.3f,  0.3f, -0.3f);    // Top Right Of The Texture and Quad
    glEnd();
    drawShoulder();
    glPopMatrix();
}
void drawRightarm2(){
    glPushMatrix();
    //差点忘记了,arm1是绕x轴旋转了90度,所以三维坐标也跟着旋转了90度
    //这里第二个是“z轴”,负的往里,正的往外
    //第三个是“y轴”,负的网上,正的往下
    glTranslatef(0.0,0.0,0.7);
    glRotatef((GLfloat)Rarm2+15,0.0,-1.0,0.0);
    gluCylinder(uquadric, 0.08, 0.08, 0.6, 20.0, 8.0);
    glPopMatrix();
}
void drawRightarm1(){
    glScalef(0.5,2.0,1.0);  //还原成1:1
    glPushMatrix();
    glColor3f(1.0,0.6,0.6);
    //gluQuadricDrawStyle(uquadric, GLU_FILL);  //控制绘图风格
    glTranslatef(-0.3,-0.05,0.0);
    glRotatef((GLfloat)Rarm1+90,1.0,0.0,0.0);
    gluCylinder(uquadric, 0.08, 0.08, 0.7, 20.0, 8.0);
    drawRightarm2();
    glPopMatrix();
}


void drawLeftarm2(){
    glPushMatrix();
    glTranslatef(0.0,0.0,0.7);
    glRotatef((GLfloat)Larm2+15,0.0,1.0,0.0);
    gluCylinder(uquadric, 0.08, 0.08, 0.6, 20.0, 8.0);
    glPopMatrix();
}
void drawLeftarm1(){
    glPushMatrix();
    glColor3f(1.0,0.6,0.6);
    glTranslatef(0.3,-0.05,0.0);
    glRotatef((GLfloat)Larm1+90,1.0,0.0,0.0);
    gluCylinder(uquadric, 0.08, 0.08, 0.7, 20.0, 8.0);
    drawLeftarm2();
    glPopMatrix();
}
//画头
void drawHead(){
    glPushMatrix();


    glTranslatef(0.0,0.60,0.0);
    glColor3f(1.0,1.0,0.2);
    //glutWireCube(0.40);


    //face
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_QUADS);
        // Front Face
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-0.2f, -0.2f,  0.2f);    // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( 0.2f, -0.2f,  0.2f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 0.2f,  0.2f,  0.2f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-0.2f,  0.2f,  0.2f);    // Top Left Of The Texture and Quad


        // Bottom Face
        //glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-0.2f, -0.2f, -0.2f);    // Top Right Of The Texture and Quad
        //glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 0.2f, -0.2f, -0.2f);    // Top Left Of The Texture and Quad
        //glTexCoord2f(0.0f, 0.0f);
        glVertex3f( 0.2f, -0.2f,  0.2f);    // Bottom Left Of The Texture and Quad
        //glTexCoord2f(1.0f, 0.0f);
        glVertex3f(-0.2f, -0.2f,  0.2f);    // Bottom Right Of The Texture and Quad
    glEnd();
    //behind
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    glBegin(GL_QUADS);
        // Back Face
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(-0.2f, -0.2f, -0.2f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-0.2f,  0.2f, -0.2f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 0.2f,  0.2f, -0.2f);    // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( 0.2f, -0.2f, -0.2f);    // Bottom Left Of The Texture and Quad
    glEnd();


    //left
    //behind
    glBindTexture(GL_TEXTURE_2D, texture[2]);
    glBegin(GL_QUADS);
        // Left Face
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-0.2f, -0.2f, -0.2f);    // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f(-0.2f, -0.2f,  0.2f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f(-0.2f,  0.2f,  0.2f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-0.2f,  0.2f, -0.2f);    // Top Left Of The Texture and Quad
    glEnd();


    //right
    glBindTexture(GL_TEXTURE_2D, texture[3]);
    glBegin(GL_QUADS);
        // Right face
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( 0.2f, -0.2f, -0.2f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 0.2f,  0.2f, -0.2f);    // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f( 0.2f,  0.2f,  0.2f);    // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f( 0.2f, -0.2f,  0.2f);    // Bottom Left Of The Texture and Quad
    glEnd();


    //top
    glBindTexture(GL_TEXTURE_2D, texture[4]);
    glBegin(GL_QUADS);
        // Top Face
        glTexCoord2f(0.0f, 1.0f);
        glVertex3f(-0.2f,  0.2f, -0.2f);    // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f);
        glVertex3f(-0.2f,  0.2f,  0.2f);    // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f);
        glVertex3f( 0.2f,  0.2f,  0.2f);    // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f);
        glVertex3f( 0.2f,  0.2f, -0.2f);    // Top Right Of The Texture and Quad
    glEnd();
    glPopMatrix();
}
//画脖子
void drawNeck(){
    glPushMatrix();
    glColor3f(1.0,1.0,0.0);
    glTranslatef(0.0,0.40,0.0);
    glRotatef(90,1.0,0.0,0.0);
    gluCylinder(uquadric, 0.10, 0.10, 0.30, 20.0, 8.0);
    glPopMatrix();
}


void drawRightLeg2(){
    glPushMatrix();
    glTranslatef(0.0,0.0,0.8);
    glRotatef((GLfloat)Rgleg2,0.0,-1.0,0.0);
    gluCylinder(uquadric, 0.1, 0.1, 0.8, 20.0, 8.0);
    glPopMatrix();
}
void drawRightleg1(){
    //glScalef(2.0,0.5,1.0);  //先还原成1:1
    glPushMatrix();
    glColor3f(0.0,0.0,1.0);
    glTranslatef(0.20,-0.05,0.0);
    //注意这里坐标轴绕x旋转了90度,leg2的坐标会变化
    glRotatef((GLfloat)Rgleg1+90,1.0,0.0,0.0);
    gluCylinder(uquadric, 0.1, 0.1, 0.8, 20.0, 8.0);
    drawRightLeg2();
    glPopMatrix();
}


void drawLeftLeg2(){
    glPushMatrix();
    glTranslatef(0.0,0.0,0.8);
    glRotatef((GLfloat)Lfleg2,0.0,-1.0,0.0);
    gluCylinder(uquadric, 0.1, 0.1, 0.8, 20.0, 8.0);
    glPopMatrix();
}


void drawLeftleg1(){
    glScalef(2.0,0.5,1.0);  //先还原成1:1
    glPushMatrix();
    glColor3f(0.0,0.0,1.0);
    glTranslatef(-0.20,-0.05,0.0);
    //注意这里坐标轴绕x旋转了90度,leg2的坐标会变化
    glRotatef((GLfloat)Lfleg1+90,1.0,0.0,0.0);
    gluCylinder(uquadric, 0.1, 0.1, 0.8, 20.0, 8.0);
    drawLeftLeg2();
    glPopMatrix();
}



附上代码下载链接:https://github.com/ruozhichen/Graphics/tree/master/Graphics/texture

下面附上截图,纹理映射的图片是小黄人的,唉,原本可爱的小黄人,弄到火柴人上,感觉好不协调额。。。。








猜你喜欢

转载自blog.csdn.net/sunny_xsc1994/article/details/44307187