Процедура побудови полігональної сітки тора.


R0–малий радіус тора,

R– великий радіус (відстань від осі до центру малого),

n1, n2– кількість перерізів в двох напрямах (густина сітки),

k1, k2– кількість повторів текстури в двох напрямах.

procedure DrawTor(r0,R:GLfloat;

n1,n2:Glint;k1,k2:GLfloat);

var i,j,k:GLint;

fi,teta,delta_fi,delta_teta,ds,dt,

cos_fi, sin_fi, r1,c,s,t:GLfloat;

begin delta_fi:=2*pi/n1;delta_teta:=2*pi/n2;

teta:=0; ds:=k1/n1;dt:=k2/n2;

glCullFace (GL_BACK); glEnable (GL_CULL_FACE);

for i:=0 to n2-1 do begin fi:=Pi;

glBegin (GL_QUAD_STRIP);

for j:=0 to n1 do begin

for k:=1 downto 0 do

begin glTexCoord2d(ds*j,dt*(i+k));

t:=teta+k*delta_teta; c:=cos(t); s:=sin(t);

cos_fi:=cos(fi); sin_fi:=sin(fi); R1:= R+r0*c;

glNormal3f(c*cos_fi, c*sin_fi,s);

glVertex3f(R1*cos_fi, R1*sin_fi, r0*s);

end; fi:=fi+delta_fi

end; glEnd; teta:=teta+delta_teta end end;

Моделювання освітленості. Для криволінійних фігур нормаль задається в кожній вершині полігональної сітки. Для тора напрям нормалі в кожній вершині співпадає з радіус-вектором малого кола, проведеним в дану вершину.

Положення джерела світла в просторі задається масивом-константою pos і встановлюється командоюglLightfv(додаються до процедури Draw3D):

pos:array[0..3]of GLfloat=(1.0,1.0,1.0,0.0);

glLightfv(GL_LIGHT0,GL_POSITION,@pos).

Рис.10.2. Дифузне (розсіяне) Рис.10.3. Додавання

освітлення суцільної віддзеркалення (бліків)

моделі тора. і власного світіння.

 

За методом Гуро обчислюється дифузна складова освітленості (рис.10.2). Для кожної вершини з врахуванням нормалі, а також кольору і властивостей матеріалу та кольору і властивостей джерела світла обчислюється інтенсивність складових кольору. Потім колір інтерполюється лінійно від вершини до вершини по ребрах полігональної сітки, потім у внутрішніх точках граней (білінійна інтерполяція).

Колір спільної фонової та дифузної складової та колір бліків (дзеркальної складової) для кожного матеріалу задається в розділі констант , наприклад,

amb_dif:Array[0..3]of GLfloat=(0.8,0.2,1.0,1.0), spec : Array[0..3] of GLfloat=(1.0,1.0,1.0,1.0).

Колір спільної фонової та дифузної складової, коефіцієнт Фонга і колір бліків для матеріалу лицьових граней встановлююється командами

glMaterialfv(GL_FRONT,

GL_AMBIENT_AND_DIFFUSE,@amb_dif),

glMaterialf(GL_FRONT, GL_SHININESS, 50.0).

glMaterialfv(GL_FRONT,GL_SPECULAR,@spec),

Для відтворення бліків також потрібно задати колір дзеркальної складової джерела світла командою

glLightfv(GL_LIGHT0, GL_SPECULAR, @C_White).

Кольори і оптичні властивості матеріалів можуть призначатись по-різному для лицьових (GL_FRONT) та нелицьових (GL_BACK)граней. Керувати виведенням лицьових та нелицьових граней можна командою вилучення граней glCullFace(mode) з параметром mode рівним GL_BACKабоGL_FRONT,ввімкнувши режим вилучення граней командою glEnable(GL_CULL_FACE).

n1=3 n1=4 n1=5 n1=6

n2=2 n2=3 n2=4 n2=5

Рис.10.4. Вироджений тор при малих значеннях n1 та n2

Накладання текстури. Текстурні координати обчислюються у наведеній вище процедурі з врахуванням кількості повторів зображення текстури в радіальному і тангенціальному напрямі (параметри k1 і k2, рис.10.5).

Рис.10.5. Шахівниця на торі з різними значеннями k1 і k2.


Накладання освітленості на текстуру (змішування з кольором матеріалу,рис.10.6).В процедурах LoadBmpTextureі CalculateTexture з третього розділу параметр текстури GL_TEXTURE_ENV_MODEзмінюється зGL_DECAL на GL_MODULATE:

glTexEnvi(GL_TEXTURE_ENV,

GL_TEXTURE_ENV_MODE,GL_MODULATE).

Рис.10.6. Змішування текстури з кольором матеріалу

(додавання освітленості).

Приклад 10.2. Додавання бліків. Під час змішування текстури з кольором матеріалу дзеркальна складова (яка викликає бліки) стає малопомітною. Тому для більш помітного ефекту блікування спочатку будується зображення з дифузною складовою і накладеною текстурою, потім додається зображення з дзеркальною складовою (рис10.7).

Рис.10.7. Додавання бліків (дзеркальної складової освітленості).

Накладання дзеркальної складової освітленості на текстуровану поверхню.

// вмикаємо накладання текстури

glEnable(GL_TEXTURE_2D);

// вмикаємо розсіяну складову джерела світла

glLightfv(GL_LIGHT0, GL_DIFFUSE, @C_White);

// вимикаємо дзеркальну складову джерела світла

glLightfv(GL_LIGHT0, GL_SPECULAR, @C_Black);









Последнее изменение этой страницы: 2016-04-08; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь