Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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++ 从视图矩阵中清除比例构件。与相机无关的缩放_C++_Opengl_Matrix_Glm Math - Fatal编程技术网

C++ 从视图矩阵中清除比例构件。与相机无关的缩放

C++ 从视图矩阵中清除比例构件。与相机无关的缩放,c++,opengl,matrix,glm-math,C++,Opengl,Matrix,Glm Math,我需要我的小程序通过相机距离缩放gizmo,以便随时方便地移动对象。我想我有两个选择: 计算从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:

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

  • 计算从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));
    }
    
    glm::mat4 scaleMat;
    scaleMat=glm::scale(scaleMat,glm::vec3(glm::distance(cameraPos,gizmoPos));
    对于(int i=0;i
  • 仅清除gizmo的视图(注视)矩阵的比例组件


  • 如果使用第一种方式,则在更改相机位置时,我的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);
    }
    
    这将为您提供缩放模型视图矩阵。现在只需将其传递给顶点着色器

    大致上,你应该有这样的情况:

    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);
    }
    
    我没有测试过代码,但它与我的一个项目的代码非常相似。在那里,我保留了我的模型矩阵,以便累积缩放,但如果每次都将一个全新的矩阵传递给顶点着色器,则不会记住任何内容

    如果需要更多关于将均匀性传递给着色器的信息,请查看


    您可以在
    TARDIS::applyScaling
    中找到缩放,并在
    main.cpp

    中找到着色器加载。您是否计划每次对同一起始对象应用不同的缩放?以这种方式编辑顶点是非常困难的inefficient@magicleon是的,每次乘以矩阵就是导致这种奇怪行为的原因。我得到了它。但是如何实现第二种方法呢?在着色器上以统一的形式传递缩放矩阵时进行同样的缩放怎么样?@codeNoob我建议的第二种方法在下面的答案中@对不起,最后一个问题。您认为,在一个矩阵中存储对象(而不是gizmo)的变换或修改数据的最佳方式是什么?我问你们,因为我想使用鼠标选择器,我想为它存储实际数据。可能是在鼠标拾取时将修改后的矩阵精确相乘?您说服我使用第一种方法。:)但我们永远不知道如何从视图矩阵中清除比例组件。:)无论如何,谢谢你!这并不难,一旦你得到,我建议你尝试它的未来!也许这些教程可以带来一些清晰!对不起,最后一个问题。您认为,在一个矩阵中存储对象(而不是gizmo)的变换或修改数据的最佳方式是什么?我问你们,因为我想使用鼠标选择器,我想为它存储实际数据。可能是在鼠标拾取的瞬间将修改后的矩阵相乘?我想我还不明白你在问什么:(如果你想知道一种存储缩放状态的方法(在这种情况下),模型矩阵还允许你存储这种信息,保持原始顶点不变!