
Язык программирования:
C/C++
Среда программирования:
Visual Studio 2015
#include <glut.h> #include <math.h> #define GL_PI 3.1415 GLfloat OX = 200; GLfloat OY = 200; GLfloat OZ = 200; GLfloat xRot = 50.0f; GLfloat yRot = 20.0f; GLfloat x, y, z, angel; GLfloat sizes[2];//размер точек GLfloat step;//запоминаем поддерживаемый инкремент точек GLfloat curSize;//размер текущ точки void Draw() { glClear(GL_COLOR_BUFFER_BIT);//очищаем окно исп тек цвет очистки glBegin(GL_LINE); glNormal3f(0.0, 1.0, 0.0);//нормаль для освещения не будет стоять на месте, //она будет поворачиваться вместе с спиралькой под таким же углом //можно зафиксировать с помощью glPushMatrix() и glPopMatrix() glEnd(); glPushMatrix();//запоминаем матрицу glRotatef(xRot, 0.0f, 1.0f, 0.0f); glRotatef(yRot, 0.0f, 1.0f, 1.0f); glGetFloatv(GL_POINT_SIZE_RANGE, sizes);//минимальный поддерживаемый размер точки будет возвращен в Sizes [0], а максимальный поддерживаемый размер будет записан в Sizes [ 1 ] glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);//найти наименьший поддерживаемый инкремент между размерами пикселей //задаем исходный размер точек curSize = sizes[0]; z = -100.0f; for (angel = 0.0f; angel <= (2.0f*GL_PI)*3.0f; angel += 0.1f) { x = 100.0f*sin(angel); y = 100.0f*cos(angel); glPointSize(curSize); glBegin(GL_POINTS); glColor3ub(255, 128, 0);//золотой glVertex3f(x, y, z);//точки спиральки glEnd(); z += 1.0f; curSize += step; } glEnd(); glPopMatrix();//сброс матрицы glutSwapBuffers();//очищаем очередь текущих команд и переключаем буферы } void Timer(int) { xRot++; glutPostRedisplay();//можно заменить на функцию Draw() glutTimerFunc(20, Timer, 1); } void Timer2(int) { yRot++; glutPostRedisplay(); glutTimerFunc(10, Timer2, 1); } void Init() { glClearColor(0.0, 0.0, 0.0, 1.0); glMatrixMode(GL_PROJECTION);//тип матрицы - проекции glLoadIdentity();//сброс матриц glOrtho(-OX, OX, -OY, OY, -OZ, OZ);//сетка 3Д с началом координат в центре glMatrixMode(GL_MODELVIEW); } float ambient[] = {0.3, 0.3, 0.3, 1.0}; float diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; float black[] = {0.0, 0.0, 0.0, 1.0}; float lpos[] = {OX, 0, 0, 1.0}; int main(int argc, char** argv)//кол-во аргументов в командной строке,их описание в виде указателя на строку { //инициализация glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(2*OX, 2*OY); glutInitWindowPosition(500, 200); //glShadeModel(GL_SMOOTH);//режим сглаживания цветов по умолчанию FLAT-не гладко а поп последнему glutCreateWindow("3D scene"); //Регистрация glutDisplayFunc(Draw); glutTimerFunc(20, Timer, 1); glutTimerFunc(10, Timer2, 1); glEnable(GL_POINT_SMOOTH);//режим сглаживание точек из квадратных в круглые glEnable(GL_LIGHTING);//освещение glLightModelfv(GL_LIGHT_MODEL_AMBIENT, black);//убираем рассеянный свет glEnable(GL_LIGHT0);//один источник света glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);//тусклый рассеянный свет glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);//диффузный белый glLightfv(GL_LIGHT0, GL_POSITION, lpos);//расположен в точке lpos glEnable(GL_COLOR_MATERIAL);//освещаем окрашенный предмет без текстур glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);//спереди и сзади, ведь предмет анимированый, потом указываем, что свет и диффузный и рассеянный Init(); glutMainLoop();/* Запуск механизма обработки событий */ return 0; }
Прикрепленный файл | Размер |
---|---|
hahulina_demo_spiralka.zip | 13.31 кб |