int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View glTranslatef(0.0f,0.0f,z); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glBindTexture(GL_TEXTURE_2D, texture[filter]); switch(object) { case 0: glDrawCube(); break; case 1: glTranslatef(0.0f,0.0f,-1.5f); // Center The Cylinder gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); // A Cylinder With A Radius Of 0.5 And A Height Of 2 break; case 2: gluDisk(quadratic,0.5f,1.5f,32,32); // Draw A Disc (CD Shape) With An Inner Radius Of 0.5, And An Outer Radius Of 2. Plus A Lot Of Segments ;) break; case 3: gluSphere(quadratic,1.3f,32,32); // Draw A Sphere With A Radius Of 1 And 16 Longitude And 16 Latitude Segments break; case 4: glTranslatef(0.0f,0.0f,-1.5f); // Center The Cone gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32); // A Cone With A Bottom Radius Of .5 And A Height Of 2 break; case 5: part1+=p1; part2+=p2; if(part1>359) // 360 Degrees { p1=0; part1=0; p2=1; part2=0; } if(part2>359) // 360 Degrees { p1=1; p2=0; } gluPartialDisk(quadratic,0.5f,1.5f,32,32,part1,part2-part1); // A Disk Like The One Before break; }; xrot+=xspeed; yrot+=yspeed; return TRUE; // Keep Going }
void Sample_18::draw() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View glTranslatef(0.0f,0.0f,m_z); // Translate Into The Screen glRotatef(m_xrot,1.0f,0.0f,0.0f); // Rotate On The X Axis glRotatef(m_yrot,0.0f,1.0f,0.0f); // Rotate On The Y Axis glBindTexture(GL_TEXTURE_2D, m_texture[m_filter]); // Select A Filtered Texture switch(m_object) // Check object To Find Out What To Draw { case 0: // Drawing Object 1 glDrawCube(); // Draw Our Cube break; // Done case 1: // Drawing Object 2 glTranslatef(0.0f,0.0f,-1.5f); // Center The Cylinder gluCylinder(m_quadratic,1.0f,1.0f,3.0f,32,32); // Draw Our Cylinder break; // Done case 2: // Drawing Object 3 gluDisk(m_quadratic,0.5f,1.5f,32,32); // Draw A Disc (CD Shape) break; // Done case 3: // Drawing Object 4 gluSphere(m_quadratic,1.3f,32,32); // Draw A Sphere break; // Done case 4: // Drawing Object 5 glTranslatef(0.0f,0.0f,-1.5f); // Center The Cone gluCylinder(m_quadratic,1.0f,0.0f,3.0f,32,32); // A Cone With A Bottom Radius Of .5 And A Height Of 2 break; // Done case 5: // Drawing Object 6 m_part1+=m_p1; // Increase Start Angle m_part2+=m_p2; // Increase Sweep Angle if(m_part1>359) // 360 Degrees { m_p1=0; // Stop Increasing Start Angle m_part1=0; // Set Start Angle To Zero m_p2=1; // Start Increasing Sweep Angle m_part2=0; // Start Sweep Angle At Zero } if(m_part2>359) // 360 Degrees { m_p1=1; // Start Increasing Start Angle m_p2=0; // Stop Increasing Sweep Angle } gluPartialDisk(m_quadratic,0.5f,1.5f,32,32,m_part1,m_part2-m_part1); // A Disk Like The One Before break; // Done }; m_xrot+=m_xspeed; // Increase Rotation On X Axis m_yrot+=m_yspeed; // Increase Rotation On Y Axis }
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer glLoadIdentity(); // Reset The View glTranslatef(0.0f,0.0f,z); glEnable(GL_TEXTURE_GEN_S); // Enable Texture Coord Generation For S (NEW) glEnable(GL_TEXTURE_GEN_T); // Enable Texture Coord Generation For T (NEW) glBindTexture(GL_TEXTURE_2D, texture[filter+(filter+1)]); // This Will Select The Sphere Map glPushMatrix(); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); switch(object) { case 0: glDrawCube(); break; case 1: glTranslatef(0.0f,0.0f,-1.5f); // Center The Cylinder gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); // A Cylinder With A Radius Of 0.5 And A Height Of 2 break; case 2: gluSphere(quadratic,1.3f,32,32); // Draw A Sphere With A Radius Of 1 And 16 Longitude And 16 Latitude Segments break; case 3: glTranslatef(0.0f,0.0f,-1.5f); // Center The Cone gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32); // A Cone With A Bottom Radius Of .5 And A Height Of 2 break; }; glPopMatrix(); glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glBindTexture(GL_TEXTURE_2D, texture[filter*2]); // This Will Select The BG Maps... glPushMatrix(); glTranslatef(0.0f, 0.0f, -24.0f); glBegin(GL_QUADS); glNormal3f( 0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-13.3f, -10.0f, 10.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 13.3f, -10.0f, 10.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 13.3f, 10.0f, 10.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-13.3f, 10.0f, 10.0f); glEnd(); glPopMatrix(); xrot+=xspeed; yrot+=yspeed; return TRUE; // Keep Going }
void VruiDemoSmall::display(GLContextData& contextData) const { /* Draw a red cube and a blue sphere: */ glPushMatrix(); glTranslated(-5.0,0.0,0.0); glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(1.0f,0.5f,0.5f)); glDrawCube(7.5f); glTranslated(10.0,0.0,0.0); glMaterialAmbientAndDiffuse(GLMaterialEnums::FRONT,GLColor<GLfloat,4>(0.5f,0.5f,1.0f)); glDrawSphereIcosahedron(4.5f,6); glPopMatrix(); }
void PointLight::render() { glPushMatrix(); glMultTransposeMatrixf(object.getComponent<Transform>()->getLocalToWorld().get()); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glColor3f(0, 1, 0); glDrawCube(); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_TEXTURE); glEnable(GL_LIGHTING); glPopMatrix(); }
void nehewidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0,0.0,zoom); glEnable(GL_TEXTURE_GEN_S); // 自动生成s方向纹理坐标 glEnable(GL_TEXTURE_GEN_T); // 自动生成t方向纹理坐标 glBindTexture(GL_TEXTURE_2D,texture[filter]); glPushMatrix(); glRotatef(xrot,1.0,0.0,0.0); glRotatef(yrot,0.0,1.0,0.0); switch(object) { case 0: glDrawCube(); break; case 1: glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(quadratic,1.0f,1.0f,3.0f,32,32); break; case 2: gluSphere(quadratic,1.3f,32,32); break; case 3: glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(quadratic,1.0f,0.0f,3.0f,32,32); break; default: break; } glPopMatrix(); glDisable(GL_TEXTURE_GEN_S); // 禁止自动生成纹理坐标 glDisable(GL_TEXTURE_GEN_T); xrot+=xspeed; yrot+=yspeed; }
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { if(op || pp) { if(perspective == 0){ glViewport(0,0,w_window,h_window); // Reset The Current Viewport glMatrixMode(GL_PROJECTION); // Select The Projection Matrix glLoadIdentity(); // Reset The Projection Matrix glOrtho(-10.0f, (w_window-10.0f)/80, -5.0f, (h_window-5.0f)/80, -60.0f,60.0f); // Create Ortho 640x480 View (0,0 At Top Left) glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glLoadIdentity(); // Reset The Modelview Matrix } else{ ReSizeGLScene(w_window, h_window); } } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer if(wire == 1) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); else glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //draw front wheel glLoadIdentity(); // Reset The Current Modelview Matrix //glRotatef(rtri,0.0f,1.0f,0.0f); // Rotate The Triangle On The Y axis ( NEW ) int numOuter = 32; int numInner = 24; float innerRadius = 0.15f; float outerRadius = 0.8f; GLfloat sceneroty = 360.0f - yrot; GLfloat xtrans = -xpos; GLfloat ztrans = -zpos; GLfloat ytrans = -walkbias-0.25f; glTranslatef(0.0f, 0.0f, -10.0f); // Move Right 1.5 Units And Into The Screen 7.0 glTranslatef(xtrans, ytrans, ztrans); glRotatef(lookupdown,1.0f,0,0); glRotatef(sceneroty,0,1.0f,0); // glTranslatef(xtrans, ytrans, ztrans); glTranslatef(0.0f, 0.0f, zoom); glPushMatrix(); glTranslatef(-4.5f, 0.0f, 0.0f); // Move Right 1.5 Units And Into The Screen 7.0 glColor3f(0.2f,0.2f,0.2f); // Set The Color To Grey gldrawTorus(innerRadius, outerRadius, numInner, numOuter); glColor3f(0.8f,0.8f,0.8f); // Set The Color To Grey gldrawTorus(innerRadius / 2, outerRadius - innerRadius, numInner, numOuter); gldrawFan(outerRadius - 1.5f*innerRadius, 15); glPopMatrix(); //draw shaft glPushMatrix(); glTranslatef(-4.5f, 0.0f, 0.2f); glRotatef(180, 0.0f, 1.0f, 0.0f); glColor3f(0.8f,0.8f,0.8f); gluCylinder(quadratic,0.05f,0.05f,0.4f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-4.5f, -0.05f, -0.2f); glRotatef(-30, 0.0f, 0.0f, 1.0f); glRotatef(270, 1.0f, 0.0f, 0.0f); glColor3f(0.8f,0.8f,0.8f); gluCylinder(quadratic,0.05f,0.05f,1.3f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-4.5f, -0.05f, 0.2f); glRotatef(-30, 0.0f, 0.0f, 1.0f); glRotatef(270, 1.0f, 0.0f, 0.0f); glColor3f(0.8f,0.8f,0.8f); gluCylinder(quadratic,0.05f,0.05f,1.3f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-4.5f, 0.0f, 0.0f); glRotatef(18, 0.0f, 0.0f, 1.0f); glTranslatef(0.9f, 0.8f, 0.2f); glRotatef(180, 0.0f, 1.0f, 0.0f); glColor3f(0.8f,0.8f,0.8f); gluCylinder(quadratic,0.05f,0.05f,0.4f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-4.5f, 0.0f, 0.0f); glRotatef(12, 0.0f, 0.0f, 1.0f); glTranslatef(0.85f, 0.85f, 0.0f); glRotatef(-30, 0.0f, 0.0f, 1.0f); glRotatef(270, 1.0f, 0.0f, 0.0f); glColor3f(0.5f,0.5f,0.5f); gluCylinder(quadratic,0.1f,0.1f,1.5f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-3.5f, 0.1f, 0.0f); glColor3f(0.5f,0.5f,0.5f); gldrawCurve(0.9f, 32, 1.5f, 1.0f); glPopMatrix(); //draw handle bars glPushMatrix(); glTranslatef(-4.7f, -0.4f, 0.0f); glRotatef(-25, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 3.0f, 0.0f); glRotatef(180, 0.0f, 1.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.06f,0.06f,0.6f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-4.7f, -0.4f, 0.6f); glRotatef(-25, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 3.0f, 0.0f); glRotatef(180, 0.0f, 1.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.06f,0.06f,0.6f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-3.45f, 2.3f, 0.6f); glRotatef(-20, 0.0f, 0.0f, 1.0f); glRotatef(270, 1.0f, 0.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.06f,0.06f,0.8f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-3.45f, 2.3f, -0.6f); glRotatef(-20, 0.0f, 0.0f, 1.0f); glRotatef(270, 1.0f, 0.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.06f,0.06f,0.8f,32,32); glPopMatrix(); glPushMatrix(); glTranslatef(-4.4f, 0.3f, 1.1f); glRotatef(-25, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 3.0f, 0.0f); glRotatef(180, 0.0f, 1.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.08f,0.08f,0.6f,32,32); gldrawCircle(0.08f); glPopMatrix(); glPushMatrix(); glTranslatef(-4.4f, 0.3f, -0.6f); glRotatef(-25, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 3.0f, 0.0f); glRotatef(180, 0.0f, 1.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.08f,0.08f,0.6f,32,32); gldrawCircle(0.08f); glPopMatrix(); //draw cover of wheel glPushMatrix(); glTranslatef(-4.5f, 0.1f, 0.0f); gldrawCurve(0.6f, 32, 1.5, 5.0); glPopMatrix(); //draw light glPushMatrix(); glTranslatef(-4.5f, 0.0f, 0.0f); glRotatef(-5, 0.0f, 0.0f, 1.0f); glTranslatef(0.65f, 0.0f, 0.0f); glRotatef(-90, 0.0f, 1.0f, 0.0f); glTranslatef(0.0f, 2.0f, 0.0f); glColor3f(0.8f,0.8f,0.8f); gluCylinder(quadratic,0.1f,0.3f,0.5f,32,32); glColor3f(0.8f,0.8f,0.0f); glTranslatef(0.0f, 0.0f, 0.5f); gldrawCircle(0.3f); glPopMatrix(); //draw windscreen glPushMatrix(); glColor3f(0.6f,0.6f,0.6f); glTranslatef(-3.6f, 2.2f, 0.0f); glRotatef(-15, 0.0f, 0.0f, 1.0f); glRotatef(-90, 0.0f, 1.0f, 0.0f); glBegin(GL_QUADS); glVertex3f(0.6f, 0.6f, 0.0f); glVertex3f(-0.6f, 0.6f, 0.0f); glVertex3f(-0.6f, -0.6f, 0.0f); glVertex3f(0.6f, -0.6f, 0.0f); glEnd(); glPopMatrix(); glPushMatrix(); glTranslatef(-3.5f, 2.6f, 0.0f); glRotatef(-15, 0.0f, 0.0f, 1.0f); glRotatef(-90, 0.0f, 1.0f, 0.0f); gldrawCircle(0.6f); glPopMatrix(); //draw Rear wheel glPushMatrix(); glTranslatef(-0.5f, 0.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gldrawTorus(innerRadius, outerRadius, numInner, numOuter); glColor3f(0.8f,0.8f,0.8f); gldrawTorus(innerRadius / 2, outerRadius - innerRadius, numInner, numOuter); gldrawFan(outerRadius - 1.5f*innerRadius, 15); glPopMatrix(); //draw exhaust pipe glPushMatrix(); glTranslatef(-2.0f, 0.3f, 0.2f); glRotatef(90, 0.0f, 0.0f, 1.0f); glRotatef(90, 1.0f, 0.0f, 0.0f); glColor3f(0.4f,0.4f,0.4f); gluCylinder(quadratic,0.15f,0.15f,2.0f,32,32); glPopMatrix(); //draw seat glPushMatrix(); glTranslatef(-1.5f, 1.0f, 0.0f); glRotatef(180,1.0f,0.0f,0.0f); glColor3f(0.4f,0.4f,0.4f); glDrawCube(2.0f, 0.4f, 0.4f); glPopMatrix(); glPushMatrix(); glTranslatef(0.4f, 1.2f, 0.0f); glRotatef(180,1.0f,0.0f,0.0f); glColor3f(0.6f,0.6f,0.6f); glDrawCube(0.6f, 0.6f, 0.7f); glPopMatrix(); glPushMatrix(); glTranslatef(1.0f, 1.0f, 0.0f); glRotatef(90, 0.0f, 0.0f, 1.0f); glRotatef(90, 1.0f, 0.0f, 0.0f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.05f,0.05f,0.5f,32,32); glPopMatrix(); //draw gas tank glPushMatrix(); glTranslatef(-3.0f, 0.8f, -0.6f); glColor3f(0.2f,0.2f,0.2f); gluCylinder(quadratic,0.5f,0.5f,1.3f,32,32); glColor3f(0.7f,0.7f,0.7f); gldrawCircle(0.5f); glTranslatef(0.0f, 0.0f, 1.45f); gldrawCircle(0.5f); glTranslatef(-0.2f, 0.2f, 0.0f); glColor3f(0.5f,0.5f,0.5f); gluCylinder(quadratic,0.1f,0.1f,0.05f,32,32); gldrawCircle(0.1f); glPopMatrix(); //draw trailer //draw cargo of the trailer glPushMatrix(); glTranslatef(3.0f, 0.5f, 0.0f); glColor3f(0.5f,0.5f,0.5f); glDrawCube(1.5f, 0.6f, 1.0f); //draw wheels of the trailer glTranslatef(0.0f, -0.8f, 1.0f); glDrawWheel(0.1f, 0.6f); glTranslatef(0.0f, 0.0f, -2.0f); glDrawWheel(0.1f, 0.6f); glPopMatrix(); return TRUE; // Keep Going }
void DrawGLScene(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除场景和深度缓存 glLoadIdentity(); // 重置当前矩阵 // 在此处添加代码进行绘制: glTranslatef(0.0f, 0.5f,-2.0f); glRotatef(30, 1.0f, 0.0f, 0.0f); //glRotatef(-20, 0.0f, 1.0f, 0.0f); //先把n个手指画出来 g_StickVector SStick *sTemp; double factor = 200.0; GLUquadricObj *qobj = gluNewQuadric(); EnterCriticalSection(&g_csStick); for(int i=0; i<g_StickVector.size(); ++i) { glColor3f(0,1,0); sTemp = &g_StickVector[i]; //一些坐标的调整(下个版本将使用1:1的比例来绘制,这个OpenGL程序是别人的,我并未进行太多修改) sTemp->start_x /= factor*1.2; sTemp->start_y /= factor*1.5; sTemp->start_z /= factor; sTemp->end_x /= factor*1.2; sTemp->end_y /= factor*1.5; sTemp->end_z /= factor; sTemp->start_x += 0.1; sTemp->end_x += 0.1; sTemp->start_z -= 0.2; sTemp->end_z -= 0.2; sTemp->start_y -= 0.7; sTemp->end_y -= 0.7; glPushMatrix();//////////////////////////////// //初始化 glLineWidth(3); glPointSize(10); //下面是画线,可以选择打开看看效果 // glBegin(GL_LINES); // glVertex3f(sTemp->start_x,sTemp->start_y,sTemp->start_z); // glVertex3f(sTemp->end_x,sTemp->end_y,sTemp->end_z); // glEnd(); glPopMatrix();////////////////////////// glColor3f(1,0,0); glPushMatrix(); glTranslatef(sTemp->end_x,sTemp->end_y,sTemp->end_z); gluSphere(qobj,0.03,100,100); glPopMatrix(); } LeaveCriticalSection(&g_csStick); glColor3f(1,1,1); // 从左到右绘制七个白色按键 glBindTexture(GL_TEXTURE_2D, texture[0]); glPushMatrix(); glTranslatef(-0.8f,-0.5f,0.0f); // 第一个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (0 == g_PressWhichKey) glTranslatef(0.0f, -0.04f, 0.0f); glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); // 第二个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (1 == g_PressWhichKey) { glTranslatef(0.0f, -0.04f, 0.0f); } glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); // 第三个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (2 == g_PressWhichKey) glTranslatef(0.0f, -0.04f, 0.0f); glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); // 第四个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (3 == g_PressWhichKey) glTranslatef(0.0f, -0.04f, 0.0f); glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); // 第五个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (4 == g_PressWhichKey) glTranslatef(0.0f, -0.04f, 0.0f); glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); // 第六个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (5 == g_PressWhichKey) glTranslatef(0.0f, -0.04f, 0.0f); glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); // 第七个白色按键 glTranslatef(0.2f, 0.0f, 0.0f); glPushMatrix(); if (6 == g_PressWhichKey) glTranslatef(0.0f, -0.04f, 0.0f); glDrawCube(0.2f, 0.1f, 0.8f); glPopMatrix(); glPopMatrix(); // 白色按键绘制完毕 // 循环绘制黑色按键 glBindTexture(GL_TEXTURE_2D, texture[1]); glPushMatrix(); glTranslatef(-0.7f, -0.46f, -0.2f); for (int loop=0; loop<7; loop++) { glTranslatef(0.2f, 0.0f, 0.0f); glDrawCube(0.1f, 0.1f, 0.4f); } glPopMatrix(); // 绘制整个钢琴(除按键外) glBindTexture(GL_TEXTURE_2D, texture[2]); glPushMatrix(); glTranslatef(0.0f, 0.0f, -0.8f); glDrawCube(1.8f, 0.1f, 1.0f); glPopMatrix(); glPushMatrix(); glTranslatef(0.0f, 0.0f, -0.8f); glTranslatef(0.0f, -0.65f, 0.0f); glDrawCube(1.6f, 1.2f, 0.8f); glPopMatrix(); glPushMatrix(); glTranslatef(-0.75f, -0.8f, 0.0f); glDrawCube(0.1f, 0.9f, 0.8f); glTranslatef(1.5f, 0.0f, 0.0f); glDrawCube(0.1f,0.9f, 0.8f); glPopMatrix(); glPushMatrix(); glTranslatef(0.0f, -1.3f, -0.4f); glDrawCube(1.8f, 0.1f, 1.7f); glPopMatrix(); glutSwapBuffers(); }
//接下来就是场景绘制函数了,在这里我只写一个简单的例子。并且当我绘制一个部分的盘子的时候,我将使用一个静态变量 //(一个局部的变量,该变量可以保留他的值不论你任何时候调用他)来表达一个非常酷的效果。为了清晰起见我将要重写DrawGLScene函数。 //你们将会注意到当我讨论这些正在使用的参数时我忽略了当前函数的第一个参数(quadratic)。 //这个参数将被除立方体外的所有对象使用。所以当我讨论这些参数的时候我忽略了它。 void MyGLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕和深度缓存 glLoadIdentity(); // 重置当前的模型观察矩阵 glTranslatef(0.0f,0.0f,m_z); // 移入屏幕z个单位 //下三行代码放置并旋转贴图立方体。glTranslatef(0.0f,0.0f,z)将立方体沿着Z轴移动Z单位。 //glRotatef(xrot,1.0f,0.0f,0.0f)将立方体绕X轴旋转xrot。 //glRotatef(yrot,0.0f,1.0f,0.0f)将立方体绕Y轴旋转yrot。 glRotatef(m_x_rotate,1.0f,0.0f,0.0f); // X轴旋转 glRotatef(m_y_rotate,0.0f,1.0f,0.0f); // Y轴旋转 glBindTexture(GL_TEXTURE_2D, m_texture[m_filter]); // 选择由filter决定的纹理 // 这部分是新增加的 switch(m_object) // 绘制哪一种二次几何体 { case 0:// 绘制立方体 { glDrawCube(); break; } case 1: { //我们创建的第2个对象是一个圆柱体。参数1(1.0F)是圆柱体的底面半径,参数2(1.0F)是圆柱体的饿顶面半径, //参数3(3.0F)是圆柱体的高度。参数4(32)是纬线(环绕Z轴有多少细分),参数5(32)是经线(沿着Z轴有多少细分)。 //细分越多该对象就越细致。我们可以用增加细分的方法来增加对象的多边形数。 //因此你可以牺牲速度换回质量(以时间换质量),大多数的时候我们都可以很容易的找到一个合适的“度”。 glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(m_quadratic, 1.0f, 1.0f, 3.0f, 32, 32); break; } case 2: { //对象3将会创建一个CD样子的盘子。参数1(0.5F)是盘子的内圆半径,该参数可以为0,则表示在盘子中间没孔,内圆半径越大孔越大。 //参数2(1.5F)表示外圆半径,这个参数必须比内圆半径大。参数3(32)是组成该盘子的切片的数量, //这个数量可以想象成披萨饼中的切片的数量。切片越多,外圆边缘就越平滑。最后一个参数(32)是组成盘子的环的数量。 //环很像唱片上的轨迹,一环套一环。这些环从内圆半径细分到外圆半径。再说一次,细分越多,速度越慢。 gluDisk(m_quadratic,0.5f,1.5f,32,32); break; } case 3: { //我们的第4个对象我知道你们为描述它耗尽精力。就是球。绘制球将会变的非常简单。参数1是球的半径。 //如果你无法理解半径/直径等等的话,可以理解成物体中心到物体外部的距离,在这里我们使用1.3F作为半径。 //接下来两个参数就是细分了,和圆柱体一样,参数2是纬线,参数3是经线。细分越多球看起来就越平滑, //通常球需要多一些的细分以使他们看起来平滑。 gluSphere(m_quadratic,1.3f,32,32); break; } case 4: { //我们创建的第4个对象使用与我们曾经创建的圆柱体一样的命令来创建,如果你还记得的话, //我们可以通过控制参数2和参数3来控制顶面半径和地面半径。因此我们可以使顶面半径为0来绘制一个圆锥体, //顶面半径为0将会在顶面上创建一个点。因此在下面的代码中,我们使顶面半径等于0,这将会创建一个点,同时也就创建了我们的圆锥。 glTranslatef(0.0f,0.0f,-1.5f); gluCylinder(m_quadratic,1.0f,0.0f,3.0f,32,32); } case 5: { //我们的第6个对象将被gluPartialDisk函数创建。我们打算创建的这个对象使用了一些命令,这些命令在我们创建对象之前, //你将会清楚的看到。但是命令gluPartialDisk拥有两个新的参数。第5个参数是我们想要绘制的部分盘子的开始角度,参数6是旋转角, //也就是转过的角度。我们将要增加旋转角,这将引起盘子沿顺时针方向缓慢的被绘制在屏幕上。一旦旋转角达到360度我们将开始增加开始角度 //,这样盘子看起来就想是被逐渐的抹去一样。我们将重复这些过程。 gluPartialDisk(m_quadratic,0.5f,1.5f,32,32,m_part1, m_part2 - m_part1); break; } } }
void Glyph::render(int glyphType,GLfloat glyphSize) { switch(glyphType) { case CONE: glRotatef(-90.0f,1.0f,0.0f,0.0f); glTranslatef(0.0f,0.0f,-0.75f*glyphSize); glDrawCone(0.25f*glyphSize,glyphSize,16); break; case CUBE: glDrawCube(glyphSize); break; case SPHERE: glDrawSphereIcosahedron(0.5f*glyphSize,8); break; case CROSSBALL: glDrawSphereIcosahedron(0.4f*glyphSize,8); glDrawCylinder(0.125f*glyphSize,1.1f*glyphSize,16); glRotatef(90.0f,1.0f,0.0f,0.0f); glDrawCylinder(0.125f*glyphSize,1.1f*glyphSize,16); glRotatef(90.0f,0.0f,1.0f,0.0f); glDrawCylinder(0.125f*glyphSize,1.1f*glyphSize,16); break; case BOX: { #if 1 glDrawWireframeCube(glyphSize,glyphSize*0.075f,glyphSize*0.15f); #else GLfloat gs=glyphSize*0.5f; glPushAttrib(GL_ENABLE_BIT|GL_POINT_BIT|GL_LINE_BIT); glDisable(GL_LIGHTING); glPointSize(5.0f); glBegin(GL_POINTS); glVertex3f(-gs,-gs,-gs); glVertex3f( gs,-gs,-gs); glVertex3f(-gs, gs,-gs); glVertex3f( gs, gs,-gs); glVertex3f(-gs,-gs, gs); glVertex3f( gs,-gs, gs); glVertex3f(-gs, gs, gs); glVertex3f( gs, gs, gs); glEnd(); glLineWidth(3.0f); glBegin(GL_LINE_STRIP); glVertex3f(-gs,-gs,-gs); glVertex3f( gs,-gs,-gs); glVertex3f( gs, gs,-gs); glVertex3f(-gs, gs,-gs); glVertex3f(-gs,-gs,-gs); glVertex3f(-gs,-gs, gs); glVertex3f( gs,-gs, gs); glVertex3f( gs, gs, gs); glVertex3f(-gs, gs, gs); glVertex3f(-gs,-gs, gs); glEnd(); glBegin(GL_LINES); glVertex3f( gs,-gs,-gs); glVertex3f( gs,-gs, gs); glVertex3f( gs, gs,-gs); glVertex3f( gs, gs, gs); glVertex3f(-gs, gs,-gs); glVertex3f(-gs, gs, gs); glEnd(); glPopAttrib(); #endif break; } } }
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing { int i; static char frbuf[80] = ""; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //set camera in hookmode if (hook_toball1) { TVector unit_followvector=sphere_speed[0]; unit_followvector.unit(); gluLookAt(sphere_speed[0].X()+250,sphere_speed[0].Y()+250 ,sphere_speed[0].Z(), sphere_speed[0].X()+sphere_speed[0].X() ,sphere_speed[0].Y()+sphere_speed[0].Y() ,sphere_speed[0].Z()+sphere_speed[0].Z() ,0,1,0); } else gluLookAt(pos._x,pos._y,pos._z, pos._x + dir.X(),pos._y+dir.Y(),pos._z+dir.Z(), 0,1.0,0.0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glRotatef(camera_rotation,0,1,0); for (i=0;i<NR_BALLS;i++) { switch(i % 7){ case 1: glColor3f(1.0f,1.0f,1.0f); break; case 2: glColor3f(1.0f,1.0f,0.0f); break; case 3: glColor3f(0.0f,1.0f,1.0f); break; case 4: glColor3f(0.0f,1.0f,0.0f); break; case 5: glColor3f(0.0f,0.0f,1.0f); break; case 6: glColor3f(0.65f,0.2f,0.3f); break; case 7: glColor3f(1.0f,0.0f,1.0f); break; case 8: glColor3f(0.0f,0.7f,0.4f); break; default: glColor3f(1.0f,0,0); } glPushMatrix(); glTranslated(sphere_poz[i]._x,sphere_poz[i]._y,sphere_poz[i]._z); GLUquadricObj *obj = gluNewQuadric(); gluQuadricDrawStyle(obj,GLU_FILL); gluQuadricNormals(obj,GLU_SMOOTH); gluQuadricOrientation(obj,GLU_OUTSIDE); gluSphere(obj, 5.0f, 20, 20); glPopMatrix(); gluDeleteQuadric(obj); } for (i=0;i<NR_CIL;i++) { switch(i % 7){ case 1: glColor3f(1.0f,1.0f,1.0f); break; case 2: glColor3f(1.0f,1.0f,0.0f); break; case 3: glColor3f(0.0f,1.0f,1.0f); break; case 4: glColor3f(0.0f,1.0f,0.0f); break; case 5: glColor3f(0.0f,0.0f,1.0f); break; case 6: glColor3f(0.65f,0.2f,0.3f); break; case 7: glColor3f(1.0f,0.0f,1.0f); break; case 8: glColor3f(0.0f,0.7f,0.4f); break; default: glColor3f(1.0f,0,0); } glPushMatrix(); glTranslated(cone_poz[i]._x,cone_poz[i]._y,cone_poz[i]._z); GLUquadricObj *obj = gluNewQuadric(); gluQuadricDrawStyle(obj,GLU_FILL); gluQuadricNormals(obj,GLU_SMOOTH); gluQuadricOrientation(obj,GLU_OUTSIDE); gluCylinder(obj,5.0, 5.0, 10.0, 20.0, 20.0); glPopMatrix(); gluDeleteQuadric(obj); } float df = 100.0; for (int i = 0; i < NR_CUBES; i += 1) { glPushMatrix(); glTranslated(cube_pos[i]._x,cube_pos[i]._y,cube_pos[i]._z); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glDrawCube(); glPopMatrix(); } glEnable(GL_TEXTURE_2D); //glMaterialfv(GL_FRONT,GL_SPECULAR,spec); //glMaterialfv(GL_FRONT,GL_SHININESS,&df); //render walls(planes) with texture glBindTexture(GL_TEXTURE_2D, texture[1]); glColor3f(1, 1, 1); glBegin(GL_QUADS); glTexCoord2f(1.0f, 0.0f); glVertex3f(520,520,520); glTexCoord2f(1.0f, 1.0f); glVertex3f(520,-520,520); glTexCoord2f(0.0f, 1.0f); glVertex3f(-520,-520,520); glTexCoord2f(0.0f, 0.0f); glVertex3f(-520,520,520); glTexCoord2f(1.0f, 0.0f); glVertex3f(-520,520,-520); glTexCoord2f(1.0f, 1.0f); glVertex3f(-520,-520,-520); glTexCoord2f(0.0f, 1.0f); glVertex3f(520,-520,-520); glTexCoord2f(0.0f, 0.0f); glVertex3f(520,520,-520); glTexCoord2f(1.0f, 0.0f); glVertex3f(520,520,-520); glTexCoord2f(1.0f, 1.0f); glVertex3f(520,-520,-520); glTexCoord2f(0.0f, 1.0f); glVertex3f(520,-520,520); glTexCoord2f(0.0f, 0.0f); glVertex3f(520,520,520); glTexCoord2f(1.0f, 0.0f); glVertex3f(-520,520,520); glTexCoord2f(1.0f, 1.0f); glVertex3f(-520,-520,520); glTexCoord2f(0.0f, 1.0f); glVertex3f(-520,-520,-520); glTexCoord2f(0.0f, 0.0f); glVertex3f(-520,520,-520); glEnd(); //render floor (plane) with colours glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS); glTexCoord2f(1.0f, 0.0f); glVertex3f(-520,-520,520); glTexCoord2f(1.0f, 1.0f); glVertex3f(520,-520,520); glTexCoord2f(0.0f, 1.0f); glVertex3f(520,-520,-520); glTexCoord2f(0.0f, 0.0f); glVertex3f(-520,-520,-520); glEnd(); glDisable(GL_TEXTURE_2D); glRasterPos2i(10, 10); printstring(GLUT_BITMAP_HELVETICA_18, frbuf); glRasterPos2i(10, 10); FRAMES++; { GLint t = glutGet(GLUT_ELAPSED_TIME); if (t - TO >= 2000) { GLfloat seconds = (t - TO) / 1000.0; GLfloat fps = FRAMES / seconds; sprintf(frbuf, "Frame rate: %f", fps); TO = t; FRAMES = 0; } } return TRUE; // Keep Going }