【问题标题】:Issues creating meshes in Nvidia PhysX在 Nvidia PhysX 中创建网格的问题
【发布时间】:2018-03-16 05:15:33
【问题描述】:

我构建了一个快速的 Python 脚本,它读取波前 .obj 文件并将顶点和面输出到文件。 我有另一个 C++ 函数,它读取这些文件并创建基于这些文件的网格。

我遇到的问题是,有时这可以完美运行,而其他时候则效果不佳 - 使用相同的网格。 例如。我启动我的 PhysX 程序,网格显示如下;

这是一个完美的情况。网格内完全没有错误。

但是,如果我关闭程序并返回它,它可以再次看起来完美,或者这次看起来像这样;
那更像是最坏的情况,有时只有几张脸被搞砸了。

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

以下 C++ 是加载顶点和三角形的代码:

//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

【问题讨论】:

    标签: c++ opengl 3d physx


    【解决方案1】:

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

    还有你为什么要先创建三个单独的向量 x,y,z,然后将它们压缩成一个 PxVec3 的向量。只需读入三个变量,然后直接推入那个大向量。

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

    【讨论】:

    • 具体来说,由于 fileNumber 数组不是以 nul 结尾的,所以它上面的 atoi 可以在分配空间的末尾获取额外的数字。
    • 感谢您的回复!除了删除 .clear() 之外,我已经实现了您要求的所有更改,我想看看其他解决方案是否会首先起作用。我已将更新后的代码上传到gist,这似乎不是您想象的数组问题。难道真的是我使用clear()的事实吗?
    • @davidpox: .clear() 可能不是这里的问题。但是它的使用表明了一种未经修饰的编程风格(即在没有强制要求的情况下引入有状态)。我会看看要点。
    • @datenwolf 好的,谢谢!不确定它是否有帮助,但以下gist 是引擎用来加载顶点和三角形数据以构建网格的内容。也许我的加载和他们的构造之间存在差异?
    • @davidpox:在TriangleMesh 类中,您绝对必须创建顶点数据的持久深层副本。 mesh_desc 结构将 pointers 指向数据;你只传递一个 const 引用,这本质上意味着你传入的任何向量都可能在运行 CookMes​​h 之前结束它的生命(从而使指针无效)。这绝对是一个错误。
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多