вращение GLM не работает должным образом

0

Я пытаюсь повернуть куб вокруг оси X и Y. Я не знаю, почему он не работает для этих двух, и он работает только вокруг оси Z. Не работая, я имею в виду, что куб также перемещается, и он не вращается на месте.

Соответствующий код, который я использую:

void rotateZ(float angle) {
        _modelMatrix = glm::rotate(_modelMatrix, -angle, glm::vec3(0,0,1));
    }
    void rotateY(float angle) {
        _modelMatrix = glm::rotate(_modelMatrix, -angle, glm::vec3(0,1,0));
    }
    void rotateX(float angle) {
        _modelMatrix = glm::rotate(_modelMatrix, -angle, glm::vec3(1,0,0));
    }
    void translate_to_origin() {
        _modelMatrix = glm::translate(_modelMatrix, glm::vec3(-(_x + _n/2), -(_y +  _n/2), -(_z + _n/2)));
    }   
    void translate_to_position() {
        _modelMatrix = glm::translate(_modelMatrix, glm::vec3(_x + _n/2, _y + _n/2, _z + _n/2));
    }
    void translate (float x, float y, float z) {
        _modelMatrix = glm::translate(_modelMatrix, glm::vec3(x, y, z));
    }

    void create(float x, float y, float z, float n) {


                std::vector<MyVertexFormat>verts;
                std::vector<glm::uvec3>indx;


                verts.push_back(MyVertexFormat(x,   y,  z,  1,0,0));
                verts.push_back(MyVertexFormat(x + n,   y,  z,  1,0,0));
                verts.push_back(MyVertexFormat(x + n,   y,  z - n,  0,1,0));
                verts.push_back(MyVertexFormat(x,   y,  z - n,  0,0,1));

                verts.push_back(MyVertexFormat(x,   y + n,  z,  1,0,0));
                verts.push_back(MyVertexFormat(x + n,   y + n,  z,  1,0,0));
                verts.push_back(MyVertexFormat(x + n,   y + n,  z - n,  1,0,1));
                verts.push_back(MyVertexFormat(x,   y - n,  z - n,  1,1,1));


        indx.push_back(glm::uvec3(0,1,2));
                indx.push_back(glm::uvec3(2,3,0));

        indx.push_back(glm::uvec3(4,5,6));
                indx.push_back(glm::uvec3(6,7,4));


        indx.push_back(glm::uvec3(0,1,4));
                indx.push_back(glm::uvec3(4,5,1));


        indx.push_back(glm::uvec3(1,2,5));
                indx.push_back(glm::uvec3(5,6,2));


        indx.push_back(glm::uvec3(0,3,4));
                indx.push_back(glm::uvec3(4,7,3));


        indx.push_back(glm::uvec3(2,3,7));
                indx.push_back(glm::uvec3(7,6,2));


        //vao
                glGenVertexArrays(1, &mesh_vao);
                glBindVertexArray(mesh_vao);

                //vbo
                glGenBuffers(1, &mesh_vbo);
                glBindBuffer(GL_ARRAY_BUFFER, mesh_vbo);
                glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertexFormat) * verts.size(), &verts[0], GL_STATIC_DRAW);

                //ibo
                glGenBuffers(1, &mesh_ibo);
                glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh_ibo);
                glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * indx.size() * 3, &indx[0], GL_STATIC_DRAW);

                int pipe = glGetAttribLocation(_glProgramShader, "in_position");
                glEnableVertexAttribArray(pipe);
                glVertexAttribPointer(pipe, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertexFormat), (void*)0);

                pipe = glGetAttribLocation(_glProgramShader, "in_color");
                glEnableVertexAttribArray(pipe);
                glVertexAttribPointer(pipe, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertexFormat), (void*)sizeof(glm::vec3));
                mesh_num_indices = indx.size() * 3;
    }

Чтобы повернуть куб, я использую:

cube->translate_to_position();
cube->rotateY(angle);
cube->translate_to_origin();
  • 0
    Я не изучил все это, но операторы, используемые в translate_to_origin() выглядят противоречивыми. Почему вы используете - для х, но + для у и г?
  • 0
    Извините .. это была просто ошибка редактирования. Я редактировал пост
Показать ещё 2 комментария
Теги:
opengl
matrix
rotation
glm-math

1 ответ

0

Я решил проблему! Я не правильно строил куб. Правильный путь

            verts.push_back(MyVertexFormat(x,   y,  z,  1,0,0));
            verts.push_back(MyVertexFormat(x + n,   y,  z,  1,0,0));
            verts.push_back(MyVertexFormat(x + n,   y,  z + n,  0,1,0));
            verts.push_back(MyVertexFormat(x,   y,  z + n,  0,0,1));

            verts.push_back(MyVertexFormat(x,   y + n,  z,  1,0,0));
            verts.push_back(MyVertexFormat(x + n,   y + n,  z,  1,0,0));
            verts.push_back(MyVertexFormat(x + n,   y + n,  z + n,  1,0,1));
            verts.push_back(MyVertexFormat(x,   y + n,  z + n,  1,1,1));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню