模型转换

Model transformations

本文关键字:转换 模型      更新时间:2023-10-16

我已成功加载一个模型,但现在我想转换它。可以说,我知道转换是如何工作的,以及我可以通过向量和矩阵进行的各种转换,并简单地将它们应用于模型矩阵,然后通过统一变量传递给顶点着色器。但这是我的问题:

我的模型是一个类,

我还有一个场景类,其中加载了模型,并且是所有图形内容汇集在一起的地方。如果我在模型中有一个模型矩阵作为私有变量,那么:

class Model
{
public:
    Model();
    ~Model();
    // other functions here
    setPosition(vec3 pos);
    setRotation(vec3 axis, float angle);
    setScale(vec3 factor);
    // getters
    render(GLuint shaderProgram);
    update(GLuint shaderProgram);
private:
    mat4 pModelMatrix;
    vector<Mesh> pMeshes;
};
模型矩阵位于模型类中

是否明智;或者应该只有一个模型矩阵位于场景类中,然后通过统一传递到顶点着色器中。我对后者的唯一担忧是,如果我这样做,那么所有模型都将具有相同的转换。因此,如果我只想移动一个模型(玩家会有[是的,这是有或有争论!]),那么只将转换应用于该模型并因此应用于它所关注的模型矩阵是有意义的。但是,顶点着色器会怎么说呢?我对 OpenGL 仍然相当陌生,了解 OpenGL 如何处理多个渲染模型的转换的整个业务有点复杂;我知道它们的作用类似于前面描述的目的,但是是否可以将许多模型的许多模型矩阵传递给一个单一的均匀矩阵是很难实现的。

update() 函数所做的是获取 pModelMatrix 并使用 glUniform() 的东西将矩阵传递到顶点着色器中,然后与所有其他矩阵相乘,依此类推。我之所以将 glUniform() 的东西放入 update() 函数中,是因为当我的程序运行时,我希望通过 setPosition(..) 记录我的模型的位置,然后最终根据需要更新模型,只要程序正在运行。

矢量pMesh,长话短说,只是将模型的所有网格固定在一起,另一个类逐个加载网格。

模型/世界变换特定于场景中的每个网格/模型。就像你提到的,要独立转换每个模型,为每个模型提供一个矩阵是恰当的。

至于顶点

着色器,您可以将投影视图矩阵统一,模型矩阵统一,并将网格的顶点转换为剪辑空间。然后对于下一个模型,只需将该网格的矩阵均匀地更改模型矩阵并重复即可。