我在返回这个 const 指针时遇到了问题。使用调试器向我展示了场景已正确导入并存储在可变场景中。返回scene后,scene指向的内容丢失,调用loadData()的类无法访问。
const aiScene* IOHandler::loadData(const std::string& pFile){
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(pFile,
aiProcess_CalcTangentSpace |
aiProcess_Triangulate |
aiProcess_JoinIdenticalVertices |
aiProcess_SortByPType);
return scene;
}
Run Code Online (Sandbox Code Playgroud)
(Importer并且aiScene(struct)是assimp库的一部分,不能修改)
我假设场景存储在堆栈中,返回调用重置堆栈指针并且内容丢失。如何在c++中处理这样的问题?
我们有一个给定的3D网格,我们试图消除相同的顶点.为此我们使用一个自定义的结构,包含顶点的坐标和相应的法线.
struct vertice
{
float p1,p2,p3,n1,n2,n3;
bool operator == (const vertice& vert) const
{
return (p1 == vert.p1 && p2 == vert.p2 && p3 == vert.p3);
}
};
Run Code Online (Sandbox Code Playgroud)
在用数据填充顶点之后,将其添加到unordered_set以删除重复项.
struct hashVertice
{
size_t operator () (const vertice& vert) const
{
return(7*vert.p1 + 13*vert.p2 + 11*vert.p3);
}
};
std::unordered_set<vertice,hashVertice> verticesSet;
vertice vert;
while(i<(scene->mMeshes[0]->mNumVertices)){
vert.p1 = (float)scene->mMeshes[0]->mVertices[i].x;
vert.p2 = (float)scene->mMeshes[0]->mVertices[i].y;
vert.p3 = (float)scene->mMeshes[0]->mVertices[i].z;
vert.n1 = (float)scene->mMeshes[0]->mNormals[i].x;
vert.n2 = (float)scene->mMeshes[0]->mNormals[i].y;
vert.n3 = (float)scene->mMeshes[0]->mNormals[i].z;
verticesSet.insert(vert);
i = i+1;
}
Run Code Online (Sandbox Code Playgroud)
我们发现它对于像3.000.000顶点这样的数据量来说太慢了.即使运行15分钟后程序也没有完成.是否存在我们没有看到的瓶颈,或者是否有更好的数据结构用于此类任务?