Изменение начальной точки объекта заставляет его двигаться по другой оси - PullRequest
1 голос
/ 20 марта 2019

Я работаю с этим GameObject (который использует Box2D) и классом Renderer2D уже некоторое время, и у меня не было никаких проблем. Это было до тех пор, пока я не решил добавить опцию для поворота объекта. Все отлично работает (или кажется, что это) с блоком 2D, но объект, видимый на экране, перемещается по неправильной оси, он становится меньше при движении вверх и больше при движении вниз (или ближе и дальше от камеры).

Единственные три строки, которые я добавил в скрипт Renderer2D, таковы:

    model = math::translate(model, iVec3(0.5f * size.x, 0.5f * size.y, 0.0f));
    model = math::rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));
    model = math::translate(model, iVec3(-0.5f * size.x, -0.5f * size.y, 0.0f));

Если я просто удаляю эти строки, все работает нормально, но я хочу, чтобы объект вращался, поэтому я не могу их удалить.

Это вся функция рендеринга:

void Renderer2D::Render(Texture & texture, iVec2 position, iVec2 size, float rotation, Color color, iVec2 tiling) {
    this->shader.Use();
    iMat4x4 model;

    model = math::translate(model, iVec3(position, 0.0f));

    model = math::translate(model, iVec3(0.5f * size.x, 0.5f * size.y, 0.0f));
    model = math::rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));
    model = math::translate(model, iVec3(-0.5f * size.x, -0.5f * size.y, 0.0f));

    model = math::scale(model, iVec3(size, 1.0f));

    this->shader.SetMatrix4("model2D", model);
    this->shader.SetVector3f("spriteColor", iVec3(color.r, color.g, color.b));
    this->shader.SetVector2f("tiling", tiling);

    glActiveTexture(GL_TEXTURE0);
    texture.Bind();

    glBindVertexArray(this->QuadVAO);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr);
    glBindVertexArray(0);
}

Я перемещаю GameObject с помощью переменной Velocity Box2D, например:

float horizontal, vertical;
        if (Input::GetKeyDown(Input::Key.A) || Input::GetKeyDown(Input::Key.D)) {
            if (Input::GetKeyDown(Input::Key.A))
                horizontal = -1;
            else if (Input::GetKeyDown(Input::Key.D))
                horizontal = +1;
        }
        else horizontal = 0;

        if (Input::GetKeyDown(Input::Key.W) || Input::GetKeyDown(Input::Key.S)) {
            if (Input::GetKeyDown(Input::Key.W))
                vertical = -1;
            else if (Input::GetKeyDown(Input::Key.S))
                vertical = +1;
        }
        else vertical = 0;

        Rigidbody2D->Velocity = iVec2(horizontal, vertical) * speed;

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

1 Ответ

0 голосов
/ 21 марта 2019

Решил основную проблему, после печати матрицы на консоли я понял, что четвертый столбец был заменен с xy 0 1 на 0 x 0 y.

Изменил код с этого:

model = math::translate(model, iVec3(0.5f * size.x, 0.5f * size.y, 0.0f));
model = math::rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));
model = math::translate(model, iVec3(-0.5f * size.x, -0.5f * size.y, 0.0f));

на это, и все готово!

iMat4x4 tempModel;
iMat4x4 tempModel2;


tempModel = math::translate(tempModel, iVec3(0.5f * size.x, 0.5f * size.y, 0.0f));
model[3].z = model[3].w = 0;
model[3] = model[3] + tempModel[3];

model = math::rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));

tempModel2 = math::translate(tempModel2, iVec3(-0.5f * size.x, -0.5f * size.y, 0.0f));
model[3].z = model[3].w = 0;
model[3] = model[3] + tempModel2[3];

Все еще не получил желаемое вращение, но, по крайней мере, другоефункции работают.

...