gluPartialDisk(quadObj, 2.4, 2.6, 30, 30, -90, 180);
// З
glColor3ub(0, 255, 0);
gluPartialDisk(quadObj, 2.6, 2.8, 30, 30, -90, 180);
// Г
glColor3ub(0, 255, 255);
gluPartialDisk(quadObj, 2.8, 3, 30, 30, -90, 180);
// С
glColor3ub(0, 0, 255);
gluPartialDisk(quadObj, 3, 3.2, 30, 30, -90, 180);
// Ф
glColor3ub(255, 0, 255);
gluPartialDisk(quadObj, 3.2, 3.4, 30, 30, -90, 180);
glPopMatrix();
glDisable(GL_LIGHTING);
auxSwapBuffers();
}
void main ()
{
auxInitPosition (100,100,800,800);
auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow ("v11_06");
glTranslated(3,-3,2);
glEnable (GL_COLOR_MATERIAL); // установкасвойствматериала
auxIdleFunc (Draw);
auxReshapeFunc (resize);
auxMainLoop(Draw);
}
Результат:
7. Напишите программу вывода цилиндра, на котором наложена текстура. Создайте эффект сползания текстуры с цилиндра. Вокруг цилиндра вращается несколько полупрозрачных небольших сфер по спирали
Решение
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glaux.h>
#include<time.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <math.h>
int flag0=1;
int flag1=1;
int flag2=1;
int flag3=1;
unsigned int image1_ID;
AUX_RGBImageRec* image1;
void CALLBACK resize (int width, int height)
{
glViewport (0,0,width, height);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(-6,6,-6,6, -20,20);
gluLookAt(1,-1,1, 0,0,0, 0,0,1);
glMatrixMode(GL_MODELVIEW);
}
void CALLBACK Draw (void)
{
static double time0=0;
static double time1=0;
static double time2=0;
static double time3=0;
GLUquadricObj *quadObj;
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,1,1);
float pos[4]={3,-3,5,1};
glLightfv(GL_LIGHT0, GL_POSITION, pos);
glEnable(GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
quadObj = gluNewQuadric();
float s=0.9-(time0/800);
if (s<0.01 && flag0==1)
{flag0=2;}
if (s>0.9 && flag0==2)
{flag0=1;}
if (flag0==1)
{time0++;}
else
{time0--;}
const float p[4]={0,0,s,0};
glPushMatrix();
glEnable(GL_TEXTURE_2D);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGenfv(GL_T,GL_OBJECT_PLANE,p);
glRotated(-180,1,0,0);
glTranslated(0,0,-3);
glColor3d(1,1,0);
gluCylinder(quadObj, 1, 1, 3, 50, 50);
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPushMatrix();
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
double z1=time1/300;
glRotated(time1,0,0,1);
glTranslated(1.3,0,1);
glTranslated(0,0,z1);
if (z1>2 && flag1==1)
{flag1=2;}
if (z1<-1 && flag1==2)
{flag1=1;}
glColor4d(0,1,0, 0.1);
auxSolidSphere(0.2); //s1
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
if (flag1==1)
{time1++;}
else
{time1--;}
glPopMatrix();
glPushMatrix();
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
double z2=time2/600;
glRotated(time2*2,0,0,15);
glTranslated(1.8,0,1);
glTranslated(0,0,z2);
if (z2>2 && flag2==1)
{flag2=2;}
if (z2<-1 && flag2==2)
{flag2=1;}
glColor4d(1,0,0, 0.1);
auxSolidSphere(0.2); //s2
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
if (flag2==1)
{time2++;}
else
{time2--;}
glPopMatrix();
glPushMatrix();
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
double z3=time3/400;
glRotated(time3*3,0,0,1);
glTranslated(2.3,0,1);
glTranslated(0,0,z3);
if (z3>2 && flag3==1)
{flag3=2;}
if (z3<-1 && flag3==2)
{flag3=1;}
glColor4d(0,0,1, 0.2);
auxSolidSphere(0.2); //s3
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
if (flag3==1)
{time3++;}
else
{time3--;}
glPopMatrix();
gluDeleteQuadric(quadObj);
auxSwapBuffers();
}
void main ()
{
auxInitPosition (100,100,800,800);
auxInitDisplayMode (AUX_RGB | AUX_DEPTH | AUX_DOUBLE);
auxInitWindow ("v11_07");
glTranslated(0,0,-1);
glEnable (GL_COLOR_MATERIAL); // установкасвойствматериала
image1 = auxDIBImageLoad("v11_07.bmp");
glGenTextures(1, &image1_ID);
glBindTexture(GL_TEXTURE_2D, image1_ID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3,
image1->sizeX,
image1->sizeY,
0, GL_RGB, GL_UNSIGNED_BYTE,
image1->data);
auxIdleFunc (Draw);
auxReshapeFunc (resize);
auxMainLoop(Draw);
}
Результат: