Я работаю с этим 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. Попытка изменения дальнего и ближнего значений матрицы представления, все тот же результат.