1

だから私はファイル(頂点、ベクトル法線、頂点テクスチャ座標と面(v/vt/vn v/vt/vn v/vt/vn)など)を読み込む小さなコードをC ++で書き込もうとしています)そして、私は少し自分自身を失いました。

最初は小さく始め、頂点、色、面のみを含む立方体のみを読み込んでいましたが、今では面が異なる方法で記述されている (vect normalasl が存在しない前に) はるかに高いポリゴン モデル (126 面) を手に入れました。または vert テクスチャ) したがって、構造体内の構造体は、この情報を保存するための良い方法であると考えました。

inFile >> NUM_POLY;
indices = new polygon[NUM_POLY];
for (int i=0; i < NUM_POLY; i++)
{   
inFile >> indices[i].a;
inFile >> indices[i].b;
inFile >> indices[i].c;
}

それが現在、古いシステムの私のコードですが、構造を次のように変更しました...

struct vertA {
int v;
int vt;
int vn;
};

struct vertB {
int v;
int vt;
int vn;
};

struct vertC {
int v;
int vt;
int vn;
};

struct polygon {
struct vertA;
struct vertB;
struct vertC;
};

だから私を混乱させたのは、最初の 3 つの整数を vertA 構造体に格納し、次の 3 つを vertB に格納し、次に vertC を格納して、ファイルの終わりまで再びループバックする方法です...

誰かがそれを助けることができれば、それは素晴らしいことです!

4

2 に答える 2

1

これは間違っています

struct polygon {
struct vertA;
struct vertB;
struct vertC;
};

私はあなたが意味したと思います

struct polygon {
    vertA va;
    vertB vb;
    vertC vc;
};

次に、それは非常に簡単です(私があなたを正しく理解していると仮定して)

for (int i=0; i < NUM_POLY; i++)
{   
    inFile >> indices[i].va.v;
    inFile >> indices[i].va.vt;
    inFile >> indices[i].va.vn;
    inFile >> indices[i].vb.v;
    inFile >> indices[i].vb.vt;
    inFile >> indices[i].vb.vn;
    inFile >> indices[i].vc.v;
    inFile >> indices[i].vc.vt;
    inFile >> indices[i].vc.vn;
}

あなたのコードの興味深い点の 1 つは、struct vertAandstruct vertBstruct vertCがすべて同一であることです。したがって、3 つの異なる構造体は必要ないかもしれません。

于 2013-04-15T18:58:16.010 に答える
0

問題を正しく理解しているかどうかはわかりませんが(必要に応じて修正してください)、次のようなものが必要なようです:

struct vertex
{
    int v;
    int vt;
    int vn;
}

struct polygon
{
    struct vertex a;
    struct vertex b;
    struct vertex c;
}

次に、元の例を言い換えて初期化します。

inFile >> NUM_POLY;
indices = new polygon[NUM_POLY];
for (int i = 0; i < NUM_POLY; i++)
{   
    inFile >> indices[i].a.v;
    inFile >> indices[i].a.vt;
    inFile >> indices[i].a.vn;
    inFile >> indices[i].b.v;
    inFile >> indices[i].b.vt;
    inFile >> indices[i].b.vn;
    inFile >> indices[i].c.v;
    inFile >> indices[i].c.vt;
    inFile >> indices[i].c.vn;
}

3 つの個別の頂点構造ではなく配列を使用して、そのコードを少し短縮することもできます。

struct polygon
{
    struct vertex v[3];
}

そして、ループを使用して初期化します。

inFile >> NUM_POLY;
indices = new polygon[NUM_POLY];
for (int i = 0; i < NUM_POLY; i++)
{   
    for (int i = 0; j < 3; j++)
    {
        inFile >> indices[i].v[j].v;
        inFile >> indices[i].v[j].vt;
        inFile >> indices[i].v[j].vn;
    }
}
于 2013-04-15T18:58:32.023 に答える