OpenGL Transformation не работает на оси Z, как ожидалось

Я пишу игровой движок и у меня проблемы с переводом по оси Z.
Когда я перевожу более 1 единицы по оси Z, объект исчезает. Значения меньше 1 не влияют на объект, он остается в той же позиции.
Все остальные преобразования работают нормально.

Часть основного цикла:

while (unprocessedTime > frameTime) {
rendering = true;

unprocessedTime -= frameTime;

if (window.isClosed()) {
stop();
}

Time::setDelta(frameTime);
game.update();

if (frameCounter >= Time::SECOND) {
std::cout << fps << std::endl;
fps = 0;
frameCounter = 0;
}

}

if (rendering) {
render();
fps++;
}

Метод визуализации:

void MainController::render() {
window.clear();
game.render();
window.update();
}

Методы обновления игры и рендеринга:

void Game::update() {
tmp += Time::getDelta();
float sinTemp = sin(tmp);
transform.setPos(glm::vec3(0, 0, sinTemp));
}

void Game::render() {
shader.bind();
shader.setUniform("transform", transform.getTransformation());
mesh.draw();
}

Shader setUniform метод:

void Shader::setUniform(std::string uniformName, glm::mat4 value) {
glUniformMatrix4fv(uniforms[uniformName], 1, GL_FALSE, &value[0][0]);
}

Преобразовать метод getTransformation:

inline glm::mat4 getTransformation() const {
glm::mat4 posMat = glm::translate(pos);
glm::mat4 rotXMat = glm::rotate(rot.x, glm::vec3(1, 0, 0));
glm::mat4 rotYMat = glm::rotate(rot.y, glm::vec3(0, 1, 0));
glm::mat4 rotZMat = glm::rotate(rot.z, glm::vec3(0, 0, 1));
glm::mat4 scaleMat = glm::scale(scale);

glm::mat4 rotMat = rotZMat * rotYMat * rotXMat;

return posMat * rotMat * scaleMat;
}

редактировать вершинный шейдер:

#version 330

layout (location = 0) in vec3 position;

out vec4 color;

uniform mat4 transform;

void main() {
color = vec4(clamp(position, 0.0, 1.0), 1.0);
gl_Position = transform * vec4(position, 1.0);
}

1

Решение

Вам необходимо создать матрицу проекции. Вот хороший объяснение о том, что это такое, и вот руководство о том, как его построить.

По сути, проекционная матрица делит x и y на z, поэтому объекты, расположенные дальше, кажутся меньше. Он также масштабирует z, так что самое дальнее расстояние, которое вы можете видеть (дальняя плоскость отсечения), равно -1, а самое близкое расстояние, которое вы видите, равно 1. Все, что находится за пределами куба (-1, -1, -1 ), (1, 1, 1) не рисуется.

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

4

Другие решения

Других решений пока нет …