繁体   English   中英

OpenGL转换无法按预期在z轴上运行

[英]OpenGL Transformation doesn't work on z-axis as expected

我正在编写一个游戏引擎,在z轴上的平移遇到麻烦。 当我在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();
}

着色器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);
}

您需要创建一个投影矩阵。 这是一个很好的解释 ,这是一个有关如何构造它的教程

基本上,投影矩阵将x和y除以z,以便距离较远的对象显得更小。 它还缩放z,以便您可以看到的最远距离(最远的裁剪平面)等于-1,而您可以看到的最接近距离等价于1。立方体之外的所有东西(-1,-1,-1 ),(1,1,1)未绘制。

没有投影矩阵,您的对象将无法正确显示深度,并且需要一些看似随机的比例才能在屏幕上可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM