我构建了一个快速python脚本,它读取wavefront .obj文件并将verticies和faces输出到文件。 我有另一个C ++函数,它读取这些文件并根据这些文件创建一个网格。
我遇到的问题是,这种情况有时会完美,而其他时间则不是很多 - 使用相同的网格。
例如。我启动我的PhysX程序,网格显示如下;
这是一个完美的案例。网格中根本没有错误。
然而,如果我关闭程序并回到它,它可以再次看起来很完美,或者这次看起来像这样;
这更像是一个最糟糕的情况,有时候只有几张脸被搞砸了。
最让我困惑的是它是多么随机。即使代码中没有任何变化,它也可能完全陷入困境。这让我相信这是某种内存或文件访问问题?
以下C ++是加载verticies和三角形的代码:
//uses 3 vectors to store x,y,z then combines them at the end to make the full PxVec3
void ModelLoader::LoadVertex(std::string fileLocation)
{
//clears vector so it doesnt break when loading multiple models
vertexArray.clear();
std::ifstream file2;
file2.open(fileLocation);
if (!file2.is_open())
std::cout << "Failed to load vertex data" << std::endl;
//individual x,y,z values for the vertex arrays
std::vector<float> x;
std::vector<float> y;
std::vector<float> z;
int counter = 0;
//grabs each line add places them into a vector to be used later
while (!file2.eof())
{
if (counter == 3)
counter = 0;
std::string num;
file2 >> num;
switch (counter)
{
case 0:
x.push_back(stof(num)); //converts string to float
break;
case 1:
y.push_back(stof(num));
break;
case 2:
z.push_back(stof(num));
break;
default:
break;
}
counter++;
}
//adds x,y,z values to the vector to complete to full PxVec3
for (int i = 0; i < x.size(); i++)
vertexArray.push_back(PhysicsEngine::PxVec3(x[i], y[i], z[i]));
file2.close();
}
//uses a char array to grab all values within the filelocation selected
void ModelLoader::LoadTriangles(std::string fileLocation)
{
//clears vector so it doesnt break when loading multiple models
triangleArray.clear();
std::ifstream file;
file.open(fileLocation);
if (!file.is_open())
std::cout << "Failed to load triangle data" << std::endl;
//creates char array
char* fileNumber = new char[2];
int arrayCounter = 0;
while (!file.eof())
{
//grabs next char
char num;
file >> num;
//stops last char being repeated
if (file.eof())
break;
if (num != ',')
{
fileNumber[arrayCounter] = num;
arrayCounter++;
}
else
{
//converts the char array to an int
int fullNumber = atoi(fileNumber);
//adds number to triangles vector
//std::cout << fullNumber << std::endl;
triangleArray.push_back((PhysicsEngine::PxU32)fullNumber);
//resets array for next number
fileNumber = new char[2];
arrayCounter = 0;
}
}
//adds the last number to the vector
int fullNumber = atoi(fileNumber);
triangleArray.push_back((PhysicsEngine::PxU32)fullNumber);
delete[] fileNumber;
file.close();
}
编辑:对于任何新用户,此问题的代码已更新,可在此处找到:Gist
答案 0 :(得分:0)
你的文件阅读代码是......很奇怪。 并且破碎了!我强烈怀疑你在那里的某个地方有一些越界限制。你在那里的两个地方做new char[2]
(并且它们不平衡,最后delete[]
只会释放在循环的最后一次迭代中完成的分配),然后cin >>
进入固定大小的数组,没有边界检查。我很确定,这就是问题的来源。
另外,为什么首先创建三个单独的向量x,y,z,然后将它们压缩到PxVec3
的向量中。只需读入三个变量并直接推入该大型矢量。
还有一个 BIG 红旗:.clear()
在函数开头调用。在那里创建新的临时向量,您可以在其中准备数据。完成后,使用move semantics替换类实例成员向量的内容。