glPopMatrixO:
glPushMatrixO:
glTranslatedCO. 1.0 ,0): // torus at (0.1.0) // тор в точке (0.1.0)
glRotated(90.0. 1.0. 0):
glutWireTorus(0.1. 0.3. 10.10):
glPopMatrixO:
glPushMatrixO:
glTranslatedd.O. 0 .0): // dodecahedron at (1.0.0) // додекаэдр в точке (1.0.0)
glScaled(0.15. 0.15. 0.15):
glutW1reDodecahedron():
glPopMatrixO:
glPushMatrixO:
glTranslated(0. 1.0 .1.0): // small cube at (0.1.1) // малый куб в точке (0.1.1)
glutW1reCube(0.25):
glPopMatrixO:
glPushMatrixO;
glTranslated(0. 0. 1.0): // cylinder at (0.0.1) // цилиндр в точке (0.0,1)
GLUquadricObj * qobj:
qobj - gluNewQuadricO;
gluQuadri cDrawSty1e(qobj.GLU_LINE):
gluCylinder(qobj. 0.2. 0.2. 0.4. 8.8):
продолжение^
Преобразования объектов
Листинг 5.5 (продолжение)
glPopMatrixO : glFlushO:
}
//««««««««« main »»»»»»»»»» void maintint arge, char **argv)
{
glutlnitC&argc. argv):
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB ); glutInitWindowSize(640.480): glutlnitWindowPositiondOO. 100);
glutCreateWindowC'Transformation testbed - wire frames"); // "Испытательный стенд для преобразований // каркасных моделей"
glutDi splayFunc(di splayWi re);
glClearColord.Of. l.Of. l.Of, O.Of): // background is white // фон белый
glViewporttO, 0. 640. 480):
glutMainLoopO :
}
В листинге 5.5 приведена полная программа для выполнения этого рисунка. Подпрограмма mainO инициализирует экранное окно размером 640 на 480 пикселов, устанавливает порт просмотра и цвет фона, а также указывает функцию displayWireO в качестве отображающей функции, вызываемой для выполнения рисунка, В displayWireO вначале устанавливаются форма и положение камеры. Затем каждый из объектов рисуется поочередно. Для большинства объектов требуется их собственная матрица моделирования, чтобы повернуть и позиционировать их должным образом. Перед установкой каждого преобразования моделирования для запоминания текущего преобразования используется функция glPushMatrixO. После того как объект нарисован, текущее преобразование восстанавливается посредством вызова функции glPopMatrixO. Поэтому код для рисования каждого объекта заключен внутри «скобок», образуемых парой функций glPushMatrixO и glPopMatrixO, Внимательно проверяйте, чтобы каждое преобразование помещало свой объект в нужное место.