Я пытаюсь повернуть кучу объектов по оси X.
Вот как я вычисляю преобразование объекта:
glm::mat4 GameObject::getTransform(float angle) {
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, position);
model = glm::rotate(model, angle, glm::vec3(1.0f, 0.0f, 0.0f));
model = glm::scale(model, scaleValue);
return model;
}
Я пытался поместить translate
, rotate
, scale
функционируют в другом порядке безрезультатно. Только странное поведение.
Вот как я перебираю объекты и рисую их:
for (auto row : objectRows) {
for (auto object : row) {
glm::mat4 model = object->getTransform(glfwGetTime());
glm::mat4 mvp = projection * view * model;
mainShader.setMat4("model", model);
mainShader.setMat4("mvp", mvp);
mainShader.setVec3("objectColour", object->colour);
object->mesh.draw(mainShader);
}
}
Вершинный шейдер:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aNormal;
out vec3 fragPos;
out vec3 normal;
uniform mat4 model;
uniform mat4 mvp;
void main()
{
fragPos = vec3(model * vec4(aPos, 1.0));
normal = mat3(transpose(inverse(model))) * aNormal;
gl_Position = mvp * vec4(fragPos, 1.0f);
}
И результат:
Как вы можете видеть, что объекты наверху вращаются только вокруг себя, и чем ниже другие объекты, тем больше они вращаются вокруг того, что я считаю точкой мирового происхождения?
Я прочитал много похожих постов, объясняющих порядок умножения матриц, но, похоже, ничего не помогает, и я не могу не думать, что это что-то глупо простое, что я пропускаю.