2015-01-16 5 views
2

다음 코드를 사용하여 Assimp를 사용하여 .obj 파일을로드합니다. TextureCoordinates에서 뭔가 잘못되었습니다. aiVector3D 액세스하려고 시도하지만 임시 변수에 값을 저장하자마자 응용 프로그램이 충돌합니다.기존 aiVector3D에 대한 액세스 확인 오류

여기 내가 사용하는 코드입니다 :

Assimp::Importer importer; 

    const aiScene* scene = importer.ReadFile(filename, 
     aiProcess_CalcTangentSpace | 
     aiProcess_Triangulate | 
     aiProcess_JoinIdenticalVertices | 
     aiProcess_SortByPType); 

    if (!scene) 
    { 
     printf("[ASSIMP] "); 
     printf(importer.GetErrorString()); 
     printf("\n"); 
     return nullptr; 
    } 

    Mesh* newMesh = new Mesh(); 
    unsigned int vertexCount   = scene->mMeshes[0]->mNumVertices; 
    unsigned int triangleCount   = scene->mMeshes[0]->mNumFaces; 
    bool hasUv       = scene->mMeshes[0]->HasTextureCoords(0); 
    newMesh->vertexCount    = vertexCount; 
    newMesh->triangleCount    = triangleCount; 
    newMesh->m_Vertices     = new Vertex[vertexCount]; 
    newMesh->m_Triangles    = new Triangle[triangleCount]; 

    for (unsigned int i = 0; i < vertexCount; i++) { 
     aiVector3D vertexPosition  = scene->mMeshes[0]->mVertices[i]; 
     aiVector3D vertexNormal   = scene->mMeshes[0]->mNormals[i]; 
     newMesh->m_Vertices[i].pos  = glm::vec3(vertexPosition.x, vertexPosition.y, vertexPosition.z); 
     newMesh->m_Vertices[i].normal = glm::vec3(vertexNormal.x, vertexNormal.y, vertexNormal.z); 
     if (hasUv) { 
      aiVector3D uvCoordinates = scene->mMeshes[0]->mTextureCoords[i][0]; 
      printf("uvCoordinates: %f %f %f\n", uvCoordinates.x, uvCoordinates.y, uvCoordinates.z); 
      newMesh->m_Vertices[i].u = uvCoordinates.x; 
      newMesh->m_Vertices[i].v = uvCoordinates.y; 
     } 
    } 

    for (unsigned int i = 0; i < triangleCount; i++) { 
     aiFace face      = scene->mMeshes[0]->mFaces[i]; 
     for (int j = 0; j < 3; j++) { 
      Triangle* tri    = &newMesh->m_Triangles[i]; 
      tri->vertex[j]    = &newMesh->m_Vertices[face.mIndices[j]]; 
      if (tri->vertex[0]->normal.y == 1.0f || tri->vertex[0]->normal.y == -1.0f) { 
       tri->color    = glm::vec3(0.2f, 0.2f, 0.2f); 
      } 
      else 
      { 
       tri->color    = glm::vec3(1.0f, 0.0f, 0.0f); 
      } 
     } 
    } 

그것은 라인 printf("uvCoordinates: %f %f %f\n", uvCoordinates.x, uvCoordinates.y, uvCoordinates.z);에 충돌,하지만 난이 줄을 제거하면, 그것은 newMesh->m_Vertices[i].u = uvCoordinates.x;에서 충돌합니다. printf()을 주석으로 처리하면 정점의 uv을 모두 0.0f으로 설정하고 uvCoordinates을 전혀 사용하지 않으면 여전히 newMesh->m_Vertices[i].u = uvCoordinates.x; 행에서 충돌합니다. 내가 printf()의 주석 처리를 해제 한 채로두면 uvCoordinates의 값을 인쇄하지만 이후에는 액세스 위반이 발생합니다.

저는 솔직히 여기 아이디어가 없습니다. 여기에 내가 설명한 것을 보여주는 a screenshot이 있습니다.

답변

0

scene->mMeshes[0]->mTextureCoords[i][0];은의 첫 번째 텍스처 좌표입니다. 당신이 원했던 것은 텍스처 좌표의 첫 번째 세트를 얻는 것입니다 - 그래서 그것은이어야합니다 scene->mMeshes[0]->mTextureCoords[0][i];