2

ASSIMPを使用してWavefront objモデルを読み込もうとしています。ただし、mtl マテリアルの色が機能しません。ロード方法は知っていますが、各頂点に対応する色を取得する方法がわかりません。(Kd rgb)

usemtl material_11
f 7//1 8//1 9//2
f 10//1 11//1 12//2

たとえば、上記の Wavefront obj スニペットは、これらの頂点が material_11 を使用することを意味します。

Q:各頂点に対応するマテリアルを取得するにはどうすればよいですか?

エラー

Wavefront objマテリアルが正しい頂点にありません:

元のモデル (ASSIMP モデル ビューアーでレンダリング): ここに画像の説明を入力

私のコードでレンダリングされたモデル: ここに画像の説明を入力

コード:

mtl マテリアルの色をロードするために使用するコード:

std::vector<color4<float>> colors = std::vector<color4<float>>();

                            ...

for (unsigned int i = 0; i < scene->mNumMeshes; i++)
{
    const aiMesh* model = scene->mMeshes[i];
    const aiMaterial *mtl = scene->mMaterials[model->mMaterialIndex];

    color4<float> color = color4<float>(1.0f, 1.0f, 1.0f, 1.0f);
    aiColor4D diffuse;
    if (AI_SUCCESS == aiGetMaterialColor(mtl, AI_MATKEY_COLOR_DIFFUSE, &diffuse))
        color = color4<float>(diffuse.r, diffuse.g, diffuse.b, diffuse.a);
    colors.push_back(color);

                            ...
}

頂点を作成するコード:

vertex* vertices_arr = new vertex[positions.size()];
for (unsigned int i = 0; i < positions.size(); i++)
{
    vertices_arr[i].SetPosition(positions.at(i));
    vertices_arr[i].SetTextureCoordinate(texcoords.at(i));
}

// Code for setting vertices colors (I'm just setting it in ASSIMP vertices order, since I don't know how to set it in the correct order).
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
{
    const unsigned int vertices_size = scene->mMeshes[i]->mNumVertices;
    for (unsigned int k = 0; k < vertices_size; k++)
    {
        vertices_arr[k].SetColor(colors.at(i));
    }
}

編集

モデルの頂点の位置も正しく読み込まれていないようです。顔カリングを無効にして背景色を変更しても。

ここに画像の説明を入力

4

1 に答える 1

2

描画呼び出しの数と追加のストレージ、帯域幅、および頂点カラーの処理に関連する問題を無視します。

モデル全体を保持するために作成している 1 つの大きな配列のように見えvertex* vertices_arr = new vertex[positions.size()];ます (多数のメッシュがあり、それぞれに 1 つのマテリアルがあります)。最初のループが正しくpositions、モデルのすべてのメッシュのすべての位置が含まれていると仮定します。2 番目のループは、メッシュ内の各頂点のメッシュ カラーの複製を開始します。ただし、vertices_arr[k]常にゼロから開始し、前のメッシュの最後の頂点の後に開始する必要があります。代わりに、次を試してください。

int colIdx = 0;
for (unsigned int i = 0; i < scene->mNumMeshes; i++)
{
    const unsigned int vertices_size = scene->mMeshes[i]->mNumVertices;
    for (unsigned int k = 0; k < vertices_size; k++)
    {
        vertices_arr[colIdx++].SetColor(colors.at(i));
    }
}
assert(colIdx == positions.size()); //double check

おっしゃる通り、ジオメトリが適切に描画されpositionsていない場合は、すべての頂点データが含まれていない可能性があります。おそらく上記のコードと同様の問題でしょうか?別の問題は、各メッシュのインデックスを結合することです。vertices_arrインデックスはすべて、配列内の新しい頂点位置へのオフセットで更新する必要があります。今は推測を投げかけているだけですが。

于 2014-12-18T04:17:36.907 に答える