gluQuadricTexture(QuadrObj, GL_TRUE);
//--Задание параметров текстуры---------------------------------------//
//--Повтор изображения по параметрическим осям s и t------------------//
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
//--Не использовать интерполяцию при выборе точки на текстуре---------//
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
//--Совмещать текстуру и материал объекта-----------------------------//
glTexEnvi (GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
}
void Init(void) {
InitVertexTetr();
InitNormsTetr();
MakeTetrList();
//--Определение свойств материала-------------------------------------//
glMaterialfv (GL_FRONT_AND_BACK,GL_AMBIENT,mat_amb);
glMaterialfv (GL_FRONT_AND_BACK,GL_SPECULAR,mat_spec);
glMaterialf(GL_FRONT,GL_SHININESS,shininess);
//--Определение свойств освещения-------------------------------------//
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_col);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
//--Проводить удаление невидимых линий и поверхностей-----------------//
glEnable(GL_DEPTH_TEST);
//--Проводить нормирование нормалей-----------------------------------//
glEnable(GL_NORMALIZE);
//--Материалы объектов отличаются только цветом диффузного отражения--//
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE);
//--Создания указателя на quadric-объект для построения колец---------//
QuadrObj=gluNewQuadric();
//--Определение свойств текстуры--------------------------------------//
TextureInit();
//--Задание перспективной проекции------------------------------------//
glMatrixMode(GL_PROJECTION);
gluPerspective(89.0,1.0,0.5,100.0);
//--Далее будет проводиться только преобразование объектов сцены------//
glMatrixMode(GL_MODELVIEW);
}
void DrawFigures(void) {
//--Включение режима нанесения текстуры-------------------------------//
glEnable(GL_TEXTURE_2D);
//--Задаем цвет диффузного отражения для колец------------------------//
glColor3fv(mat_diff1);
//--Чтобы не проводить перемножение с предыдущей матрицей загружаем единичную матрицу//
glLoadIdentity();
//--Определяем точку наблюдения---------------------------------------//
gluLookAt(0.0, 0.0, 2.5,0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
//--Сохраняем видовую матрицу, так как дальше будет проводиться поворот колец//
glPushMatrix();
//--Производим несколько поворотов на новый угол (это быстрее,--------//
//--чем умножать предыдущую видовую матрицу на матрицу поворота с-----//
//--фиксированным углом поворота)-------------------------------------//
glRotatef (-CurAng,1,1,0);
glRotatef (CurAng,1,0,0);
//--Для рисования колец каждое из них надо преобразовать отдельно,----//
//--поэтому сначала сохраняем видовую матрицу, затем восстанавливаем--//
glPushMatrix();
glTranslatef (0,0,-RingHeight/2);
DrawRing();
glPopMatrix();
glPushMatrix();
glTranslatef (0,RingHeight/2,0);
glRotatef (90,1,0,0);
DrawRing();
glPopMatrix();
glPushMatrix();
glTranslatef (-RingHeight/2,0,0);
glRotatef (90,0,1,0);
DrawRing();
glPopMatrix();
//--Восстанавливаем матрицу для поворотов тетраэдра--------------------//
glPopMatrix();
//--Выключаем режим наложения текстуры--------------------------------//
glDisable(GL_TEXTURE_2D);
//--Проводим повороты-------------------------------------------------//
glRotatef(CurAng,1,0,0);
glRotatef(CurAng/2,1,0,1);
//--Чтобы тетраэдр вращался вокруг центра, его надо сдвинуть вниз по оси oz//
glTranslatef(0,-0.33,0);
//--Задаем цвет диффузного отражения для тетраэдра--------------------//
glColor3fv(mat_diff2);
//--Проводим построение тетраэдра-------------------------------------//
glCallList(TETR_LIST);
}
void Display(void) {
//--Инициализация (очистка) текущего буфера кадра и глубины-----------//
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//--Построение объектов-----------------------------------------------//
DrawFigures();
//--Перестановка буферов кадра----------------------------------------//
glutSwapBuffers();
}
void Redraw(void) {
//--Увеличение текущего угла поворота---------------------------------//
CurAng+=1;
//--Сигнал для вызова процедуры создания изображения (для обновления)-//
glutPostRedisplay();
}
int main(int argc, char **argv) {
//--Инициализация функций библиотеки GLUT-----------------------------//
glutInit(&argc, argv);
//--Задание режима с двойной буферизацией, представление цвета в формате RGB,--//
//--использование буфера глубины --//
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Читать дальше