在Nvidia PhysX中创建网格的问题

时间:2018-03-14 01:55:25

标签: c++ opengl 3d physx

我构建了一个快速python脚本,它读取wavefront .obj文件并将verticies和faces输出到文件。 我有另一个C ++函数,它读取这些文件并根据这些文件创建一个网格。

我遇到的问题是,这种情况有时会完美,而其他时间则不是很多 - 使用相同的网格。 例如。我启动我的PhysX程序,网格显示如下;
perfect model

这是一个完美的案例。网格中根本没有错误。

然而,如果我关闭程序并回到它,它可以再次看起来很完美,或者这次看起来像这样;
terrible model 这更像是一个最糟糕的情况,有时候只有几张脸被搞砸了。

最让我困惑的是它是多么随机。即使代码中没有任何变化,它也可能完全陷入困境。这让我相信这是某种内存或文件访问问题?

以下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

1 个答案:

答案 0 :(得分:0)

你的文件阅读代码是......很奇怪。 并且破碎了!我强烈怀疑你在那里的某个地方有一些越界限制。你在那里的两个地方做new char[2](并且它们不平衡,最后delete[]只会释放在循环的最后一次迭代中完成的分配),然后cin >>进入固定大小的数组,没有边界检查。我很确定,这就是问题的来源。

另外,为什么首先创建三个单独的向量x,y,z,然后将它们压缩到PxVec3的向量中。只需读入三个变量并直接推入该大型矢量。

还有一个 BIG 红旗:.clear()在函数开头调用。在那里创建新的临时向量,您可以在其中准备数据。完成后,使用move semantics替换类实例成员向量的内容。