Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<math.h>
- #include <cmath>
- #include<time.h>
- #include<stdlib.h>
- #include <windows.h>
- #include<D:/GraphicProject/soil-master/include/SOIL/SOIL.h>
- #include <glut.h> //Подключение библиотеки glut.h
- // угол поворота камеры
- float angle = 0.0;
- float rx = 1.0, ry = 1.0, rz = 1.0;
- // координаты вектора направления движения камеры
- float lx = 0.0f, lz = -1.0f;
- // XZ позиция камеры
- float x = 3.0f, z = 3.0f, dx = 0.01f, dz = 0.01f;
- //Ключи статуса камеры. Переменные инициализируются нулевыми значениями
- //когда клавиши не нажаты
- float deltaAngle = 0.0f;
- float deltaMove = 0;
- int counter = 0;
- GLuint texture;
- GLfloat treecolor[] = { 0.9, 0.6, 0.3, 0.8 };
- float pos0[] = { 0.0, 20.0, 1.0, 1.0 };
- float pos1[] = { 20.0, 10.0, 30.0, 1.0 };
- float direction[] = { 0.0, 0.0, -20.0 };
- float diffuseColor1[] = { 1.0, 1.0, 1.0, 1.0 };
- float ambientColor0[] = { 0.3, 0.3, 0.3, 1.0 };
- float diffuseColor0[] = { 1.0, 1.0, 1.0, 1.0 };
- // phisic
- int V = 1;
- int angleS = 30;
- float g = 9.8;
- float t = (2 * V * sin(angleS)) / g;
- float newY = 1.0;
- float newZ = 2.0;
- float tm = 0;
- bool checher = false;
- float newX = 0;
- void changeSize(int w, int h) {
- // предотвращение деления на ноль
- if (h == 0)
- h = 1;
- float ratio = w * 1.0 / h;
- // используем матрицу проекции
- glMatrixMode(GL_PROJECTION);
- // обнуляем матрицу
- glLoadIdentity();
- // установить параметры вьюпорта
- glViewport(0, 0, w, h);
- // установить корректную перспективу
- gluPerspective(45.0f, ratio, 0.1f, 100.0f);
- // вернуться к матрице проекции
- glMatrixMode(GL_MODELVIEW);
- }
- void drawSnowMan() {
- glColor3f(1.0 * rx, 1.0f * ry, 1.0 * rz);
- // тело снеговика
- glTranslatef(0.0f, 0.5f, 0.0f);
- glutSolidSphere(0.75f, 30, 30);
- // 2 тело снеговика
- glTranslatef(0.0f, 1.0f, 0.0f);
- glutSolidSphere(0.55f, 30, 30);
- // ruka снеговика
- glTranslatef(0.5f, 0.1f, 0.0f);
- glutSolidSphere(0.25f, 30, 30);
- // ruka снеговика
- glTranslatef(-1.0f, 0.0f, 0.0f);
- glutSolidSphere(0.25f, 30, 30);
- // голова снеговика
- glTranslatef(0.5f, 0.68f, 0.0f);
- glutSolidSphere(0.25f, 30, 30);
- // глаза снеговика
- glPushMatrix();
- glColor3f(0.0f, 0.0f, 0.0f);
- glTranslatef(0.05f, 0.10f, 0.18f);
- glutSolidSphere(0.05f, 10, 10);
- glTranslatef(-0.1f, 0.0f, 0.0f);
- glutSolidSphere(0.05f, 30, 30);
- glPopMatrix();
- // нос снеговика
- glColor3f(1.0f, 0.5f, 0.5f);
- glRotatef(0.0f, 1.0f, 0.0f, 0.0f);
- glutSolidCone(0.08f, 0.5f, 10, 2);
- }
- void drawSnowMan2() {
- glColor3f(1.0f, 0.0f, 0.0f);
- // тело снеговика
- glTranslatef(0.0f, 0.5f, 0.0f);
- glutSolidSphere(0.75f, 30, 30);
- // 2 тело снеговика
- glTranslatef(0.0f, 1.0f, 0.0f);
- glutSolidSphere(0.55f, 30, 30);
- // ruka снеговика
- glTranslatef(0.5f, 0.1f, 0.0f);
- glutSolidSphere(0.25f, 30, 30);
- // ruka снеговика
- glTranslatef(-1.0f, 0.0f, 0.0f);
- glutSolidSphere(0.25f, 30, 30);
- // голова снеговика
- glTranslatef(0.5f, 0.68f, 0.0f);
- glutSolidSphere(0.25f, 30, 30);
- // глаза снеговика
- glPushMatrix();
- glColor3f(1.0f, 0.0f, 0.0f);
- glTranslatef(0.05f, 0.10f, 0.18f);
- glutSolidSphere(0.05f, 10, 10);
- glTranslatef(-0.1f, 0.0f, 0.0f);
- glutSolidSphere(0.05f, 30, 30);
- glPopMatrix();
- // нос снеговика
- glColor3f(1.0f, 0.0f, 0.0f);
- glRotatef(0.0f, 1.0f, 0.0f, 0.0f);
- glutSolidCone(0.08f, 0.5f, 10, 2);
- }
- void computePos(float deltaMove)
- {
- x += deltaMove * lx * 0.1f;
- z += deltaMove * lz * 0.1f;
- }
- void computeDir(float deltaAngle)
- {
- angle += deltaAngle;
- lx = sin(angle);
- lz = -cos(angle);
- }
- //void texture1()
- //{
- //glGenTextures(1, &texture);
- //glBindTexture(GL_TEXTURE_2D, texture);
- //int width, height;
- //unsigned char* tex_2d = SOIL_load_image("Sun_Texture.jpg", &width, &height, 0, SOIL_LOAD_RGB); // загрузка текстуры
- //glTexImage2D(GL_TEXTURE_2D, 0.0, GL_RGB, width, height, 0.0, GL_RGB, GL_UNSIGNED_BYTE, tex_2d);
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- //SOIL_free_image_data(tex_2d);
- //glBindTexture(GL_TEXTURE_2D, 0);
- //}
- void present() {
- glTranslatef(15.0, 2.0, 17.0);
- glColor3f(1.0 * rx, 1.0 * ry, 0.0 + rz);
- glutSolidCube(5.0);
- }
- void renderScene(void) {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseColor0);
- glLightfv(GL_LIGHT0, GL_AMBIENT, ambientColor0);
- glLightfv(GL_LIGHT0, GL_POSITION, pos0);
- glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuseColor1);
- glLightfv(GL_LIGHT1, GL_POSITION, pos1);
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction);
- glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 15.0);
- glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 120);
- if (deltaMove)
- computePos(deltaMove);
- if (deltaAngle)
- computeDir(deltaAngle);
- //очистить буфер цвета и глубины
- //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // обнулить трансформацию
- glLoadIdentity();
- glColor3f(0.0, 0.0, 0.0);
- glBegin(GL_LINES);
- glVertex3f(-0.05, 0.0, -1.0);
- glVertex3f(0.05, 0.0, -1.0);
- glVertex3f(0.0, -0.05, -1.0);
- glVertex3f(0.0, 0.05, -1.0);
- glEnd();
- /*glPushMatrix();
- glTranslatef(x, 1.0, z - 1.0);
- phisic();
- glPopMatrix();
- */
- // установить камеру
- gluLookAt(x, 1.0f, z,
- x - lx, 1.0f, z - lz,
- 0.0f, 1.0f, 0.0f);
- // нарисуем "землю"
- //sf
- //std::cout << newY << " y";
- //std::cout << newZ << " z";
- if (checher) {
- glPushMatrix();
- glColor3f(1.0, 0.0, 0.0);
- glTranslatef(x - lx, 1.0, z - lz);
- glTranslatef(0, newY, newZ);
- glutSolidSphere(0.3, 30, 30);
- glPopMatrix();
- tm += 0.01;
- //if (z < 0 && x < 0) newZ = -(newZ + V * cos(angleS) * tm);
- newZ = (newZ + V * cos(angleS) * tm);
- newY = 1 + V * sin(angleS) * tm - (g * tm * tm) / 2;
- newX = sqrt(V * tm * V * tm - newZ * newZ) / 2;
- //if (angle > 3.14 / 2) newX = -newX;
- if (newY < -1) {
- tm = 0;
- newY = 1.0;
- newZ = 2.0;
- newX = 0;
- checher = false;
- }
- }
- //sf
- if (counter >= 5) {
- glPushMatrix();
- glTranslatef(1.5, 0.0, 5.0);
- present();
- glPopMatrix();
- }
- glBegin(GL_QUADS);// полигон с коондинатами
- glColor3f(0.5f, 0.5f, 0.5f);
- glVertex3f(-40.0f, 0.0f, -40.0f);
- glColor3f(0.5f, 0.5f, 0.5f);
- glVertex3f(-40.0f, 0.0f, 40.0f);
- glColor3f(0.5f, 0.5f, 0.5f);
- glVertex3f(40.0f, 0.0f, 40.0f);
- glColor3f(0.5f, 0.5f, 0.5f);
- glVertex3f(40.0f, 0.0f, -40.0f);
- glEnd();
- glBindTexture(GL_TEXTURE_2D, texture);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0f, 0.0f); glVertex3f(-40.0f, 0.0f, -40.0f);
- glTexCoord2f(1.0f, 0.0f); glVertex3f(-40.0f, 20.0f, -40.0f);
- glTexCoord2f(1.0f, 1.0f); glVertex3f(40.0f, 20.0f, -40.0f);
- glTexCoord2f(0.0f, 1.0f); glVertex3f(40.0f, 0.0f, -40.0f);
- glEnd();
- glBindTexture(GL_TEXTURE_2D, 0);
- /*glBegin(GL_QUADS);// полигон с коондинатами
- glColor3f(0.0f, 0.0f, 0.7f);
- glVertex3f(-40.0f, 0.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.7f);
- glVertex3f(-40.0f, 20.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.7f);
- glVertex3f(40.0f, 20.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.7f);
- glVertex3f(40.0f, 0.0f, -40.0f);
- glEnd();*/
- glBegin(GL_QUADS);// полигон с коондинатами
- glColor3f(0.0f, 0.0f, 0.8f);
- glVertex3f(40.0f, 0.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.8f);
- glVertex3f(40.0f, 20.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.8f);
- glVertex3f(40.0f, 20.0f, 40.0f);
- glColor3f(0.0f, 0.0f, 0.8f);
- glVertex3f(40.0f, 0.0f, 40.0f);
- glEnd();
- glBegin(GL_QUADS);// полигон с коондинатами
- glColor3f(0.0f, 0.0f, 0.9f);
- glVertex3f(-40.0f, 0.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.9f);
- glVertex3f(-40.0f, 20.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 0.9f);
- glVertex3f(-40.0f, 20.0f, 40.0f);
- glColor3f(0.0f, 0.0f, 0.9f);
- glVertex3f(-40.0f, 0.0f, 40.0f);
- glEnd();
- glBegin(GL_QUADS);// полигон с коондинатами
- glColor3f(0.0f, 0.0f, 1.0f);
- glVertex3f(-40.0f, 20.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 1.0f);
- glVertex3f(40.0f, 20.0f, -40.0f);
- glColor3f(0.0f, 0.0f, 1.0f);
- glVertex3f(40.0f, 20.0f, 40.0f);
- glColor3f(0.0f, 0.0f, 1.0f);
- glVertex3f(-40.0f, 20.0f, 40.0f);
- glEnd();
- /*glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, treecolor);
- glPushMatrix();
- glTranslatef(2.6f, 1.0f, 3.2f);
- glRotatef(0.0f, 5.0f, 0.0f, 0.0f);
- glutSolidCone(0.5, 0.5, 20, 20);
- glTranslatef(0.0, 1.0 , 0.3);
- glRotatef(0.0f, 5.0f, 0.0f, 0.0f);
- glutSolidCone(0.4, 0.4, 20, 20);
- glTranslatef(0.0f, 1.0f, 0.3f);
- glScalef(0.0f, 0.0f, 0.0f);
- glutSolidCone(0.3f, 0.3f, 20, 20);
- glPopMatrix(); */
- // Нарисуем 49 снеговика
- for (int i = -4; i < 3; ++i) {
- for (int j = -4; j < 3; ++j) {
- glPushMatrix();
- glTranslatef(i * 5.0, 0, j * 5.0);
- drawSnowMan();
- glPopMatrix();
- }
- }
- glFlush();
- glutSwapBuffers();
- }
- void pressKey(int key, int xx, int yy) {
- switch (key) {
- case GLUT_KEY_LEFT:
- deltaAngle = -0.01f;
- break;
- case GLUT_KEY_RIGHT:
- deltaAngle = 0.01f;
- break;
- case GLUT_KEY_UP:
- deltaMove = -3.2f;
- break;
- case GLUT_KEY_DOWN:
- deltaMove = 3.2f;
- break;
- case GLUT_KEY_INSERT:
- exit(1);
- break;
- }
- }
- void timerF(int = 0) {
- renderScene();
- glutTimerFunc(1, timerF, 0);
- }
- void releaseKey(int key, int x, int y) {
- switch (key) {
- case GLUT_KEY_LEFT:
- case GLUT_KEY_RIGHT:
- deltaAngle = 0.0f;
- break;
- case GLUT_KEY_UP:
- case GLUT_KEY_DOWN:
- deltaMove = 0;
- break;
- }
- }
- void mouseButton(int button, int state, int x, int y) {
- if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
- srand(time(NULL));
- counter++;
- checher = true;
- rx = (rand() % 100) / (100 * 1.0);
- ry = (rand() % 100) / (100 * 1.0);
- rz = (rand() % 100) / (100 * 1.0);
- glutPostRedisplay();
- }
- }
- int main(int argc, char** argv) {
- // инициализация GLUT и создание окна
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DEPTH | GLUT_RGBA);
- glutInitWindowPosition(100, 100);
- glutInitWindowSize(400, 400);
- glutCreateWindow("Урок 6");
- glClearColor(0.1, 0.1, 0.15, 0.0);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-500, 500, -500, 500, -500, 500);
- // регистрация вызовов
- glutDisplayFunc(renderScene);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- glEnable(GL_COLOR_MATERIAL);
- glEnable(GL_TEXTURE_2D);
- glColor3f(1.0, 0.0, 0.0);
- glEnable(GL_LIGHT0);
- glEnable(GL_LIGHT1);
- glutMouseFunc(mouseButton);
- //glutDisplayFunc(Draw);
- //texture1();
- glutReshapeFunc(changeSize);
- glutIdleFunc(renderScene);
- glutSpecialFunc(pressKey);
- glutTimerFunc(30, timerF, 0);
- // Новые функции для регистрации
- glutIgnoreKeyRepeat(1);
- glutSpecialUpFunc(releaseKey);
- // OpenGL - инициализация функции теста
- glEnable(GL_DEPTH_TEST);
- // главный цикл
- glutMainLoop();
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement