【问题标题】:Model transformations模型转换
【发布时间】:2014-12-30 04:06:30
【问题描述】:

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

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

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(..) 记录我的模型的位置,然后只要程序正在运行,最终根据需要更新模型.

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

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    模型/世界变换特定于场景中的每个网格/模型。就像你提到的,要独立地转换每个模型,每个模型都有一个矩阵是合适的。

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

    【讨论】:

    • 谢谢;如果我想获得模型的位置、旋转和比例。我应该从模型矩阵的各个元素中创建一个向量吗?例如比例矩阵的对角线。或者,我应该简单地返回模型矩阵并让用户自己弄清楚吗?
    • 我猜这取决于您的需要。您可以使用RotateModelScaleModelTranslateModel 之类的方法,它们采用向量,从向量中创建一个矩阵并将其与当前存储的模型矩阵相乘。您还可以只存储三个向量用于位置、缩放和旋转,并在方法 GetModelMatrix 中创建模型矩阵。
    • 谢谢两位;现在我开始明白了!
    • 模型/世界矩阵从模型空间映射到世界空间,即 Mm->w。因此,它是第 4 列(如果您使用行向量,则为行)将给出模型在世界空间方面的位置。同样,上面的 3x3 矩阵的列将给出模型的方向 w.r.t 世界的基础;对于比例,您可以使用上面的 3x3 对角线。如果您觉得客户/用户不需要知道这些信息,那么单独、明确地提供它们会更有意义。
    • @legends2K:如果矩阵中不存在旋转,则上部 3x3 对角线仅包含完整缩放信息。想想例如矩阵 M = scale(2,2,2) * rotateX(90°)。在这种情况下,对角线包含 [2,0,0],这显然不是所需的缩放比例。在一般情况下,变换矩阵的缩放由上层 3x3 矩阵的三个行向量的长度给出。
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 2020-03-26
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 2017-02-08
    相关资源
    最近更新 更多