模型转换
Model transformations
我已成功加载一个模型,但现在我想转换它。可以说,我知道转换是如何工作的,以及我可以通过向量和矩阵进行的各种转换,并简单地将它们应用于模型矩阵,然后通过统一变量传递给顶点着色器。但这是我的问题:
我的模型是一个类,我还有一个场景类,其中加载了模型,并且是所有图形内容汇集在一起的地方。如果我在模型中有一个模型矩阵作为私有变量,那么:
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,长话短说,只是将模型的所有网格固定在一起,另一个类逐个加载网格。
模型/世界变换特定于场景中的每个网格/模型。就像你提到的,要独立转换每个模型,为每个模型提供一个矩阵是恰当的。
至于顶点着色器,您可以将投影视图矩阵统一,模型矩阵统一,并将网格的顶点转换为剪辑空间。然后对于下一个模型,只需将该网格的矩阵均匀地更改模型矩阵并重复即可。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- 转换 tfjs 模型以在 c++ 中的 Tensorflow 中使用
- 是否有一种方法可以将QTableView模型转换为QstandardItemModel
- 将 STL 模型转换为 OSG 格式
- 从角度转换为正交保持相同的模型和缩放的视图大小
- Qt:模型/视图框架上的数据转换
- 不同模型的转换不起作用
- 模型转换
- 将 GL 模型视图矩阵转换为世界坐标
- C++对象模型转换
- 如何在3D模型格式之间进行转换?(Collada *.到ACIS *.例如Sat)
- 如何在simp中将OBJMTL模型转换为导出类型
- 如何将下面的线程模型从c++转换为go
- 我如何把一个三维数组转换成一个模型
- Qt模型/视图委托:如何简单地转换文本数据
- 现代OpenGL投影视图模型转换不起作用
- 在c++中将Outlook对象模型MailItemPtr转换为MAPI IMessage
- OpenSceneGraph:从 3D 模型转换"objects"