Как передвигать только один объект с помощью клавиатуры в OpenGL?

Здраствуйте. У меня есть несколько объектов. И я хочу чтобы только треугольник передвигался налево, направо, вверх и вниз. Картинка снизу: введите сюда описание изображения

Я подключил необходимые библиотеки, но треугольник не реагирует на нажатия. Подскажите как решить эту проблему? Код оставлю. Предупреждаю, код очень длинный.

`

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
#include <glm/glm.hpp>
#include <vector>

GLuint VBO;
std::vector<glm::vec3> Vertices;
GLuint CBO;
std::vector<glm::vec3> Colors;
GLuint gScaleLocation;

GLuint VBO1;
std::vector<glm::vec3> Vertices1;
GLuint CBO1;
std::vector<glm::vec3> Colors1;
GLuint gScaleLocation1;

GLuint VBO2;
std::vector<glm::vec3> Vertices2;
GLuint CBO2;
std::vector<glm::vec3> Colors2;

GLuint VBO3;
std::vector<glm::vec3> Vertices3;
GLuint CBO3;
std::vector<glm::vec3> Colors3;

GLuint VBO4;
std::vector<glm::vec3> Vertices4;
GLuint CBO4;
std::vector<glm::vec3> Colors4;

GLuint VBO5;
std::vector<glm::vec3> Vertices5;
GLuint CBO5;
std::vector<glm::vec3> Colors5;

float g = 0.0;
float px = 0.0;
float py = 0.0;
float zx = 1.0;
float zy = 1.0;
float Scale = 0.0f;
float Scale1 = 0.0f;

GLuint gWorldLocation;
GLuint gWorldLocation1;

static const char* pVS = "                                                    \n\
#version 330                                                                  \n\
                                                                              \n\
layout (location = 0) in vec3 Position;                                       \n\
layout (location = 1) in vec3 Color;                                       \n\
out vec3 Fcolor;                                                            \n\
uniform float gScale;                                                           \n\
void main()                                                                   \n\
{                                                                             \n\
    Fcolor = Color;                                                         \n\
    gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z, 1.0);      \n\
}";

static const char* pFS = "                                                    \n\
#version 330                                                                  \n\
in vec3 Fcolor;                                                             \n\
out vec4 FragColor;                                                           \n\
void main()                                                                   \n\
{                                                                             \n\
    FragColor = vec4(Fcolor.r, Fcolor.g, Fcolor.b, 1.0);                                     \n\
}";

static void RenderSceneCB()
{   
    glClear(GL_COLOR_BUFFER_BIT);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);

    //draw first object
    static float Scale2 = 1.0f;
//  Scale2 += 0.001f;
    glUniform1f(gScaleLocation, Scale2);

    /*if (Scale >= 1)
        Scale = 1;*/

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, CBO);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_POLYGON, 0, Vertices.size());

    /*static float Scale1 = 0.0f;
    Scale1 += 0.005f;
    glUniform1f(gScaleLocation, Scale1);

    if (Scale1 >= 1)
        Scale1 = 1;*/

    glBindBuffer(GL_ARRAY_BUFFER, VBO1);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, CBO1);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_POLYGON, 0, Vertices1.size());

    /*static float Scale2 = 0.0f;
    Scale2 += 0.003f;
    glUniform1f(gScaleLocation, Scale2);

    if (Scale2 >= 1)
        Scale2 = 1;*/

    glBindBuffer(GL_ARRAY_BUFFER, VBO2);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, CBO2);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_POLYGON, 0, Vertices2.size());

    /*static float ScaleTimer = 0.0f;
    ScaleTimer += 0.101f;
    glUniform1f(gScaleLocation, ScaleTimer);

    if (ScaleTimer >= 1)
        ScaleTimer = 1;*/

    glBindBuffer(GL_ARRAY_BUFFER, VBO3);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, CBO3);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_POLYGON, 0, Vertices3.size());

    glBindBuffer(GL_ARRAY_BUFFER, VBO4);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, CBO4);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_POLYGON, 0, Vertices4.size());  


    glm::mat4 World;
    glm::mat4 World0;
    glm::mat4 World1;
    glm::mat4 World2;
    glm::mat4 FWorld;

    World[0][0] = 1.0f;     World[0][1] = 0.0f;         World[0][2] = 0.0f;             World[0][3] = 0.0f;
    World[1][0] = 0.0f;     World[1][1] = cosf(Scale);  World[1][2] = -sinf(Scale);     World[1][3] = 0.0f;
    World[2][0] = 0.0f;     World[2][1] = sinf(Scale);  World[2][2] = cosf(Scale);      World[2][3] = 0.0f;
    World[3][0] = 0.0f;     World[3][1] = 0.0f;         World[3][2] = 0.0f;             World[3][3] = 1.0f;

    World0[0][0] = cosf(Scale1);    World0[0][1] = 0.0f;        World0[0][2] = -sinf(Scale1);   World0[0][3] = 0.0f;
    World0[1][0] = 0.0f;            World0[1][1] = 1.0f;        World0[1][2] = 0.0f;            World0[1][3] = 0.0f;
    World0[2][0] = sinf(Scale1);    World0[2][1] = 0.0f;        World0[2][2] = cosf(Scale1);    World0[2][3] = 0.0f;
    World0[3][0] = 0.0f;            World0[3][1] = 0.0f;        World0[3][2] = 0.0f;            World0[3][3] = 1.0f;

    World1[0][0] = zx;          World1[0][1] = 0.0f;        World1[0][2] = 0.0f;        World1[0][3] = 0.0f;
    World1[1][0] = 0.0f;        World1[1][1] = zy;          World1[1][2] = 0.0f;        World1[1][3] = 0.0f;
    World1[2][0] = 0.0f;        World1[2][1] = 0.0f;        World1[2][2] = 0.0f;        World1[2][3] = 0.0f;
    World1[3][0] = 0.0f;        World1[3][1] = 0.0f;        World1[3][2] = 0.0f;        World1[3][3] = 1.0f;

    World2[0][0] = 1.0f;    World2[0][1] = 0.0f;    World2[0][2] = 0.0f;    World2[0][3] = px;
    World2[1][0] = 0.0f;    World2[1][1] = 1.0f;    World2[1][2] = 0.0f;    World2[1][3] = py;
    World2[2][0] = 0.0f;    World2[2][1] = 0.0f;    World2[2][2] = 1.0f;    World2[2][3] = 0.0f;
    World2[3][0] = 0.0f;    World2[3][1] = 0.0f;    World2[3][2] = 0.0f;    World2[3][3] = 1.0f;

    FWorld = World2 * World1 * World * World0;

    glUniformMatrix4fv(gWorldLocation, 1, GL_TRUE, &FWorld[0][0]);
    //human
    glBindBuffer(GL_ARRAY_BUFFER, VBO5);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, CBO5);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, Vertices5.size());

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);

    glutSwapBuffers();
}

void MouseCB(int button, int state, int x, int y) {


    if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        px = float(x - 1024 / 2) / (1024 / 2);
        py = float(768 / 2 - y) / (768 / 2);
        std::cout << "px = " << px << " py = " << py << std::endl;
        std::cout << " x = " << x << " y = " << y << std::endl;
    }

    if (button == GLUT_RIGHT_BUTTON && state == GLUT_DOWN)
    {
        float tx = float(x - 1024 / 2) / (1024 / 2);
        float ty = float(768 / 2 - y) / (768 / 2);
        std::cout << " x = " << tx << " y = " << ty << std::endl;
        /*  Vertices_10.push_back(glm::vec3(tx, ty, 0.0f));
            Colors_10.push_back(glm::vec3(1.0f, 1.0f, 0.0f));
            CreateVertexBuffer_10();*/
    }
}

void MouseWheel(int button, int dir, int x, int y)
{
    if (dir > 0)
    {
        zx += 0.1f;// Zoom in
        zy += 0.1f;
        std::cout << "zx = " << zx << " zy = " << zy << std::endl;
    }
    else
    {
        zx -= 0.1f;// Zoom out
        zy -= 0.1f;
        std::cout << "zx = " << zx << " zy = " << zy << std::endl;
    }
}

void KeyCB(unsigned char key, int x, int y)
{
    if (key == 27) {
        exit(0);
    }

    if (key == 'e') {
        g = 0.0009;
    }

    if (key == 'w') {
        py += 0.1f;
    }

    switch (key) {
    case 'a': px -= 0.1; break;
    case 's': py -= 0.1f; break;
    case 'd': px += 0.1; break;
    }
}

void SKeyCB(int key, int x, int y)
{
    if (key == GLUT_KEY_LEFT) {
        Scale1 += 0.01;
    }

    switch (key) {
    case GLUT_KEY_RIGHT: Scale1 -= 0.01; break;
    case GLUT_KEY_UP: Scale -= 0.01; break;
    case GLUT_KEY_DOWN: Scale += 0.01; break;
    }
}

static void InitializeGlutCallbacks()
{
    glutDisplayFunc(RenderSceneCB);
    glutIdleFunc(RenderSceneCB);

    glutMouseFunc(MouseCB);
    glutMouseWheelFunc(MouseWheel);
    glutKeyboardFunc(KeyCB);
    glutSpecialFunc(SKeyCB);
}

static void CreateVertexBuffer()
{
    Vertices.push_back(glm::vec3(-0.597f, 1.0f, 0.0f));
    Vertices.push_back(glm::vec3(-0.796f, 1.0f, 0.0f));
    Vertices.push_back(glm::vec3(-0.796f, -1.0f, 0.0f));
    Vertices.push_back(glm::vec3(-0.597f, -1.0f, 0.0f));

    glGenBuffers(1, &VBO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Vertices.size(), Vertices.data(), GL_STATIC_DRAW);
}

static void CreateColorBuffer()
{
    Colors.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors.push_back(glm::vec3(0.0f, 0.0f, 1.0f));

    glGenBuffers(1, &CBO);
    glBindBuffer(GL_ARRAY_BUFFER, CBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Colors.size(), Colors.data(), GL_STATIC_DRAW);
}

static void CreateVertexBuffer1()
{   
    Vertices1.push_back(glm::vec3(-0.199f, 1.0f, 0.0f));
    Vertices1.push_back(glm::vec3(-0.398f, 1.0f, 0.0f));
    Vertices1.push_back(glm::vec3(-0.398f, -1.0f, 0.0f));
    Vertices1.push_back(glm::vec3(-0.199f, -1.0f, 0.0f));

    glGenBuffers(1, &VBO1);
    glBindBuffer(GL_ARRAY_BUFFER, VBO1);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Vertices1.size(), Vertices1.data(), GL_STATIC_DRAW);
}

static void CreateColorBuffer1()
{
    Colors1.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors1.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors1.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors1.push_back(glm::vec3(0.0f, 0.0f, 1.0f));

    glGenBuffers(1, &CBO1);
    glBindBuffer(GL_ARRAY_BUFFER, CBO1);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Colors1.size(), Colors1.data(), GL_STATIC_DRAW);
}

static void CreateVertexBuffer2()
{
    Vertices2.push_back(glm::vec3(0.0f, 1.0f, 0.0f));
    Vertices2.push_back(glm::vec3(0.199f, 1.0f, 0.0f));
    Vertices2.push_back(glm::vec3(0.199f, -1.0f, 0.0f));
    Vertices2.push_back(glm::vec3(0.0f, -1.0f, 0.0f));

    glGenBuffers(1, &VBO2);
    glBindBuffer(GL_ARRAY_BUFFER, VBO2);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Vertices2.size(), Vertices2.data(), GL_STATIC_DRAW);
}

static void CreateColorBuffer2()
{
    Colors2.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors2.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors2.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors2.push_back(glm::vec3(0.0f, 0.0f, 1.0f));

    glGenBuffers(1, &CBO2);
    glBindBuffer(GL_ARRAY_BUFFER, CBO2);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Colors2.size(), Colors2.data(), GL_STATIC_DRAW);
}

static void CreateVertexBuffer3()
{
    Vertices3.push_back(glm::vec3(0.398f, 1.0f, 0.0f));
    Vertices3.push_back(glm::vec3(0.597f, 1.0f, 0.0f));
    Vertices3.push_back(glm::vec3(0.597f, -1.0f, 0.0f));
    Vertices3.push_back(glm::vec3(0.398f, -1.0f, 0.0f));

    glGenBuffers(1, &VBO3);
    glBindBuffer(GL_ARRAY_BUFFER, VBO3);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Vertices3.size(), Vertices3.data(), GL_STATIC_DRAW);
}

static void CreateColorBuffer3()
{
    Colors3.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors3.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors3.push_back(glm::vec3(0.0f, 0.0f, 1.0f));
    Colors3.push_back(glm::vec3(0.0f, 0.0f, 1.0f));

    glGenBuffers(1, &CBO3);
    glBindBuffer(GL_ARRAY_BUFFER, CBO3);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Colors3.size(), Colors3.data(), GL_STATIC_DRAW);
}

static void CreateVertexBuffer4()
{
    Vertices4.push_back(glm::vec3(0.796f, 0.132f, 0.0f));
    Vertices4.push_back(glm::vec3(1.0f, 0.132f, 0.0f));
    Vertices4.push_back(glm::vec3(1.0f, -0.132f, 0.0f));
    Vertices4.push_back(glm::vec3(0.796f, -0.132f, 0.0f));

    glGenBuffers(1, &VBO4);
    glBindBuffer(GL_ARRAY_BUFFER, VBO4);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Vertices4.size(), Vertices4.data(), GL_STATIC_DRAW);
}

static void CreateColorBuffer4()
{
    Colors4.push_back(glm::vec3(1.0f, 0.0f, 0.0f));
    Colors4.push_back(glm::vec3(1.0f, 0.0f, 0.0f));
    Colors4.push_back(glm::vec3(1.0f, 0.0f, 0.0f));
    Colors4.push_back(glm::vec3(1.0f, 0.0f, 0.0f));

    glGenBuffers(1, &CBO4);
    glBindBuffer(GL_ARRAY_BUFFER, CBO4);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Colors4.size(), Colors4.data(), GL_STATIC_DRAW);
}

static void CreateVertexBuffer5()
{
    Vertices5.push_back(glm::vec3(-0.845f, -0.132f, 0.0f));
    Vertices5.push_back(glm::vec3(-0.943f, -0.132f, 0.0f));
    Vertices5.push_back(glm::vec3(-0.894f, 0.132f, 0.0f));

    glGenBuffers(1, &VBO5);
    glBindBuffer(GL_ARRAY_BUFFER, VBO5);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Vertices5.size(), Vertices5.data(), GL_STATIC_DRAW);
}

static void CreateColorBuffer5()
{
    Colors5.push_back(glm::vec3(1.0f, 0.0f, 1.0f));
    Colors5.push_back(glm::vec3(1.0f, 0.0f, 1.0f));
    Colors5.push_back(glm::vec3(1.0f, 0.0f, 1.0f));

    glGenBuffers(1, &CBO5);
    glBindBuffer(GL_ARRAY_BUFFER, CBO5);
    glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * Colors5.size(), Colors5.data(), GL_STATIC_DRAW);
}

static void AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum ShaderType)
{
    GLuint ShaderObj = glCreateShader(ShaderType);

    if (ShaderObj == 0) {
        fprintf(stderr, "Error creating shader type %d\n", ShaderType);
        exit(0);
    }

    const GLchar* p[1];
    p[0] = pShaderText;
    GLint Lengths[1];
    Lengths[0] = strlen(pShaderText);
    glShaderSource(ShaderObj, 1, p, Lengths);
    glCompileShader(ShaderObj);
    GLint success;
    glGetShaderiv(ShaderObj, GL_COMPILE_STATUS, &success);
    if (!success) {
        GLchar InfoLog[1024];
        glGetShaderInfoLog(ShaderObj, 1024, NULL, InfoLog);
        fprintf(stderr, "Error compiling shader type %d: '%s'\n", ShaderType, InfoLog);
        exit(1);
    }

    glAttachShader(ShaderProgram, ShaderObj);
}

static void CompileShaders()
{
    GLuint ShaderProgram = glCreateProgram();

    if (ShaderProgram == 0) {
        fprintf(stderr, "Error creating shader program\n");
        exit(1);
    }

    AddShader(ShaderProgram, pVS, GL_VERTEX_SHADER);
    AddShader(ShaderProgram, pFS, GL_FRAGMENT_SHADER);

    GLint Success = 0;
    GLchar ErrorLog[1024] = { 0 };

    glLinkProgram(ShaderProgram);
    glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &Success);
    if (Success == 0) {
        glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
        fprintf(stderr, "Error linking shader program: '%s'\n", ErrorLog);
        exit(1);
    }

    glValidateProgram(ShaderProgram);
    glGetProgramiv(ShaderProgram, GL_VALIDATE_STATUS, &Success);
    if (!Success) {
        glGetProgramInfoLog(ShaderProgram, sizeof(ErrorLog), NULL, ErrorLog);
        fprintf(stderr, "Invalid shader program: '%s'\n", ErrorLog);
        exit(1);
    }

    glUseProgram(ShaderProgram);
    gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");
    assert(gScaleLocation != 0xFFFFFFFF);

}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowSize(1024, 768);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Game.");

    InitializeGlutCallbacks();

    // Must be done after glut is initialized!
    GLenum res = glewInit();
    if (res != GLEW_OK) {
        fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
        return 1;
    }

    glClearColor(0.3f, 0.3f, 0.3f, 0.0f);

    CreateVertexBuffer();
    CreateColorBuffer();
    CreateVertexBuffer1();
    CreateColorBuffer1();
    CreateVertexBuffer2();
    CreateColorBuffer2();
    CreateVertexBuffer3();
    CreateColorBuffer3();
    CreateVertexBuffer4();
    CreateColorBuffer4();

    CreateVertexBuffer5();
    CreateColorBuffer5();

    CompileShaders();
    glutIdleFunc(RenderSceneCB);
    glutMainLoop();

    return 0;
}

Подскажите пожалуйста.


Ответы (0 шт):