Ale*_*ite 0 opengl animation assimp
我最近发现有一个名为"Assimp"的库用于导入可以在c ++ opengl中渲染动画的模型,现在我试着弄清楚我要做什么,以便加载纹理模型并绘制它...
1)建议从Blender导出动画的格式是什么?
2)我已经有了一个基本的网格类,绘制了一个模型.我需要修改什么来支持动画?
我的数据结构:
struct ObjectData {
vector <glm::vec3> vertices, normals, colors;
vector <glm::vec2> texCoords;
vector <GLuint> vIndices, uIndices, nIndices;
vector <Material*> materials;
glm::vec3 size, center;
};
Run Code Online (Sandbox Code Playgroud)
我的网格VBO和绘制:
void Mesh::draw() {
if (initialized) {
shader->enable(true);
if (texture != NULL) {
texture->enable(true);
}
//Tell OpenGL which array to use
glBindVertexArray(arrayObject);
glDrawElements(renderMode, object->vIndices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(NULL);
shader->enable(false);
if (texture != NULL) {
texture->enable(false);
}
}
}
void Mesh::updateVBO() {
if (!initialized) {
glGenVertexArrays(1, &arrayObject);
}
//Tell OpenGL which vertex array to use from now
glBindVertexArray(arrayObject);
if (!initialized) {
glGenBuffers(VBO_COUNT, buffers);
initialized = true;
}
//Set buffer data
glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_VERTEX]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * object->vertices.size(), &object->vertices.front(), GL_STATIC_DRAW);
//Set shader attribute data
glEnableVertexAttribArray(VBO_VERTEX);
glVertexAttribPointer(VBO_VERTEX, 3, GL_FLOAT, GL_FALSE, NULL, NULL);
if (object->colors.size()) {
//Set buffer data
glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_COLOR]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * object->colors.size(), &object->colors.front(), GL_STATIC_DRAW);
//Set shader attribute data
glEnableVertexAttribArray(VBO_COLOR);
glVertexAttribPointer(VBO_COLOR, 3, GL_FLOAT, GL_FALSE, NULL, NULL);
}
if (object->texCoords.size()) {
//Set buffer data
glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_TEXCORD]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec2) * object->texCoords.size(), &object->texCoords.front(), GL_STATIC_DRAW);
//Set shader attribute data
glEnableVertexAttribArray(VBO_TEXCORD);
glVertexAttribPointer(VBO_TEXCORD, 2, GL_FLOAT, GL_FALSE, NULL, NULL);
}
if (object->normals.size()) {
//Set buffer data
glBindBuffer(GL_ARRAY_BUFFER, buffers[VBO_NORMAL]);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * object->normals.size(), &object->normals.front(), GL_STATIC_DRAW);
//Set shader attribute data
glEnableVertexAttribArray(VBO_NORMAL);
glVertexAttribPointer(VBO_NORMAL, 3, GL_FLOAT, GL_FALSE, NULL, NULL);
}
//Set buffer data
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[VBO_INDEX]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * object->vIndices.size(), &object->vIndices.front(), GL_STATIC_DRAW);
//Unbind vertex array
glBindVertexArray(NULL);
}
Run Code Online (Sandbox Code Playgroud)
"开放资产导入库"具有模型查看器,您可以在其中使用所有受欢迎的支持格式(包括动画)预览模型.我建议将你的动画导出为各种格式,看看是否有任何格式给你错误的结果(即渲染工件)并结束你自己的芒果.就个人而言,尽管我使用的是3ds Max,但我在Collada(.dae)上取得了最大的成功.
支持动画本身(可假设的骨架):在关键帧之间插入动画数据(aiNodeAnim); 你需要从插值的动画数据中计算骨矩阵(从位置/旋转等创建一个矩阵); 通过用影响它们的骨骼矩阵变换'顶点'(aiMesh/aiBone)来计算'动画'顶点; 对所有"动画顶点"进行加权并将它们加在一起; 渲染新顶点.这是动画的基本高级概述.
有一些教程和书籍可以深入到这个主题.例如ogldev的教程38,Jason Gregory的Game Engine Architechture有专门的动画章节.您可以查看assimps模型查看器的源代码.