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

Clear a scale component from view matrix. Camera-independent scaling

我的小程序需要通过相机距离来缩放 Gizmo,以便随时方便地移动物体。我想我有两个选择:

  1. 计算gizmo到camera的距离,制作缩放矩阵,循环乘以所有点:

    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 的视图 (lookAt) 矩阵的比例组件。

如果我使用第一种方式,我的 Gizmo 缩放会在我更改相机位置时累积缩放并增加 Gizmo 的大小。我认为第二种方式更准确,但该怎么做呢?谢谢!

如果你想每次对同一个模型应用不同的缩放比例,你不应该操纵顶点(事实上你永远不应该这样做),而是模型矩阵。通过它,您可以在不通过代码处理顶点的情况下操纵对象。 我会选择这样的东西:

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

中找到着色器加载