Изобразите радугу состоящую из полигонов, которая освещается прожектором. Направление света прожектора постоянно меняется и скользит вдоль радуги
Решение :
#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 flag=1;
void CALLBACK resize (int width, int height) {
glViewport (0,0,width, height); glMatrixMode (GL_PROJECTION); glLoadIdentity(); //glOrtho(-20,20,-15,15, -10,25); glOrtho(-6,6,-6,6, -20,20); gluLookAt(1,-1,1, 0,0,0, 0,0,1); //gluLookAt(0,-5,0, 0,0,0, 0,0,1); glMatrixMode(GL_MODELVIEW);
}
void CALLBACK Draw (void) { static double time=0;
GLUquadricObj *quadObj; quadObj = gluNewQuadric();
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
float x=time/100-2.2; float z=pow((pow(2.4,2)-pow(x,2)),0.5);
if (x>2.2 && flag==1) { flag=2; }
if (x<-2.2 && flag==2) { flag=1; }
if (flag==2) { time--; } else { time++; }
float dir[3]={x,0.1,z}; float pos[4]={0,-1,0,1};
// включение нулевой лампы GLfloat light_diffuse[]={3.0,3.0,3.0,1.0}; glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, pos); glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir); glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 90); glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 9); glEnable(GL_LIGHTING); glEnable (GL_LIGHT0); glEnable (GL_DEPTH_TEST);
glPopMatrix();
glPushMatrix();
glRotated(90,1,0,0); gluQuadricDrawStyle(quadObj, GLU_FILL); // К glColor3ub(255, 0, 0); gluPartialDisk(quadObj, 2, 2.2, 30, 30, -90, 180); // О glColor3ub(255, 125, 0); gluPartialDisk(quadObj, 2.2, 2.4, 30, 30, -90, 180); // Ж glColor3ub(255, 255, 0); 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); }
Результат: Напишите программу вывода цилиндра, на котором наложена текстура. Создайте эффект сползания текстуры с цилиндра. Вокруг цилиндра вращается несколько полупрозрачных небольших сфер по спирали
Решение
#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); }
Результат:
Популярное: Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (206)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |