Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая_ ТПКС (Versatran-FA).docx
Скачиваний:
60
Добавлен:
17.01.2020
Размер:
1.36 Mб
Скачать

4 Розробка програмного забезпечення

4.1 Порядок виконання роботи

Проаналізувавши завдання, визначивши особливості програмного забезпечення, пропрацювавши список рекомендованої літератури і методичних вказівок перейшли до написання програми. Підключили наступнi бібліотеки :

#include <glad/glad.h>

#include <GLFW/glfw3.h>

#include <glm/glm.hpp>

#include <glm/gtc/matrix_transform.hpp>

#include <glm/gtc/type_ptr.hpp>

#include <glm/gtx/euler_angles.hpp>

#include <shader_m.h>

#include <camera.h>

#include <assimp/Importer.hpp>

#include <assimp/scene.h>

#include <assimp/postprocess.h>

#include <SOIL/SOIL.h>

#include <SOIL/stb_image.h>

#include <iostream>

Наступним кроком завантажили частини моделі розроблені в Blender, c допомогою assimp.

Assimp::Importer importer;

const aiScene* scene = importer.ReadFile("models/founding.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> founding;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

founding.push_back(scene->mMeshes[i]->mVertices[j].x);

founding.push_back(scene->mMeshes[i]->mVertices[j].y);

founding.push_back(scene->mMeshes[i]->mVertices[j].z);

founding.push_back(scene->mMeshes[i]->mNormals[i].x);

founding.push_back(scene->mMeshes[i]->mNormals[i].y);

founding.push_back(scene->mMeshes[i]->mNormals[i].z);

founding.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

founding.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

Далі підготували VAO І VBO для відтворення.

unsigned int VBO, VAO;

glGenVertexArrays(1, &VAO);

glGenBuffers(1, &VBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, founding.size() * sizeof(float), &founding[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

Наступним кроком завантажили текстури.

unsigned int diffuseMapFounding = loadTexture("founding.jpg");

unsigned int specularMapdiffuseMapFounding = loadTexture("founding.jpg");

unsigned int diffuseMapFactory = loadTexture("bricks.png");

unsigned int specularMapdiffuseMapFactory = loadTexture("bricks.png");

Далі розробили ігровий цикл.

while (!glfwWindowShouldClose(window))

{

float currentFrame = glfwGetTime();

deltaTime = currentFrame - lastFrame;

lastFrame = currentFrame;

processInput(window);

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

lightPos.x = lightX;

lightPos.y = lightY;

lightPos.z = lightZ;

ourShader.use();

ourShader.setVec3("light.position", lightPos);

ourShader.setVec3("viewPos", camera.Position);

// light properties

ourShader.setVec3("light.ambient", 0.4f, 0.4f, 0.4f);

ourShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);

ourShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);

ourShader.setFloat("light.constant", 1.0f);

ourShader.setFloat("light.linear", 0.0014f);

ourShader.setFloat("light.quadratic", 0.000007f);

ourShader.setFloat("material.shininess", 32.0f);

glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);

glm::mat4 view = camera.GetViewMatrix();

ourShader.setMat4("projection", projection);

ourShader.setMat4("view", view);

glm::mat4 model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFounding);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFounding);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, founding.size());

}

На останньому етапі розробили обробники руху миші і натиснення клавишь.

void processInput(GLFWwindow * window)

{

if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)

glfwSetWindowShouldClose(window, true);

if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)

camera.ProcessKeyboard(FORWARD, deltaTime);

if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)

camera.ProcessKeyboard(BACKWARD, deltaTime);

if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)

camera.ProcessKeyboard(LEFT, deltaTime);

if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)

camera.ProcessKeyboard(RIGHT, deltaTime);

if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) {

if (j < 5.23)j += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) {

if (j > 0) j -= 0.01;

}

if (glfwGetKey(window, GLFW_KEY_U) == GLFW_PRESS) {

if (k < 0.3) k += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_I) == GLFW_PRESS) {

if (k > -0.11) k -= 0.01;

}

if (glfwGetKey(window, GLFW_KEY_T) == GLFW_PRESS) {

if (b > -5.0) b -= 0.05;

}

if (glfwGetKey(window, GLFW_KEY_Y) == GLFW_PRESS) {

if (b < 2.0) b += 0.05;

}

if (glfwGetKey(window, GLFW_KEY_G) == GLFW_PRESS) {

if (z > -0.85)z -= 0.01;;

}

if (glfwGetKey(window, GLFW_KEY_H) == GLFW_PRESS) {

if (z < 0.85) z += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS) {

v += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) {

v -= 0.01;

}

if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) {

if (q < 0) {

q += 0.01;

e -= 0.01;

}

}

if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) {

if (e < 0.45) {

q -= 0.01;

e += 0.01;

}

}

if (glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS) {

lightX += 0.1;

}

if (glfwGetKey(window, GLFW_KEY_X) == GLFW_PRESS) {

lightY += 0.1;

}

if (glfwGetKey(window, GLFW_KEY_C) == GLFW_PRESS) {

lightZ += 0.1;

}

if (glfwGetKey(window, GLFW_KEY_V) == GLFW_PRESS) {

lightX -= 0.1;

}

if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS) {

lightY -= 0.1;

}

if (glfwGetKey(window, GLFW_KEY_N) == GLFW_PRESS) {

lightZ -= 0.1;

}

}

void mouse_callback(GLFWwindow * window, double xpos, double ypos)

{

if (firstMouse)

{

lastX = xpos;

lastY = ypos;

firstMouse = false;

}

float xoffset = xpos - lastX;

float yoffset = lastY - ypos;

lastX = xpos;

lastY = ypos;

camera.ProcessMouseMovement(xoffset, yoffset);

}

4.2 Написання шейдерiв.

#version 330 core

layout (location = 0) in vec3 aPos;

layout (location = 1) in vec3 aNormal;

layout (location = 2) in vec2 aTexCoords;

out vec3 FragPos;

out vec3 Normal;

out vec2 TexCoords;

uniform mat4 model;

uniform mat4 view;

uniform mat4 projection;

void main()

{

FragPos = vec3(model * vec4(aPos, 1.0));

Normal = mat3(transpose(inverse(model))) * aNormal;

TexCoords = aTexCoords;

gl_Position = projection * view * vec4(FragPos, 1.0);

}

#version 330 core

out vec4 FragColor;

struct Material {

sampler2D diffuse;

sampler2D specular;

float shininess;

};

struct Light {

vec3 position;

vec3 ambient;

vec3 diffuse;

vec3 specular;

float constant;

float linear;

float quadratic;

};

in vec3 FragPos;

in vec3 Normal;

in vec2 TexCoords;

uniform vec3 viewPos;

uniform Material material;

uniform Light light;

void main()

{

// ambient

vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb;

// diffuse

vec3 norm = normalize(Normal);

vec3 lightDir = normalize(light.position - FragPos);

float diff = max(dot(norm, lightDir), 0.0);

vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb;

// specular

vec3 viewDir = normalize(viewPos - FragPos);

vec3 reflectDir = reflect(-lightDir, norm);

float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess);

vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb;

// attenuation

float distance = length(light.position - FragPos);

float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance));

ambient *= attenuation;

diffuse *= attenuation;

specular *= attenuation;

vec3 result = ambient + diffuse + specular;

FragColor = vec4(result, 1.0);

}

4.3 Опис розробленої програмної моделі робота

Розроблена програма призначена для візуального моделювання використання робота на виробництві. Завдяки цьому, можна оцінити характеристики його функціонування, з’ясувати найкращі умови для роботи промислового роботу. Програма працює у двох режимах – автоматичний та програмному. У програмному режимі можно керувати моделлю за допомогою клавіш клавіатури. У автоматичному режима модель працює за заданим алгоритмом без іншого втручання. Через те, що промисловий робот працює у двох режимах, це надає гнучкості в його налаштуванні, та тестуванні.

Рисунок 4.1 – Вікно програми під час роботи

Рисунок 4.2 – Вікно програми під час маніпулювання

ВИСНОВКИ

OpenGL є низькорівневим процедурним API, що змушує програміста диктувати точну послідовність кроків, щоб побудувати результуючу растрову графіку (імперативний підхід). Це є основною відмінністю від дескрипторних підходів, коли уся сцена передається у вигляді структури даних, які обробляються і будуються на екрані. З одного боку, імперативний підхід вимагає від програміста глибокого знання законів тривимірної графіки і математичних моделей, з іншого боку — дає свободу впровадження різних інновацій.

Програми, які використовують OpenGL, гарантують однаковий візуальний результат незалежно від типу операційної системи і організації відображення інформації. Крім цього, ці програми можуть виконуватись, як на персональних комп’ютерах, так і на робочих станціях.

Можна виділити основні можливості OpenGL:

  1. Набір базових примітивів: точки, лінії, многокутники.

  2. Видові і координатні перетворення.

  3. Видалення невидимих ліній і поверхонь.

  4. Накладення текстур і світла.

  5. Використання спеціальних ефектів: туману, зміни прозорості.

В ході виконання курсової роботи було розроблено програмне забезпечення для моделювання та програмного керування промислового роботом «Versatran-FA» у складі ГІС.

ПЕРЕЛІК ПОСИЛАНЬ

  1. Державний стандарт України 3008–15. Документація. Звіти у сфері науки і техніки. Структура і правила оформлення. – К.: Держстандарт України, 2015.

  2. Ямпольський Л.С., Лавров О.А. Штучний інтелект у плануванні та управлінні виробництвом: Підручник.-К.: Вища шк., 1995.-255 с.

  3. Васильев В.Н. Организация, управление и экономика гибкого интегрированного производства в машиностроении.-М.: Машиностроение, 1986. - 312 с.

  4. Цимбал О.М. Технології програмування: Visual C++. – Харків: ХНУРЕ, 2006. – 336 с.

  5. Гибкие автоматизированные производственные системы / Л.С. Ямпольский, О.М. Калин, М.М. Ткач и др.; Под ред. Л.С. Ямпольского. - К.: Техніка, 1985.-280 с.

  6. Автоматизированные системы управления предприятиями: Учеб. пособие / В.В.Брага, Л.А.Вдовенко, Г.Д.Савичев и др.; Под ред. Г.А.Титаренко.-М.: Финансы и статистика, 1983. - 263 с.

Додаток А

Міністерство освіти і науки України

ЗАТВЕРДЖУЮ

Керівник курсової роботи,

асистент. кафедри КІТАМ

____________ Гурін Д.В.

(підпис, дата)

Опис програми

АРКУШ ЗАТВЕРДЖЕННЯ

ГЮИК.

Аркушів: 33

Студент групи:АКТСІу–17–1 (назва групи)

(підпис, дата, прізвище,ініціали)

2019

Міністерство освіти і науки України

ЗАТВЕРДЖУЮ ГЮИК.

Опис програми

ГЮИК.

2019

А.1 ТЕКСТ ПРОГРАМИ

#include <glad/glad.h>

#include <GLFW/glfw3.h>

#include <glm/glm.hpp>

#include <glm/gtc/matrix_transform.hpp>

#include <glm/gtc/type_ptr.hpp>

#include <glm/gtx/euler_angles.hpp>

#include <learnopengl/shader_m.h>

#include <learnopengl/camera.h>

#include <assimp/Importer.hpp>

#include <assimp/scene.h>

#include <assimp/postprocess.h>

#include <SOIL/SOIL.h>

#include <SOIL/stb_image.h>

#include <iostream>

using namespace std;

void framebuffer_size_callback(GLFWwindow* window, int width, int height);

void mouse_callback(GLFWwindow* window, double xpos, double ypos);

void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);

void processInput(GLFWwindow* window);

unsigned int loadTexture(const char* path);

const unsigned int SCR_WIDTH = 800;

const unsigned int SCR_HEIGHT = 600;

Camera camera(glm::vec3(0.0f, 1.0f, 3.0f));

float lastX = SCR_WIDTH / 2.0f;

float lastY = SCR_HEIGHT / 2.0f;

bool firstMouse = true;

float deltaTime = 0.0f;

float lastFrame = 0.0f;

float j = 0;

float k = 0;

float b = 0;

float z = 0;

float v = 0;

float q = 0;

float e = 0;

double X = 0;

bool flag = false;

float moveZ = 0;

float moveX = 0;

float lightX = -1.1f;

float lightY = 0.7f;

float lightZ = 1.7f;

glm::vec3 lightPos(0.0f, 0.0f, 0.0f);

int main()

{

glfwInit();

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);

glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "CourseWork Cherkashyn", NULL, NULL);

glfwMakeContextCurrent(window);

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

glfwSetCursorPosCallback(window, mouse_callback);

glfwSetScrollCallback(window, scroll_callback);

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);

gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);

glEnable(GL_DEPTH_TEST);

Shader ourShader("1.vs", "1.fs");

Shader lampShader("lamp.vs", "lamp.fs");

float vertices[] = {

-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,

0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f,

0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,

0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f,

-0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f,

-0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f,

-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,

0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,

0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,

-0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,

-0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,

-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

-0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f,

-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,

-0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f,

-0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f,

-0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,

0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,

0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,

0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,

0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,

-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,

0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f,

0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,

0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f,

-0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f,

-0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f,

-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,

0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,

0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,

0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,

-0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,

-0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f

};

Assimp::Importer importer;

const aiScene* scene = importer.ReadFile("models/founding.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> founding;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

founding.push_back(scene->mMeshes[i]->mVertices[j].x);

founding.push_back(scene->mMeshes[i]->mVertices[j].y);

founding.push_back(scene->mMeshes[i]->mVertices[j].z);

founding.push_back(scene->mMeshes[i]->mNormals[i].x);

founding.push_back(scene->mMeshes[i]->mNormals[i].y);

founding.push_back(scene->mMeshes[i]->mNormals[i].z);

founding.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

founding.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/column.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> column;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

column.push_back(scene->mMeshes[i]->mVertices[j].x);

column.push_back(scene->mMeshes[i]->mVertices[j].y);

column.push_back(scene->mMeshes[i]->mVertices[j].z);

column.push_back(scene->mMeshes[i]->mNormals[i].x);

column.push_back(scene->mMeshes[i]->mNormals[i].y);

column.push_back(scene->mMeshes[i]->mNormals[i].z);

column.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

column.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/columnTop.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> columnTop;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

columnTop.push_back(scene->mMeshes[i]->mVertices[j].x);

columnTop.push_back(scene->mMeshes[i]->mVertices[j].y);

columnTop.push_back(scene->mMeshes[i]->mVertices[j].z);

columnTop.push_back(scene->mMeshes[i]->mNormals[i].x);

columnTop.push_back(scene->mMeshes[i]->mNormals[i].y);

columnTop.push_back(scene->mMeshes[i]->mNormals[i].z);

columnTop.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

columnTop.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/cube.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> cube;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

cube.push_back(scene->mMeshes[i]->mVertices[j].x);

cube.push_back(scene->mMeshes[i]->mVertices[j].y);

cube.push_back(scene->mMeshes[i]->mVertices[j].z);

cube.push_back(scene->mMeshes[i]->mNormals[i].x);

cube.push_back(scene->mMeshes[i]->mNormals[i].y);

cube.push_back(scene->mMeshes[i]->mNormals[i].z);

cube.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

cube.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/tube.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> tube;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

tube.push_back(scene->mMeshes[i]->mVertices[j].x);

tube.push_back(scene->mMeshes[i]->mVertices[j].y);

tube.push_back(scene->mMeshes[i]->mVertices[j].z);

tube.push_back(scene->mMeshes[i]->mNormals[i].x);

tube.push_back(scene->mMeshes[i]->mNormals[i].y);

tube.push_back(scene->mMeshes[i]->mNormals[i].z);

tube.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

tube.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/sphere.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> sphere;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

sphere.push_back(scene->mMeshes[i]->mVertices[j].x);

sphere.push_back(scene->mMeshes[i]->mVertices[j].y);

sphere.push_back(scene->mMeshes[i]->mVertices[j].z);

sphere.push_back(scene->mMeshes[i]->mNormals[i].x);

sphere.push_back(scene->mMeshes[i]->mNormals[i].y);

sphere.push_back(scene->mMeshes[i]->mNormals[i].z);

sphere.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

sphere.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/pincer.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> pincer;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

pincer.push_back(scene->mMeshes[i]->mVertices[j].x);

pincer.push_back(scene->mMeshes[i]->mVertices[j].y);

pincer.push_back(scene->mMeshes[i]->mVertices[j].z);

pincer.push_back(scene->mMeshes[i]->mNormals[i].x);

pincer.push_back(scene->mMeshes[i]->mNormals[i].y);

pincer.push_back(scene->mMeshes[i]->mNormals[i].z);

pincer.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

pincer.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/pincerTop1.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> pincerTop1;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

pincerTop1.push_back(scene->mMeshes[i]->mVertices[j].x);

pincerTop1.push_back(scene->mMeshes[i]->mVertices[j].y);

pincerTop1.push_back(scene->mMeshes[i]->mVertices[j].z);

pincerTop1.push_back(scene->mMeshes[i]->mNormals[i].x);

pincerTop1.push_back(scene->mMeshes[i]->mNormals[i].y);

pincerTop1.push_back(scene->mMeshes[i]->mNormals[i].z);

pincerTop1.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

pincerTop1.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/pincerTop2.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> pincerTop2;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

pincerTop2.push_back(scene->mMeshes[i]->mVertices[j].x);

pincerTop2.push_back(scene->mMeshes[i]->mVertices[j].y);

pincerTop2.push_back(scene->mMeshes[i]->mVertices[j].z);

pincerTop2.push_back(scene->mMeshes[i]->mNormals[i].x);

pincerTop2.push_back(scene->mMeshes[i]->mNormals[i].y);

pincerTop2.push_back(scene->mMeshes[i]->mNormals[i].z);

pincerTop2.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

pincerTop2.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/factory.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> factory;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

factory.push_back(scene->mMeshes[i]->mVertices[j].x);

factory.push_back(scene->mMeshes[i]->mVertices[j].y);

factory.push_back(scene->mMeshes[i]->mVertices[j].z);

factory.push_back(scene->mMeshes[i]->mNormals[i].x);

factory.push_back(scene->mMeshes[i]->mNormals[i].y);

factory.push_back(scene->mMeshes[i]->mNormals[i].z);

factory.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

factory.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/cube1.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> cube1;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

cube1.push_back(scene->mMeshes[i]->mVertices[j].x);

cube1.push_back(scene->mMeshes[i]->mVertices[j].y);

cube1.push_back(scene->mMeshes[i]->mVertices[j].z);

cube1.push_back(scene->mMeshes[i]->mNormals[i].x);

cube1.push_back(scene->mMeshes[i]->mNormals[i].y);

cube1.push_back(scene->mMeshes[i]->mNormals[i].z);

cube1.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

cube1.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/cube2.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> cube2;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

cube2.push_back(scene->mMeshes[i]->mVertices[j].x);

cube2.push_back(scene->mMeshes[i]->mVertices[j].y);

cube2.push_back(scene->mMeshes[i]->mVertices[j].z);

cube2.push_back(scene->mMeshes[i]->mNormals[i].x);

cube2.push_back(scene->mMeshes[i]->mNormals[i].y);

cube2.push_back(scene->mMeshes[i]->mNormals[i].z);

cube2.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

cube2.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/cube3.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> cube3;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

cube3.push_back(scene->mMeshes[i]->mVertices[j].x);

cube3.push_back(scene->mMeshes[i]->mVertices[j].y);

cube3.push_back(scene->mMeshes[i]->mVertices[j].z);

cube3.push_back(scene->mMeshes[i]->mNormals[i].x);

cube3.push_back(scene->mMeshes[i]->mNormals[i].y);

cube3.push_back(scene->mMeshes[i]->mNormals[i].z);

cube3.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

cube3.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

scene = importer.ReadFile("models/factoryFounding.obj", aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace);

vector<float> factoryFounding;

for (unsigned int i = 0; i < scene->mNumMeshes; i++)

{

for (unsigned int j = 0; j < scene->mMeshes[i]->mNumVertices; j++) {

if (scene->mMeshes[i]->mTextureCoords[0]) {

factoryFounding.push_back(scene->mMeshes[i]->mVertices[j].x);

factoryFounding.push_back(scene->mMeshes[i]->mVertices[j].y);

factoryFounding.push_back(scene->mMeshes[i]->mVertices[j].z);

factoryFounding.push_back(scene->mMeshes[i]->mNormals[i].x);

factoryFounding.push_back(scene->mMeshes[i]->mNormals[i].y);

factoryFounding.push_back(scene->mMeshes[i]->mNormals[i].z);

factoryFounding.push_back(scene->mMeshes[i]->mTextureCoords[0][j].x);

factoryFounding.push_back(scene->mMeshes[i]->mTextureCoords[0][j].y);

}

}

}

// основание

unsigned int VBO, VAO;

glGenVertexArrays(1, &VAO);

glGenBuffers(1, &VBO);

glBindVertexArray(VAO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER, founding.size() * sizeof(float), &founding[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO1, VAO1;

glGenVertexArrays(1, &VAO1);

glGenBuffers(1, &VBO1);

glBindVertexArray(VAO1);

glBindBuffer(GL_ARRAY_BUFFER, VBO1);

glBufferData(GL_ARRAY_BUFFER, column.size() * sizeof(float), &column[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO2, VAO2;

glGenVertexArrays(1, &VAO2);

glGenBuffers(1, &VBO2);

glBindVertexArray(VAO2);

glBindBuffer(GL_ARRAY_BUFFER, VBO2);

glBufferData(GL_ARRAY_BUFFER, columnTop.size() * sizeof(float), &columnTop[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO3, VAO3;

glGenVertexArrays(1, &VAO3);

glGenBuffers(1, &VBO3);

glBindVertexArray(VAO3);

glBindBuffer(GL_ARRAY_BUFFER, VBO3);

glBufferData(GL_ARRAY_BUFFER, cube.size() * sizeof(float), &cube[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO4, VAO4;

glGenVertexArrays(1, &VAO4);

glGenBuffers(1, &VBO4);

glBindVertexArray(VAO4);

glBindBuffer(GL_ARRAY_BUFFER, VBO4);

glBufferData(GL_ARRAY_BUFFER, tube.size() * sizeof(float), &tube[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO5, VAO5;

glGenVertexArrays(1, &VAO5);

glGenBuffers(1, &VBO5);

glBindVertexArray(VAO5);

glBindBuffer(GL_ARRAY_BUFFER, VBO5);

glBufferData(GL_ARRAY_BUFFER, sphere.size() * sizeof(float), &sphere[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO6, VAO6;

glGenVertexArrays(1, &VAO6);

glGenBuffers(1, &VBO6);

glBindVertexArray(VAO6);

glBindBuffer(GL_ARRAY_BUFFER, VBO6);

glBufferData(GL_ARRAY_BUFFER, pincer.size() * sizeof(float), &pincer[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO7, VAO7;

glGenVertexArrays(1, &VAO7);

glGenBuffers(1, &VBO7);

glBindVertexArray(VAO7);

glBindBuffer(GL_ARRAY_BUFFER, VBO7);

glBufferData(GL_ARRAY_BUFFER, pincerTop1.size() * sizeof(float), &pincerTop1[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO9, VAO9;

glGenVertexArrays(1, &VAO9);

glGenBuffers(1, &VBO9);

glBindVertexArray(VAO9);

glBindBuffer(GL_ARRAY_BUFFER, VBO9);

glBufferData(GL_ARRAY_BUFFER, pincerTop2.size() * sizeof(float), &pincerTop2[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO8, VAO8;

glGenVertexArrays(1, &VAO8);

glGenBuffers(1, &VBO8);

glBindVertexArray(VAO8);

glBindBuffer(GL_ARRAY_BUFFER, VBO8);

glBufferData(GL_ARRAY_BUFFER, factory.size() * sizeof(float), &factory[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO10, VAO10;

glGenVertexArrays(1, &VAO10);

glGenBuffers(1, &VBO10);

glBindVertexArray(VAO10);

glBindBuffer(GL_ARRAY_BUFFER, VBO10);

glBufferData(GL_ARRAY_BUFFER, cube1.size() * sizeof(float), &cube1[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO11, VAO11;

glGenVertexArrays(1, &VAO11);

glGenBuffers(1, &VBO11);

glBindVertexArray(VAO11);

glBindBuffer(GL_ARRAY_BUFFER, VBO11);

glBufferData(GL_ARRAY_BUFFER, cube2.size() * sizeof(float), &cube2[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO12, VAO12;

glGenVertexArrays(1, &VAO12);

glGenBuffers(1, &VBO12);

glBindVertexArray(VAO12);

glBindBuffer(GL_ARRAY_BUFFER, VBO12);

glBufferData(GL_ARRAY_BUFFER, cube3.size() * sizeof(float), &cube3[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int VBO13, VAO13;

glGenVertexArrays(1, &VAO13);

glGenBuffers(1, &VBO13);

glBindVertexArray(VAO13);

glBindBuffer(GL_ARRAY_BUFFER, VBO13);

glBufferData(GL_ARRAY_BUFFER, factoryFounding.size() * sizeof(float), &factoryFounding[0], GL_STATIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));

glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));

glEnableVertexAttribArray(2);

glBindBuffer(GL_ARRAY_BUFFER, 0);

unsigned int lightVAO, lightVBO;

glGenVertexArrays(1, &lightVAO);

glGenBuffers(1, &lightVBO);

glBindVertexArray(lightVAO);

glBindBuffer(GL_ARRAY_BUFFER, lightVBO);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, lightVBO);

// note that we update the lamp's position attribute's stride to reflect the updated buffer data

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0);

glEnableVertexAttribArray(0);

unsigned int diffuseMapFounding = loadTexture("founding.jpg");

unsigned int specularMapdiffuseMapFounding = loadTexture("founding.jpg");

unsigned int diffuseMapFactory = loadTexture("bricks.png");

unsigned int specularMapdiffuseMapFactory = loadTexture("bricks.png");

unsigned int diffuseMapFactoryFonding = loadTexture("metalFlour.jpg");

unsigned int specularMapdiffuseMapFactoryFounding = loadTexture("metalFlour.jpg");

ourShader.use();

ourShader.setInt("material.diffuse", 0);

ourShader.setInt("material.specular", 1);

while (!glfwWindowShouldClose(window))

{

float currentFrame = glfwGetTime();

deltaTime = currentFrame - lastFrame;

lastFrame = currentFrame;

processInput(window);

glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

if (flag == false) {

lightPos.x = lightX;

lightPos.y = lightY;

lightPos.z = lightZ;

ourShader.use();

ourShader.setVec3("light.position", lightPos);

ourShader.setVec3("viewPos", camera.Position);

// light properties

ourShader.setVec3("light.ambient", 0.4f, 0.4f, 0.4f);

ourShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);

ourShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);

ourShader.setFloat("light.constant", 1.0f);

ourShader.setFloat("light.linear", 0.0014f);

ourShader.setFloat("light.quadratic", 0.000007f);

// material properties

ourShader.setFloat("material.shininess", 32.0f);

glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);

glm::mat4 view = camera.GetViewMatrix();

ourShader.setMat4("projection", projection);

ourShader.setMat4("view", view);

glm::mat4 model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFounding);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFounding);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, founding.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

ourShader.setMat4("model", model);

glBindVertexArray(VAO1);

glDrawArrays(GL_TRIANGLES, 0, column.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO2);

glDrawArrays(GL_TRIANGLES, 0, columnTop.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO3);

glDrawArrays(GL_TRIANGLES, 0, cube.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

ourShader.setMat4("model", model);

glBindVertexArray(VAO4);

glDrawArrays(GL_TRIANGLES, 0, tube.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

ourShader.setMat4("model", model);

glBindVertexArray(VAO5);

glDrawArrays(GL_TRIANGLES, 0, sphere.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, v, glm::vec3(0.0f, 0.0f, 1.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

ourShader.setMat4("model", model);

glBindVertexArray(VAO6);

glDrawArrays(GL_TRIANGLES, 0, pincer.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, v, glm::vec3(0.0f, 0.0f, 1.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.0f, q, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO7);

glDrawArrays(GL_TRIANGLES, 0, pincerTop1.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, v, glm::vec3(0.0f, 0.0f, 1.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.0f, e, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO9);

glDrawArrays(GL_TRIANGLES, 0, pincerTop2.size());

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFactory);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFactory);

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO8);

glDrawArrays(GL_TRIANGLES, 0, factory.size());

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFactoryFonding);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFactoryFounding);

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO13);

glDrawArrays(GL_TRIANGLES, 0, factoryFounding.size());

lampShader.use();

lampShader.setMat4("projection", projection);

lampShader.setMat4("view", view);

model = glm::mat4(1.0f);

model = glm::translate(model, lightPos);

model = glm::scale(model, glm::vec3(0.2f));

lampShader.setMat4("model", model);

glBindVertexArray(lightVAO);

glDrawArrays(GL_TRIANGLES, 0, 36);

}

else {

if (v < 1.55) {

v += 0.01;

}

else if (b< 1.65 && j< 1.57) {

b += 0.01;

}

else if (j < 1.57) {

j += 0.05;

moveX += 0.05;

}

else if (b > -3.55) {

b -= 0.05;

moveZ -= 0.05;

}

lightPos.x = lightX;

lightPos.y = lightY;

lightPos.z = lightZ;

ourShader.use();

ourShader.setVec3("light.position", lightPos);

ourShader.setVec3("viewPos", camera.Position);

// light properties

ourShader.setVec3("light.ambient", 0.4f, 0.4f, 0.4f);

ourShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);

ourShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);

ourShader.setFloat("light.constant", 1.0f);

ourShader.setFloat("light.linear", 0.0014f);

ourShader.setFloat("light.quadratic", 0.000007f);

// material properties

ourShader.setFloat("material.shininess", 32.0f);

glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)SCR_WIDTH / (float)SCR_HEIGHT, 0.1f, 100.0f);

glm::mat4 view = camera.GetViewMatrix();

ourShader.setMat4("projection", projection);

ourShader.setMat4("view", view);

glm::mat4 model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFounding);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFounding);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES, 0, founding.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

ourShader.setMat4("model", model);

glBindVertexArray(VAO1);

glDrawArrays(GL_TRIANGLES, 0, column.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO2);

glDrawArrays(GL_TRIANGLES, 0, columnTop.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO3);

glDrawArrays(GL_TRIANGLES, 0, cube.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

ourShader.setMat4("model", model);

glBindVertexArray(VAO4);

glDrawArrays(GL_TRIANGLES, 0, tube.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

ourShader.setMat4("model", model);

glBindVertexArray(VAO5);

glDrawArrays(GL_TRIANGLES, 0, sphere.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, v, glm::vec3(0.0f, 0.0f, 1.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

ourShader.setMat4("model", model);

glBindVertexArray(VAO6);

glDrawArrays(GL_TRIANGLES, 0, pincer.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, v, glm::vec3(0.0f, 0.0f, 1.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.0f, q, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO7);

glDrawArrays(GL_TRIANGLES, 0, pincerTop1.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, k, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, j, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, b));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, z, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.45223, 4.61354, 16.0162));

model = glm::rotate(model, v, glm::vec3(0.0f, 0.0f, 1.0f));

model = glm::translate(model, glm::vec3(-0.45223, -4.61354, -16.0162));

model = glm::translate(model, glm::vec3(0.0f, e, 0.0f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO9);

glDrawArrays(GL_TRIANGLES, 0, pincerTop2.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO10);

glDrawArrays(GL_TRIANGLES, 0, cube1.size());

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO11);

glDrawArrays(GL_TRIANGLES, 0, cube2.size());

model = glm::mat4(1.0f);

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

model = glm::rotate(model, moveX, glm::vec3(0.0f, 1.0f, 0.0f));

model = glm::translate(model, glm::vec3(0.0f, 0.0f, moveZ));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO12);

glDrawArrays(GL_TRIANGLES, 0, cube3.size());

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFactory);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFactory);

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO8);

glDrawArrays(GL_TRIANGLES, 0, factory.size());

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMapFactoryFonding);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMapdiffuseMapFactoryFounding);

model = glm::mat4(1.0f);

model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f));

model = glm::scale(model, glm::vec3(0.1f, 0.1f, 0.1f));

ourShader.setMat4("model", model);;

glBindVertexArray(VAO13);

glDrawArrays(GL_TRIANGLES, 0, factoryFounding.size());

lampShader.use();

lampShader.setMat4("projection", projection);

lampShader.setMat4("view", view);

model = glm::mat4(1.0f);

model = glm::translate(model, lightPos);

model = glm::scale(model, glm::vec3(0.2f));

lampShader.setMat4("model", model);

glBindVertexArray(lightVAO);

glDrawArrays(GL_TRIANGLES, 0, 36);

}

glfwSwapBuffers(window);

glfwPollEvents();

}

glfwTerminate();

return 0;

}

void processInput(GLFWwindow * window)

{

if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)

glfwSetWindowShouldClose(window, true);

if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)

camera.ProcessKeyboard(FORWARD, deltaTime);

if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS)

camera.ProcessKeyboard(BACKWARD, deltaTime);

if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)

camera.ProcessKeyboard(LEFT, deltaTime);

if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)

camera.ProcessKeyboard(RIGHT, deltaTime);

if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) {

if (j < 5.23)j += 0.01;

cout << j << endl;

}

if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) {

if (j > 0) j -= 0.01;

}

if (glfwGetKey(window, GLFW_KEY_U) == GLFW_PRESS) {

if (k < 0.3) k += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_I) == GLFW_PRESS) {

if (k > -0.11) k -= 0.01;

}

if (glfwGetKey(window, GLFW_KEY_T) == GLFW_PRESS) {

if (b > -5.0) b -= 0.05;

cout << b << endl;

}

if (glfwGetKey(window, GLFW_KEY_Y) == GLFW_PRESS) {

if (b < 2.0) b += 0.05;

cout << b << endl;

}

if (glfwGetKey(window, GLFW_KEY_G) == GLFW_PRESS) {

if (z > -0.85)z -= 0.01;;

}

if (glfwGetKey(window, GLFW_KEY_H) == GLFW_PRESS) {

if (z < 0.85) z += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS) {

v += 0.01;

}

if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) {

v -= 0.01;

}

if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) {

if (q < 0) {

q += 0.01;

e -= 0.01;

}

}

if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) {

if (e < 0.45) {

q -= 0.01;

e += 0.01;

}

}

if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) {

if (!flag) {

flag = !flag;

}

else {

flag = !flag;

moveZ = 0;

moveX = 0;

v = 0;

b = 0;

j = 0;

}

}

if (glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS) {

lightX += 0.1;

}

if (glfwGetKey(window, GLFW_KEY_X) == GLFW_PRESS) {

lightY += 0.1;

}

if (glfwGetKey(window, GLFW_KEY_C) == GLFW_PRESS) {

lightZ += 0.1;

}

if (glfwGetKey(window, GLFW_KEY_V) == GLFW_PRESS) {

lightX -= 0.1;

}

if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS) {

lightY -= 0.1;

}

if (glfwGetKey(window, GLFW_KEY_N) == GLFW_PRESS) {

lightZ -= 0.1;

}

}

void framebuffer_size_callback(GLFWwindow * window, int width, int height)

{

glViewport(0, 0, width, height);

}

void mouse_callback(GLFWwindow * window, double xpos, double ypos)

{

if (firstMouse)

{

lastX = xpos;

lastY = ypos;

firstMouse = false;

}

float xoffset = xpos - lastX;

float yoffset = lastY - ypos;

lastX = xpos;

lastY = ypos;

camera.ProcessMouseMovement(xoffset, yoffset);

}

void scroll_callback(GLFWwindow * window, double xoffset, double yoffset)

{

camera.ProcessMouseScroll(yoffset);

}

unsigned int loadTexture(char const* path)

{

unsigned int textureID;

glGenTextures(1, &textureID);

int width, height, nrComponents;

unsigned char* data = stbi_load(path, &width, &height, &nrComponents, 0);

if (data)

{

GLenum format;

if (nrComponents == 1)

format = GL_RED;

else if (nrComponents == 3)

format = GL_RGB;

else if (nrComponents == 4)

format = GL_RGBA;

glBindTexture(GL_TEXTURE_2D, textureID);

glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);

glGenerateMipmap(GL_TEXTURE_2D);

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_LINEAR_MIPMAP_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

stbi_image_free(data);

}

else

{

std::cout << "Texture failed to load at path: " << path << std::endl;

stbi_image_free(data);

}

return textureID;

}

А.2 ЗАГАЛЬНІ ВІДОМОСТІ

Реалізована програма промисловий робот «Versatran-FA» містить декілька файлів. Для надання повного функціоналу та забезпечення правильного використання програми необхідна операційна система Windows 10, а для запуску проекту середовище програмування Microsoft Visual Studio 2019 Community або вже скомпільований файл проекту.

А.3 ФУНКЦІОНАЛЬНЕ ПРИЗНАЧЕННЯ

Розроблена програма створювалась за для того, аби змоделювати роботу промислового робота «Versatran-FA», надати йому необхідних властивостей та здібностей. Такий метод графічного моделювання дозволяє помістити досліджуємий об’єкт до середовища його прямого призначення та функціонування, аби оцінити його необхідність та економічну ефективність, зменшити матеріальні витрати на його розробку.

А.4 ВИКОРИСТОВУВАНІ ТЕХНІЧНІ ЗАСОБИ

За для успішного запуску розробленого проекту необхідна IBM-сумісна обчислювальна система з встановленим вище зазначеним програмним забезпеченням, пристроями вводу-виводу. Розробка відбувалась на процесорі:

Intel Core i5 7700, тактова частота якого – 3600 МГц, кількість ядер – 4, оперативна пам’ять – 8 Гб.

А.5 ВИКЛИК І ЗАВАНТАЖЕННЯ

Для запуску програми необхідний розроблений проект або заздалегідь скомпільований файл .

А.6 ВХІДНІ ДАНІ

Вхідними даними є розроблений промисловий робот «Versatran-FA» та його функціонал.

Рисунок 6.1 – Модель «Versatran-FA»

А.7 ВИХІДНІ ДАНІ

Вихідними даними є графічне представлення промислового робота у відповідному йому робочому середовищу.

Рисунок А.1 – Вікно програми під час роботи

Рисунок А.2 – Вікно програми під час маніпулювання