Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL转换不需要';t按预期在z轴上工作_C++_Opengl_Glsl_Coordinate Transformation - Fatal编程技术网

C++ OpenGL转换不需要';t按预期在z轴上工作

C++ OpenGL转换不需要';t按预期在z轴上工作,c++,opengl,glsl,coordinate-transformation,C++,Opengl,Glsl,Coordinate Transformation,我正在编写一个游戏引擎,在z轴上的翻译有问题。 当我在z轴上平移超过1个单位时,对象将显示。小于1的值对对象没有影响,因为它保持在相同的位置。 所有其他的转换似乎都很好 主回路的一部分: while (unprocessedTime > frameTime) { rendering = true; unprocessedTime -= frameTime; if (window.isClosed()) { stop(); } T

我正在编写一个游戏引擎,在z轴上的翻译有问题。 当我在z轴上平移超过1个单位时,对象将显示。小于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 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();
}
着色器设置统一方法:

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

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)之外的所有内容都不会绘制


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

您需要创建投影矩阵。这是一个很好的例子,这是一个关于如何构建一个的例子

基本上,投影矩阵将x和y除以z,使距离更远的对象看起来更小。它还缩放z,以便可以看到的最远距离(远剪裁平面)等效于-1,并且可以看到的最近距离等效于1。立方体(-1,-1,-1),(1,1,1)之外的所有内容都不会绘制


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

您要向哪个方向平移?改变标志,看看会发生什么。一个DIR指向相机(即,物体将在你后面),另一个指向相机之外。更糟的是,按照常规,正Z指向你,根据图纸类比,也有在左下角的起源,而大多数人现在似乎认为更大的Z值应该意味着更远,不在虚拟屏幕前面(即离你更近或在你后面)。是的,我认为这是因为DirectX和OpenGL有相反的约定。我尝试了机器人方向(负方向和正方向)相同的结果。你需要一个投影矩阵(正交或透视)。请看我答案中的链接。你翻译的是哪个方向?改变标志,看看会发生什么。一个DIR指向相机(即,物体将在你后面),另一个指向相机之外。更糟的是,按照常规,正Z指向你,根据图纸类比,也有在左下角的起源,而大多数人现在似乎认为更大的Z值应该意味着更远,不在虚拟屏幕前面(即离你更近或在你后面)。是的,我认为这是因为DirectX和OpenGL有相反的约定。我尝试了机器人方向(负方向和正方向)相同的结果。你需要一个投影矩阵(正交或透视)。请参阅我答案中的链接。
#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);
}