代码之家  ›  专栏  ›  技术社区  ›  codeNoob

从视图矩阵中清除比例组件。相机独立缩放

  •  1
  • codeNoob  · 技术社区  · 7 年前

    1. 计算gizmo到相机的距离,制作一个用于缩放的矩阵,在循环中乘以所有点:

      glm::mat4 scaleMat;
      scaleMat= glm::scale(scaleMat, glm::vec3(glm::distance(cameraPos,gizmoPos)));
      
      for (int i = 0; i < vertices.size(); i++)
      {
          vertices[i] = glm::vec3(scaleMat * glm::vec4(vertices[i], 1.0));
      }
      
    2. 仅为gizmo清除视图(注视)矩阵的比例分量。

    1 回复  |  直到 7 年前
        1
  •  2
  •   magicleon94    7 年前

    如果您希望每次对同一个模型应用不同的缩放,则不应操纵顶点(实际上,您永远不应该这样做),而应操纵模型矩阵。通过它,您可以在不通过代码处理顶点的情况下操作对象。 我会这样说:

    glm::mat4 modelMatrix(1.0f);
    modelMatrix = glm::scale(modelMatrix,glm::vec3(glm::distance(cameraPos,gizmoPos)));
    

    这将为您提供缩放模型视图矩阵。现在只需将其传递给顶点着色器。

    大致来说,你应该有这样的东西:

    #version 330 core
    
    // Input vertex data, different for all executions of this shader.
    layout(location = 0) in vec3 vertexPosition_modelspace;
    
    uniform mat4 M;
    
    void main(){
        gl_Position =  M * vec4(vertexPosition_modelspace,1);
    }
    

    我没有测试代码,但它确实与我的一个项目的代码相似。在那里,我保留了我的模型矩阵,以便累积缩放,但如果每次都向顶点着色器传递一个全新的矩阵,则不会记住任何内容。

    here at my current project's code .

    你可以在里面找到缩放 TARDIS::applyScaling main.cpp