Квадратични обекти
Помощната библиотека GLU предоставя функции с които ще можете да създадете някои по-сложни фигури като цилиндър, сфера, диск. Това са т.н. квадратични обекти. Също така може да определите нивото на детайлност на всяка от фигурите като зададете предварително броя на разделенията на обекта около оста z и по продължението на оста z.

За да построите квадратичен обект първо трябва да създадете указател от тип GLUquadricObj, а след това да извикате функцията:

GLUquadricObj* gluNewQuadric( void ) - тя връща указател към създадения квадратичен обект или нула ако не е налична достатъчно оперативна памет. Например:

GLUquadricObj* object;
object=gluNewQuadric( );


След това е нужно да определите режим на рендериране на обекта с функцията:

void gluQuadricDrawStyle( GLUquadricObj *quadObj, GLenum drawStyle ) - първия аргумент трябва да е указателя сочещ създадение от вас квадратичен обкет ( в случая това е object ), а в втория аргумент може да бъде един от тези:

GLU_FILL - обектът се изобразява с множество многоъгълници
GLU_POINT - обектът се изобразява с множество точки ( върховете на фигурата )
GLU_LINE - обектът се изобразява с множество отсечки
GLU_SILHOUETTE - обектът се изобразява като силует ( подобно на режим с GLU_LINE )

Ако не определите режим на рендериране, обектите се изобразяват, по подразбиране, с множество многоъгълници.

Следващото нещо което трябва да направим е да изобразим квадратичния обект, което се осъществява с една от следващите функциите, от които зависи и каква фигура искате да бъде визуализирана:


void gluSphere( GLUquadricObj *quadObj, GLdouble radius, GLint slices, GLint stacks )

- изобразява се сфера. Функцията приема 4 аргумента. Първият трябва да е указателя към създадения вече квадратичен обект, вторият аргумент - радиуса на сферата, третият и четвъртият - съответно броя на разделенията на обекта около и по продължението на оста z.


void gluCylinder( GLUquadricObj * quadObj, GLdouble baseRadius, GLdouble topRadius, GLdouble height,
                            GLint slices, GLint stacks )


- изобразява се цилиндър. Функцията приема 6 аргументa. За първи аргумент подавате указател, асоцииран със свободен квадратичен обект, вторият аргумент - радиуса на основата, след това радиуса на горната основа и после височината на цилиндъра. Последните два аргумента са същите както по-горе.


void gluDisk( GLUquadricObj * quadObj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops )

- изобразява се диск. Първия аргумент е идентичен, вторият и третият са съответно вътрешния и външния радиус, а последните два аргумента са броя на разделенията около оста z и броя на концентричните кръгове около центъра на диска.


void gluPartialDisk( GLUquadricObj * quadObj, GLdouble innerRadius, GLdouble outerRadius, GLint slices,
                                GLint loops, GLdouble startAngle, GLdouble sweepAngle )


- изобразява се частичен диск. Финкцията приема цели 7 аргумента. Първите пет аргумента, които трябва да се подадат са ви вече познати от предишните функции и единствено последните два са нови - startAngle и sweepAngle обозначават съответно началния ъгъл на изрисуване и дължината на дъгата.


Ако използвате динамична светлина ще се наложи да определите нормалите за всеки квадратичен обект. Това става с фунцкията :

void gluQuadricNormals( GLUquadricObj *quadObj, GLenum normals ) - първият аргумент представлява указателя към нашия квадратичен обект, а за втори аргумент може да се подаде един от тези :

GLU_NONE - не се генерират нормали
GLU_FLAT - генерира се по една нормала за всяка стена
GLU_SMOOTH - генерира се по една нормала за всеки връх, което е и най-качествения режим

Също така можете да определите накъде да сочат нормалите, което може да бъде много полезно ако самата светлина се намира вътре в обект. Това става с функцията :

void gluQuadricOrientation( GLUquadricObj *quadObj, GLenum orientation ) - първия аргумент ви е вече познат, а за втори може да подадете :

GLU_OUTSIDE - за външно насочени нормали
GLU_INSIDE - за вътрешно насочени нормали

Ако не определите посока на нормалите по подразбиране ще бъдат създадени външно насочени нормали.

Когато даден квадратичен обект не ви трябва повече и искате да освободите малко оперативна памет, можете да го унищожите с функцията:

gluDeleteQuadric( GLUquadricObj *quadObj ) - тя приема само един аргумент и това е указателя към квадратичния обект.

Това беше всичко за квадратичните обекти. Тук може да разгледате един интересен пример, използващ квадратични обекти. С Библиотеката GLU можете да създавате също реалистичен 3D релеф, но това ще бъде в някоя друга тема.

Автор: Иван Георгиев Иванов [ Nickname: tuschko ]
e-mail: tuschko@abv.bg


Този сайт е хостван от сървър на
Headoff Gaming Intranetwork