Реферати українською » Информатика, программирование » Модель тривимірної сцени і бібліотека OpenGL


Реферат Модель тривимірної сцени і бібліотека OpenGL

Міністерство освіти і науки Російської Федерації

>ФГАОУВПО «Уральський федеральний університет

їм. першого президента РосіїБ.Н.Ельцина»

>Теплоенергетический факультет

>КАФЕДРАПРИКЛАДНОЙМАТЕМАТИКИ

Курсова робота

з дисципліни «Комп'ютерна графіка»

Модель тривимірної сцени, і бібліотекаOpenGL

Студент: Котовський В.В.

Єкатеринбург,

2010


Формулювання завдання

Засобами графічної бібліотекиOpenGL побудувати динамічну тривимірну сцену, що включає задані тіло і поверхню видуz=f(x,y).Заданние графічні об'єкти мають бути представлені у таких видах:

· як каркасної моделі, що дозволяє бачити контури примітивів, у тому числі складено об'єкти;

· як реалістичних зображень, побудованих за урахуванням параметрів джерела освітлення і параметрів що відбивають властивостей матеріалу;

· як об'єктів із накладеної ними текстурою.

>Заданное тіло: вентилятор.

>Заданная поверхню: ,

де а, b – параметри.


Опис уявлення тіла

>Каркасние моделі і поверхні можуть бути з допомогою примітивівOpenGL, як-от:

>GL_LINES

>GL_LINE_STRIP

>GL_LINE_LOOP

>GL_TRIANGLES

>GL_TRIANGLE_STRIP

>GL_TRIANGLE_FAN

>GL_QUADS

>GL_QUAD_STRIP

>GL_POLYGON

>ПримитивиLINE можна використовувати лише створення, наприклад, сітки, оскільки нормальний до них не пропишеш і упереджене висвітлення ними нічого очікувати правильно відображатись.

>ПримитивиTRIANGLE іQUAD застосовні до створення, мабуть, всіх поверхонь і тіл – куб, піраміда, паралелепіпед, сфера, циліндр тощо. З використаннямTRIANGLE поверхні і є тіла виходять вірно згладженими при меншому розбивці, ніж ізQUAD.

ПримітивPOLYGON застосуємо щоб одержати кола.

У цьому роботі використовуються примітиви:GL_QUADS,GL_LINES,GL_POLYGON для побудова каркасної моделі тіла, а побудови поверхні використовуєтьсяGL_QUADS.


Складові частини моделі вентилятора

Сітка

Сітка вентилятора складена із трьох основних частин

- Кругова складова сітки

  

деbFan+17 – радіус окружності,rWeb – розбивка окружності

Фрагмент коду програми кругової складової сітки

>q=0;

>while(q<rWeb)

{

>glBegin(GL_LINES);

>glVertex3f(0,(bFan+17)*sin(q*2*M_PI/rWeb),(bFan+17)*cos(q*2*M_PI/rWeb));

>glVertex3f(0,(bFan+17)*sin((q+1)*2*M_PI/rWeb),(bFan+17)*cos((q+1)*2*M_PI/

>rWeb));

>glEnd();

>q++;

}

-Дуговая складова сітки

   

деbFan+2 – радіус півкола,rWeb – розбивка окружності

Фрагмент коду програми дугового складової сітки

>intiWeb=0;

>while(iWeb<rWeb)

{

>glBegin(GL_LINES);

>glVertex3f((bFan+2)*cos(iWeb*M_PI/rWeb),(bFan+2)*sin(iWeb*M_PI/rWeb)+15,0);

>glVertex3f((bFan+2)*cos((iWeb+1)*M_PI/rWeb),(bFan+2)*sin((iWeb+1)*M_PI/rWeb)+15,0);

 >glEnd();

 >iWeb++;

}


- Косий пруть сітки


  

де a, b – параметри відрізка

Фрагмент коду програми вуханя прута сітки

>glBegin(GL_LINES);

>glVertex3f(bFan+2,15,0);

>glVertex3f(bFan,rFan,0);

>glEnd();

1. Гвинт

Гвинт вентилятора складається з з трьох основних частин


- Лопасть вентилятора

   

деbFan – половина ширини лопаті під аркушами,lFan – довжина лопаті, N – розбивка лопаті

Фрагмент коду програми лопаті вентилятора

>doublebFan=5;

>doublelFan=15;

>glBindTexture(GL_TEXTURE_2D,texture4);

>floatN=30;

>floatNNN=100;

>inti=0;

>while(i<N)

{

>glBegin(GL_QUADS);

>glTexCoord2d(i/N,0);

>glNormal3f(-2*lFan*bFan*i/(N*N)*sin(i*M_PI/(1.5*N)),2*bFan*bFan/(N*log(NNN))*(log(i+26)*i*sin(i*M_PI/(1.5*N))-log(i+25)*(i+1)*sin((i+1)*M_PI/(1.5*N))),2*bFan*lFan*log(i+25)/(N*log(NNN)));

>glVertex3f(-bFan*log(i+25)/log(NNN),lFan*i/N,-bFan*(i)/N*sin(i*M_PI/(N*1.5)));

>glTexCoord2d(i/N,1);

>glNormal3f(-2*lFan*bFan*i/(N*N)*sin(i*M_PI/(1.5*N)),2*bFan*bFan/(N*log(NNN))*(log(i+26)*i*sin(i*M_PI/(1.5*N))-log(i+25)*(i+1)*sin((i+1)*M_PI/(1.5*N))),2*bFan*lFan*log(i+25)/(N*log(NNN)));

>glVertex3f(bFan*log(i+25)/log(NNN),lFan*i/N,bFan*(i)/N*sin(i*M_PI/(N*1.5)));

>glTexCoord2d((i+1.0)/N,1);

>glNormal3f(-2*lFan*bFan*i/(N*N)*sin(i*M_PI/(1.5*N)),2*bFan*bFan/(N*log(NNN))*(log(i+26)*i*sin(i*M_PI/(1.5*N))-log(i+25)*(i+1)*sin((i+1)*M_PI/(1.5*N))),2*bFan*lFan*log(i+25)/(N*log(NNN)));

>glVertex3f(bFan*log((i+26))/log(NNN),lFan*(i+1)/N,bFan*(i+1)/N*sin((i+1)*M_PI/(N*1.5)));

>glTexCoord2d((i+1.0)/N,0);

>glNormal3f(-2*lFan*bFan*i/(N*N)*sin(i*M_PI/(1.5*N)),2*bFan*bFan/(N*log(NNN))*(log(i+26)*i*sin(i*M_PI/(1.5*N))-log(i+25)*(i+1)*sin((i+1)*M_PI/(1.5*N))),2*bFan*lFan*log(i+25)/(N*log(NNN)));

>glVertex3f(-bFan*log((i+26))/log(NNN),lFan*(i+1)/N, *(>i+1)/N*sin((i+1)*M_PI/(N*1.5)));

>glEnd();

і++;

}

- Циліндр, який би лопаті вентилятора в гвинт

   

де M – розбивка циліндра

Фрагмент коду програми циліндра, що об'єднує лопаті вентилятора в гвинт

>M=30;

>intqRoll=0;

>glBindTexture(GL_TEXTURE_2D,texture2);

>while (>qRoll<M)

{

>glBegin(GL_QUADS);

>glTexCoord2d(0,qRoll/M);

>glNormal3f(0,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));

>glVertex3f(-1,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));

>glTexCoord2d(0,(qRoll+1.0)/M);

>glNormal3f(0,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));

>glVertex3f(-1,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));

>glTexCoord2d(1,(qRoll+1.0)/M);

>glNormal3f(0,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));

>glVertex3f(1,sin((2*M_PI*(qRoll+1))/M),cos((2*M_PI*(qRoll+1))/M));

>glTexCoord2d(1,qRoll/M);

>glNormal3f(0,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));

>glVertex3f(1,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));

>glEnd();

>qRoll++;

}


- Кришка на циліндр

   

де M – розбивка кола

Фрагмент коду програми циліндра, що об'єднує лопаті вентилятора в гвинт

>intM=30;

>intqFan=0;

>glBegin(GL_POLYGON);

>while (>qFan<M)

{

>glNormal3f(1,0,0);

>if(qFan<M/4)

{

>glTexCoord2d(0,1-qFan*4/M);

}

>if((qFan>=M/4)&&(qFan<M/2))

{

>glTexCoord2d((qFan-M/4)*4/M,0);

}

>if((qFan>=M/2)&&(qFan<3*M/4))

{

>glTexCoord2d(1,(qFan-M/2)*4/M);

}

>if(qFan>=3*M/4)

 {

>glTexCoord2d(1-(qFan-3*M/4)*4/M,1);

}

>glVertex3f(1,sin((2*M_PI*qFan)/M),cos((2*M_PI*qFan)/M));

>qFan++;

}

>glEnd();

2. Стойка

Стойка вентилятора складена із трьох основних частин

- Верхня частина корпусу (півсфера)

   

деrFan – найбільший радіус у фігурі,iM, M – розбивки півсфери

Фрагмент коду програми верхню частину корпусу (півсфери)

>M=30;

>intiM=30;

>doublephi,psi;

>q=0;

>inti=0;

>while (>q<M)

{

>while (>i<iM)

{

>glBindTexture(GL_TEXTURE_2D,texture2);

>glBegin(GL_QUADS);

>phi=(-(M_PI*(i))/iM);psi=((M_PI*(q))/M);

>glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

>glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);

>glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

>phi=(-(M_PI*(i+1))/iM);psi=((M_PI*(q))/M);

 

>glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

 >glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);

>glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

 >phi=(-(M_PI*(i+1))/iM);psi=((M_PI*(q+1))/M);

 

>glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

 >glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);

>glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

 >phi=(-(M_PI*(i))/iM);psi=((M_PI*(q+1))/M);

 

>glNormal3f(-3*rFan*sin(phi),rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

 >glTexCoord2d((sin(phi)+1)/2,(cos(psi)+1)/2);

>glVertex3d(*rFan*sin(phi)+bFan,rFan*cos(phi)*sin(psi),rFan*cos(phi)*cos(psi));

 >glEnd();

 і++;

}

>i=0;

>q++;

}


-Цилиндрический елемент стійки

Цей елемент стійки вентилятора складається з циліндрів і кіл (кришки для циліндрів). Усі вони викликаються з допомогою функціїOpenGL –glCallList. Більшість коду елементів вентилятора зчитується програмою лише один раз, вСallLists, а виклик відбувається неодноразово, за необхідності, до функційRenderGLScene(). Такий спосіб найефективніший як швидкості роботи програми, так редагування готового коду програми, завдяки чому однакові примітиви (циліндр, коло, квадрат, лінії т.д.) було легко використовувати викликомCallList і, застосовуючи елементарні перетворення – поворот, переміщення,масштабирование об'єктів, видозмінювати необхідним чином заради отримання даних елементів тіла.

Елементи циліндр і коло були описані вище, тому повторюватися.

-Ножка стійки

Цей елемент тіла будується через функціюCallList, у якій заданий квадрат, викликаний 4 рази, ймасштабированний з різних координатам по-різному.

Фрагмент коду програми ніжок стійки вентилятора

//---Квадрат

>square=basis_leg+1;

>glNewList(square,GL_COMPILE);

>glBindTexture(GL_TEXTURE_2D,texture1);

>glBegin(GL_QUADS);

 >glNormal3f(1,0,0);

 >glTexCoord2d(0,0);

 >glVertex3f(1,-1,-1);

 >glTexCoord2d(1,0);

 >glVertex3f(1,1,-1);

 >glTexCoord2d(1,1);

 >glVertex3f(1,1,1);

 >glTexCoord2d(0,1);

 >glVertex3f(1,-1,1);

 >glEnd();

>glEndList();

//---Ножка вентилятора

>leg=square+1;

>glNewList(leg,GL_COMPILE);

>glCallList(square);

>glRotatef(90,0,0,1);

 >glCallList(square);

 >glRotatef(90,0,0,1);

 >glCallList(square);

 >glRotatef(90,0,0,1);

 >glCallList(square);

>glEndList();


3.Пульт управління

>Пульт управління вентилятором складається з чотирьох основних частин

- Підстава пульта

   

Елемент будується з циліндра з розбивкою зменшеним до4х.

Фрагмент коду програми підстави пульта

>M=4;

>floatqLeg=0;

>glBindTexture(GL_TEXTURE_2D,texture5);

>while (>qLeg<M)

{

>glBegin(GL_QUADS);

 >glNormal3f(0,sin(M_PI/4+qLeg*M_PI/2),cos(M_PI/4+qLeg*M_PI/2));

 >glTexCoord2d(0,qLeg/M);

 >glVertex3f(-1,sin((2*M_PI*qLeg)/M),cos((2*M_PI*qLeg)/M));

 >glTexCoord2d(0,(qLeg+1.0)/M);

 >glVertex3f(-1,sin((2*M_PI*(qLeg+1))/M),cos((2*M_PI*(qLeg+1))/M));

>glTexCoord2d(1,(qLeg+1.0)/M);

 >glVertex3f(1,sin((2*M_PI*(qLeg+1))/M),cos((2*M_PI*(qLeg+1))/M));

>glTexCoord2d(1,qLeg/M);

 >glVertex3f(1,sin((2*M_PI*qLeg)/M),cos((2*M_PI*qLeg)/M));

 >glEnd();

 >qLeg=qLeg+1.0;

}

-Кришки для пульта

 Елемент складається з квадрата, фрагмент коду якого містився ще описі ніжки стійки вентилятора.

-Кнопки на пульті

 Елемент складається з циліндра і кола, примітивів описаних раніше.

Опис висвітлення постаті

Висвітлення тіла відбувається уOpenGL завдяки включенню функціїSetupLighting() з необхідними параметрами та умовами, і навіть з допомогою правильної розстановкинормалей до примітивам, з якого складається тіло. Щоб поставлені нормальний нормувалися автоматично необхідно включити функцію –glEnable(GL_NORMALIZE);

>Подробней зупинимося на перебуваннянормалей до окремих елементах тіла.

Усього нормальний було віднайдено й прописані в код програми для 6 примітивів, елементів тіла.

1. Лопасть

Для визначеннянормалей лопаті, бо вона репрезентує собою якусь поверхню, було використано аналітична формула перебування рівняння поверхні за трьома точкам і формула перебування нормальний до, що через приватні похідні рівняння поверхні.

 

- рівняння поверхні, D не вважаємо, оскільки він впливає вплинув на вибір нормальний.

Тоді координати для нормальний функціїglNormal3f(a1,a2,a3) ,буде вираховуватися за такими формулам:

З записи рівняння поверхні і є формулам, виписані для коефіцієнтів у цій формулі одержимо:


Провівши розрахунок за даними формулам, одержимо що:

Для однаково вірного відображення висвітлення лопаті вентилятора як із одного, і з іншого боку довелося звернутися до підключенню двостороннього висвітлення з допомогою функціїglLightModelf(GL_LIGHT_MODEL_TWO_SIDE,k), де до =1 для включення і до =0 йоговилючения.

2. Циліндр

Щоб співаку визначити нормаль для циліндра потрібно координату, що змінюється лінійно залишити нульової, а дві інші координати збігатимуться з відповідними координатами циліндра зважаючи на те, що у підставі циліндра лежить окружність.

У результаті одержимо координати нормальний:

(>0,sin((2*M_PI*qRoll)/M),cos((2*M_PI*qRoll)/M));

3. Коло

>Нормаль для кола окреслюється перпендикуляр до цієї поверхні.

4.Квадрат

>Нормаль для квадрата визначається аналогічно як й у кола.

5. Паралелепіпед

У паралелепіпеда нормаль визначається перпендикуляром до кожній грані і отже для всієї межі нормаль буде сама й спрямована назовні.

6.Полусфера

>Нормаль для півсфери визначається координатами самої постаті, тому просто переписані координати зglVertex3f вglNormal3f.

Графічне уявлення тіла висвітлити

Опис накладення текстури на тіло

Для накладення текстур на тіла, поверхні застосовується функціяSetupTextures(); У своїй роботі я використовував 4 виду текстури, різних розмірів.Текстура накладається на циліндр, паралелепіпед, лопата, квадрат. Спосіб накладення примітивно простий. По порядку розберемося із кожної з постатей.

- Циліндр.

А, щоб накласти текстуру постать потрібно було абстрактно розкрутити циліндр в рівну поверхню, прямокутник і зіставити координати отриманого прямокутника з координатами текстури, якпоказанно на малюнках.

>Текстура

 


- Паралелепіпед.

За аналогією з циліндром абстрактнораскучиваем паралелепіпед і накладемо текстуру.

- Лопасть.

На лопата текстура накладається також з особливостіпосторения. Оскільки лопата виходить шляхом видозміни прямокутника, тобто. будується з прямокутникомнакладивающихся сторонами друг на одного йповорачивающихся принаймні накладення на якийсь кут, то, на лопата текстура накладається за аналогією з прямокутником, як це було показано на циліндрі.

-Квадрат.

>Текстура на квадрат накладається одне одного з координатами.


Графічне уявлення тіла з текстурою

Опис уявлення поверхні

Поверхня будується перебором координат x і y не більше від -N до N і обчисленням кожної пари (>x,y) значенняz.

>Нормаль до у точці перебувають через чесні похідні функції x, y,z


Примітка: Бо за обході циклів по і і j вони обидва звертаються до нуль, то тут для уникнення вихід із області дійсних значень координат в висловлювання для вектора нормальний по x і з у вписані незначні для кінцевого результату добавки.

>Текстура на поверхню накладається які і розтягується за величиною поверхні. Накладення відбувається співвідношенням координат поверхні і є координат текстури отже кожномуQUAD, з яких будується поверхню, співвідноситься частина растрового зображення, розбиваючи його, свої чином, на сітку. Координати текстури для точки :

 

Графічне уявлення поверхні



Список використовуваної літератури

1. А.В.Боресков. ГрафікаТрехмернойКомпьютерной Ігри наОсновеOpenGL. М.: «>Диалог-МИФИ»,2004

2.Ю.М.Боянковский, А.В. Ігнатенка, А.І. Фролов. Графічна бібліотекаOpenGL.уч.-мет.пособие.Москва,2003

3.NeHeTutorials


Схожі реферати:

Навігація