Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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++ Assimp&x2B;OpenGL仅部分加载_C++_Opengl_Glm Math_Assimp - Fatal编程技术网

C++ Assimp&x2B;OpenGL仅部分加载

C++ Assimp&x2B;OpenGL仅部分加载,c++,opengl,glm-math,assimp,C++,Opengl,Glm Math,Assimp,我想画一个铁人模型的线框。但有些部分缺失,我觉得还有额外的边缘被画出来。我哪里出错了 std::vector<glm::vec3> vertices; std::vector<GLuint> indices; for(unsigned int num_meshes=0; num_meshes<scene->mNumMeshes; num_meshes++) { // lets store all the vertices. for(unsig

我想画一个铁人模型的线框。但有些部分缺失,我觉得还有额外的边缘被画出来。我哪里出错了

std::vector<glm::vec3> vertices;
std::vector<GLuint> indices; 
for(unsigned int num_meshes=0; num_meshes<scene->mNumMeshes; num_meshes++)
{
    // lets store all the vertices.
    for(unsigned int num_vertices_per_mesh=0; num_vertices_per_mesh<scene->mMeshes[num_meshes]->mNumVertices; num_vertices_per_mesh++)
    {
        glm::vec3 vertex(scene->mMeshes[num_meshes]->mVertices[num_vertices_per_mesh].x, scene->mMeshes[num_meshes]->mVertices[num_vertices_per_mesh].y, scene->mMeshes[num_meshes]->mVertices[num_vertices_per_mesh].z);
        vertices.push_back(vertex);
    }
    // lets store all the indices or faces.
    for(unsigned int num_faces=0; num_faces<scene->mMeshes[num_meshes]->mNumFaces; num_faces++){
        indices.push_back(scene->mMeshes[num_meshes]->mFaces[num_faces].mIndices[0]);
        indices.push_back(scene->mMeshes[num_meshes]->mFaces[num_faces].mIndices[1]);
        indices.push_back(scene->mMeshes[num_meshes]->mFaces[num_faces].mIndices[2]); 
    }
}

GLfloat *vertices_array = &vertices[0].x;
GLuint size_of_vertices_array = vertices.size() * 3 * sizeof(GLfloat); // vertices data size * x,y,z values per vertex * sizeof(GLfloat)

GLuint *indices_array = indices.data();
GLuint size_of_indices_array = indices.size()*sizeof(GLuint);
// ===========================================================================================
GLuint VBO, VAO, EBO;
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &VBO);
glGenBuffers(1, &EBO);

glBindVertexArray(VAO); // Bind vertex array objects first before VBOs
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, size_of_vertices_array, vertices_array, GL_STATIC_DRAW);

// attribute 0 vertex positions
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GL_FLOAT), (GLvoid*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size_of_indices_array, indices_array, GL_STATIC_DRAW);

glBindVertexArray(0);               // unbinding VAO

/****** other lines of code ***********/
main_loop()
{
    /***** other lines of code *********/
    glBindVertexArray(VAO);
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
std::向量顶点;
std::向量指数;
对于(无符号整数num\u meshes=0;num\u meshesmNumMeshes;num\u meshes++)
{
//让我们存储所有顶点。
对于(无符号整数num\u顶点数/u网格数=0;num\u顶点数/u网格数[num\u网格]->mNumVertices;num\u顶点数/u网格数++)
{
glm::vec3顶点(场景->mMeshes[num\u网格]->mVertices[num\u顶点每网格].x,场景->mMeshes[num\u网格]->mVertices[num\u顶点每网格].y,场景->mMeshes[num\u网格]->mVertices[num\u顶点每网格].z);
顶点。向后推(顶点);
}
//让我们存储所有索引或面。
对于(无符号整数num\u faces=0;num\u facesMeshes[num\u meshes]->mNumFaces;num\u faces++){
index.push_back(场景->mMeshes[num_meshes]->mFaces[num_faces].mIndices[0]);
index.push_back(场景->mMeshes[num_meshes]->mFaces[num_faces].mIndices[1]);
index.push_back(场景->mMeshes[num_meshes]->mFaces[num_faces].mIndices[2]);
}
}
GLfloat*顶点\u数组=&顶点[0].x;
GLuint size_of_vertices_array=顶点。size()*3*sizeof(GLfloat);//顶点数据大小*x,y,z每个顶点的值*sizeof(GLfloat)
GLuint*index_数组=index.data();
GLuint size_of_index_数组=index.size()*sizeof(GLuint);
// ===========================================================================================
GLuint VBO、VAO、EBO;
glGenVertexArrays(1和VAO);
glGenBuffers(1,&VBO);
glGenBuffers(1和EBO);
glBindVertexArray(VAO);//在VBOs之前先绑定顶点数组对象
glBindBuffer(GL_数组_BUFFER,VBO);
glBufferData(GL_数组_缓冲区、顶点大小_数组、顶点数组、GL_静态图);
//属性0顶点位置
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(GL_FLOAT),(GLvoid*)0);
GlenableVertexAttributeArray(0);
glBindBuffer(GLU元素数组缓冲区,EBO);
glBufferData(GL元素\数组\缓冲区、大小\索引\数组、索引\数组、GL \静态\绘图);
glBindVertexArray(0);//解绑VAO
/******其他代码行***********/
主循环()
{
/*****其他代码行*********/
glBindVertexArray(VAO);
glPolygonMode(GLU前、后、GLU线);
glpaurements(GL_三角形,index.size(),GL_UNSIGNED_INT,0);
我得到的图片如下。在搅拌机上的模型加载完美。


我哪里出错了?我能够完美地加载只有一个网格的对象!

正如Rabbi76之前所说:当所有顶点都存储在一个顶点缓冲区中时,您需要重新编号索引。只需将当前索引增加顶点数的偏移量即可:

unsigned int offet = 0;
for(unsigned int num_meshes=0; num_meshes<scene->mNumMeshes; num_meshes++)
{
    // lets store all the vertices.
    for(unsigned int num_vertices_per_mesh=0; num_vertices_per_mesh<scene->mMeshes[num_meshes]->mNumVertices; num_vertices_per_mesh++)
    {
        glm::vec3 vertex(scene->mMeshes[num_meshes]->mVertices[num_vertices_per_mesh].x, scene->mMeshes[num_meshes]->mVertices[num_vertices_per_mesh].y, scene->mMeshes[num_meshes]->mVertices[num_vertices_per_mesh].z);
        vertices.push_back(vertex);
    }
    // lets store all the indices or faces.
    for(unsigned int num_faces=0; num_faces<scene->mMeshes[num_meshes]->mNumFaces; num_faces++){
        indices.push_back(scene->mMeshes[num_meshes]->mFaces[num_faces].mIndices[0]+offet );
        indices.push_back(scene->mMeshes[num_meshes]->mFaces[num_faces].mIndices[1]+offset);
        indices.push_back(scene->mMeshes[num_meshes]->mFaces[num_faces].mIndices[2]+offset); 
    }
    offset += num_vertices_per_mesh;
}
无符号整数offet=0;
对于(无符号整数num\u meshes=0;num\u meshesmNumMeshes;num\u meshes++)
{
//让我们存储所有顶点。
对于(无符号整数num\u顶点数/u网格数=0;num\u顶点数/u网格数[num\u网格]->mNumVertices;num\u顶点数/u网格数++)
{
glm::vec3顶点(场景->mMeshes[num\u网格]->mVertices[num\u顶点每网格].x,场景->mMeshes[num\u网格]->mVertices[num\u顶点每网格].y,场景->mMeshes[num\u网格]->mVertices[num\u顶点每网格].z);
顶点。向后推(顶点);
}
//让我们存储所有索引或面。
对于(无符号整数num\u faces=0;num\u facesMeshes[num\u meshes]->mNumFaces;num\u faces++){
index.push_back(场景->mMeshes[num_meshes]->mFaces[num_faces].mIndices[0]+offet);
index.push_back(场景->mMeshes[num_meshes]->mFaces[num_faces].mIndices[1]+偏移);
index.push_back(场景->mMeshes[num_meshes]->mFaces[num_faces].mIndices[2]+偏移);
}
偏移+=每个网格的顶点数;
}

每个网格的索引可能从0开始。但是如果将所有网格的所有顶点添加到同一个容器中(
std::vector
),然后第二个网格的顶点在第一个网格的顶点之后开始,依此类推。必须向索引添加开始偏移量。开始偏移量为
size\u t offset=texts.size()
在外部
for
循环的开始处。注意,这只是一个猜测,因为我不知道索引。是的,我检查了。每个网格的索引从0开始。我完全错过了。非常感谢。你应该使用节点树(场景->mRoot)对于ASIMP场景,因为其中可能有实例化网格及其自身的实例相对世界矩阵。