4

すべての三角形をループして、それぞれを btTriangleMesh に追加しようとしています。(ローディングだけが速くなければならず、保存速度は無視できます。)

ファイルから衝突データをロードする最速の方法は何ですか。次の 2 つはどうでしょうか。

  1. Vertex(bt3Vector) & Index(DWORD) 配列を保存し、読み込み時に btTriangleMesh のサイズを変更して、データを一度に設定します。

  2. readBulletSample のようなものを保存およびロードするために serializeSingleShape() を使用します (または、新しい btDynamicsWorld を初期化し、BulletWorldImporter でファイルを読み取り、衝突オブジェクトを取得し、btDynamicsWorld 変数をクリーンアップします)。

他に方法があれば教えてください。モデル ジオメトリには、次の 2 つのバッファーがあります。

Vertex = vector<float[3]>
Index = vector<DWORD>
4

2 に答える 2

4

bullet のシリアル化コードを使用しました。すでに最適化されていると思いますが、再発明する必要がある理由はわかりません。

bt_col- 弾丸衝突オブジェクト

    int maxSerializeBufferSize = 1024*1024*5;
    btDefaultSerializer*    serializer = new btDefaultSerializer(maxSerializeBufferSize);

    serializer->startSerialization();
    bt_col->serializeSingleShape(serializer);
    serializer->finishSerialization();

    FILE* file = fopen(filename, "wb");
    fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1, file);
    fclose(file);

    delete serializer;
于 2012-09-01T23:35:26.643 に答える
2

もし私があなたなら、私は次のことをします:

  • 衝突ファイルが本当に大きい場合は、必要なものが得られるまでブロック単位で読み取ります。
  • 新規化/削除時のヒープの断片化を回避するために、メモリプールを使用してブロックを格納します。
  • 次に、実際の衝突テストに進みます。

データを保存しようとしている場合は、構造体として保存できます。

struct Triangle
{
  float vertices[9]; // 3x3
  int index;
};

構造体が同じサイズでない場合は、もう少し複雑になります。

struct Triangle
{
  int prevOffset; // Offset to the beginning of the previous struct in bytes .. ie. 20 bytes
  int nextOffset; // Offset at the beginning of the next struct
  std::vector<float[3]> Vertices;
  int index;
};

読む:

int offset = 0;
char* m_Data; // Pointer to the contents of the file
Triangle *getTriangle(){

   Triangle* tri = (Triangle*)( m_Data+offset );
   offset = tri->Next;
   return tri;

}

オフセットを保存しながら、構造体をバイトとして書き込みます。

    // Writing the pool
    tri->next = ( (int)tri-(int)m_Data )+tri->Vertices.size()*4+16;
    // For a 32bit system 
    // +12 for the ints (next/prev/id)
    // *4 for the floats

これはまさに、メモリプールがチャンクヘッダーをリンクする方法です。前の項目と次の項目へのポインタを使用して、両方の方法を繰り返すことができます。

于 2012-09-01T12:47:03.350 に答える