2016-02-11 31 views
1

我在寫一個遊戲引擎,並且在z軸上翻譯時遇到了問題。 當我在z軸上翻譯多個單位時,對象消失。小於1的值對它保持在相同位置的對象沒有影響。 所有其他轉換似乎工作正常。OpenGL轉換不能像預期的那樣在z軸上工作

主循環的部分:

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++; 
} 

Render方法:

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); 
} 
+0

你正在翻譯哪個方向?改變標誌,看看會發生什麼。一個目標指向相機(即,物體將在你身後),另一個遠離相機。 –

+0

更糟糕的是,按照慣例,正z指向你,根據也在左下角出現的圖紙類比,而大多數人現在似乎認爲更大的z值應該意味着更遠,而不是在虛擬屏幕前面(即靠近你或在你後面)。 – Tommy

+0

是的,我認爲這是由於DirectX和OpenGL具有相反的習慣。 –

回答

4

你需要創建一個投影矩陣。這是一個很好的explanation它是什麼,這裏是一個tutorial關於如何構建一個。

基本上,投影矩陣將x和y除以z,使得更遠的物體看起來更小。它還縮放z,以便您可以看到的最遠距離(遠裁剪平面)等於-1,並且您可以看到的最近距離等於1.一維外部的所有東西(-1,-1,-1 ),(1,1,1)沒有繪製。

如果沒有投影矩陣,您的對象將無法正確顯示深度,並且需要一些看似隨機的比例以便在屏幕上可見。

+0

謝謝你,工作。 – Jhonny007

相關問題