다음 코드를 사용하여 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()
을 주석으로 처리하면 정점의 u
과 v
을 모두 0.0f
으로 설정하고 uvCoordinates
을 전혀 사용하지 않으면 여전히 newMesh->m_Vertices[i].u = uvCoordinates.x;
행에서 충돌합니다. 내가 printf()
의 주석 처리를 해제 한 채로두면 uvCoordinates
의 값을 인쇄하지만 이후에는 액세스 위반이 발생합니다.
저는 솔직히 여기 아이디어가 없습니다. 여기에 내가 설명한 것을 보여주는 a screenshot이 있습니다.