图形学实验三:Texture Mapping

来源:互联网 发布:阿里云企业邮箱 pop3 编辑:程序博客网 时间:2024/05/16 19:34

图形学实验三: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 Texturesvoid 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

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








0 0