}
void create_ceil() {
/************************************************************************/ /*采用纹理贴图的方式,就可以放弃循环画小图的方式了,下面的代码就不再使用*/ /************************************************************************/ /* int j =1; int i=1;
glTranslatef(0,height,0);
//glBindTexture(GL_TEXTURE_2D,textures[1]); glNormal3f(0,1,0); for(;j<=16;j++) {
glTranslatef(-wide+j*wide/8-wide/16,0,0); for(i=1;i<=16;i++)
glBindTexture(GL_TEXTURE_2D,textures[1]); glBegin(GL_QUADS);
glColor4f(0.4,0.3,0.3,0.6); glNormal3f(0,-1,0); glTexCoord2f(0.0,0.0); glVertex3f(-wide,height,-Dept); glTexCoord2f(16.0,0); glVertex3f(wide,height,-Dept); glTexCoord2f(16.0,16.0); glVertex3f(wide,height,Dept); glTexCoord2f(0.0,16.0); glVertex3f(-wide,height,Dept);
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,Material_ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,Material_diffuse); glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,Material_specular); glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,Material_shiness); GLfloat Material_ambient[4]={0.8,0.8,0.8,1.0}; GLfloat Material_diffuse[4]={0.8,0.8,0.8,1.0}; GLfloat Material_specular[4]={0.4,0.3,0.5,1.0}; GLfloat Material_shiness = 1.0;
glVertex3f(wide/16,0,-Dept/16); glVertex3f(-wide/16,0,-Dept/16);
glEnd();
glEnd();
}
void drawSphere(GLfloat xx=0,GLfloat yy=0,GLfloat zz=0,int flag=0) {
x[0] = radius * sin(angle_z) * cos(angle_xy); y[0] = radius * sin(angle_z) * sin(angle_xy); z[0] = radius * cos(angle_z);
for(j=0; j angle_xy = j * step_xy; float angle_z = 0.0; float angle_xy = 0.0; int i=0, j=0; if(flag == 0) else glColor3f(1.0,1.0,1.0); glBegin(GL_QUADS); for(i=0; i angle_z = i * step_z; glColor3f(0.5,0.25,0); GLfloat radius; if(flag == 0) else radius=wide/16; GLfloat M=20; GLfloat N=20; float step_z = PI/M; float step_xy = 2*PI/N; float x[4],y[4],z[4]; radius=2*wide/8; } glTranslatef(0,-height,0); */ { } glTranslatef(wide-j*wide/8+wide/16,0,0); glTranslatef(0,0,-Dept+i*Dept/8-Dept/16); create_quad(i,j); glTranslatef(0,0,Dept-i*Dept/8+Dept/16); } void yuanzhui() { glTranslatef(-wide/2,-height,-Dept/2); glBegin(GL_TRIANGLE_FAN); glColor3f(0,0.25,0.5); glNormal3f(1,1,1); glVertex3f(0,height/1.2,0); for(int i=0;i<=32;i++) { } glEnd(); glBegin(GL_TRIANGLE_FAN); glColor3f(0,0.25,0.5); glNormal3f(0,1,0); glVertex3f(0,0,0); for(int i=0;i<=32;i++) { } glVertex3f(0.2*cos(i*PI/16), 0.01 , 0.2*sin(i*PI/16)); glVertex3f(0.2*cos(i*PI/16),0,0.2*sin(i*PI/16)); } glEnd(); } for(int k=0; k<4; k++) { } glNormal3f(x[k],y[k],z[k]); glVertex3f(xx+x[k], yy+y[k],zz+z[k]); x[3] = radius * sin(angle_z) * cos(angle_xy + step_xy); y[3] = radius * sin(angle_z) * sin(angle_xy + step_xy); z[3] = radius * cos(angle_z); x[2] = radius*sin(angle_z + step_z)*cos(angle_xy + step_xy); y[2] = radius*sin(angle_z + step_z)*sin(angle_xy + step_xy); z[2] = radius*cos(angle_z + step_z); x[1] = radius * sin(angle_z + step_z) * cos(angle_xy); y[1] = radius * sin(angle_z + step_z) * sin(angle_xy); z[1] = radius * cos(angle_z + step_z); glEnd(); glTranslatef(wide/2,height,Dept/2); } void createFurnishings() { } void draw(GLenum mode) { } void display() { } int flag_move = 0 ; glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60,1,1,30); gluLookAt(eyex,eyey,eyez,0,0,0,0,1,0); draw(GL_RENDER); glFlush(); glutSwapBuffers(); createLightAndProxy(mode); create_wall(); create_floor(); create_ceil(); createFurnishings(); glMatrixMode(GL_MODELVIEW); if(flag_light == 1) { } else { } glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glTranslatef(0,-height+2*wide/8,-Dept+2*Dept/8); drawSphere(); glTranslatef(0,height-2*wide/8,Dept-2*Dept/8); yuanzhui(); void process(GLint hits,GLuint buffer[]) { } GLuint select_Buffer[SIZE]; void mouse(int key,int state,int x,int y) { gluPickMatrix((GLdouble)x,(GLdouble)(viewport[3]-y),5,5,viewport); gluPerspective(60,1,1,30); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glInitNames(); glPushName(0); glSelectBuffer(SIZE,select_Buffer); glRenderMode(GL_SELECT); GLint hits; GLint viewport[4]; if(key == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { mousex = x; mousey = y; glGetIntegerv(GL_VIEWPORT,viewport); ptr = (GLint *) buffer; for (i = 0; i < hits; i++) { } names = *ptr; ptr+=3; for (j = 0; j < names; j++) { /* for each name */ } if(*ptr==1) { } ptr++; flag_move = 1; /* for each hit */ unsigned int i, j; GLint names, *ptr;