5

Assimp を使用して 3D モデルをプログラムにロードしています。意味をなさないように見える Lightwave オブジェクトに出くわしたことを除けば、これまでのところすべてうまくいっています。もちろん、Lightwave ではうまくレンダリングされますが、Assimp にはテクスチャ座標も UV 座標もありませんが、最終的にロードされるテクスチャがあります。しかし、それは役に立ちません。テクスチャ座標がないため、メモリ内に留まり、使用されることはありません。

これについては、これまでのところ、役立つ Assimp ページは見つかりませんでした。他のモデルは正常にロードされ、適切にテクスチャ マッピングされます。これはAssimpの問題ですか?

4

2 に答える 2

5

これはすべての Lightwave モデルで発生しますか? それとも、このモデルだけで発生しますか? あなたのプログラムは他のモデルを正しくレンダリングしますか?

assimpを使用して(Lightwaveデータファイルではなく)OBJファイルを読み込み、OpenGLでレンダリングするという同じ問題もありました。私のレンダラーは assimp サイトの例からかなり完全にコピーされました。レンダラーを調査したところ、UV を使用するコードがないことがわかりました。だから、私は追加しました

if( mesh->mTextureCoords[0] != NULL ) {
    glTexCoord2fv( &mesh->mTextureCoords[0][index].x );
}

頂点を描画する直前、

int index = face->mIndices[i];

i は for ループのループ制御変数です。

問題点: assimp の Web サイトにあるレンダリング コードは、UV 座標に対して何の役にも立ちません。それを自分で追加する必要があります。

これが手遅れではないことを願っています!

于 2013-07-05T03:30:15.870 に答える
2

8 つのテクスチャ座標スロットがあります...それぞれが異なるテクスチャで満たされているかどうかはわかりません...最初の 1 つを確認するだけで済みます

メッシュ->mTextureCoords[0]

この「const struct aiVector3D*」のような配列にキャストし、インデックス mTextureCoords[0][t] をループします。

t をループし、それが 2 次元配列であることに注意してください

    for (t = 0; t < mesh->mNumVertices; ++t) {
        const struct aiVector3D* textureVec = &mesh->mTextureCoords[0][t];
        printf("tex (%f,%f,%f)", textureVec->x, textureVec->y, textureVec->z );
    }

それが役に立てば幸い!ここにも引っかかった!ロードされていないと思っていた...

now: tex (0.159871,0.410298,0.000000)tex (0.034839,0.369741,0.000000)tex (0.147435,0.506447,0.000000)tex (0.018893,0.493014,0.000000)tex (0.159871,0.602596,0.000000)tex (0.034839,0.616288,0.000000) tex (0.196806,0.695823,0.000000)tex (0.082196,0.735817,0.000000)tex (0.257118,0.783297,0.000000)tex (0.159520,0.847968,0.000000)tex (0.314932,0.833907,0.000000)tex (0.318555,0.981848,0.000000)tex ( 0.554152,0.373114,0.000000)tex (0.557998,0.677465,0.000000)tex (0.442610,0.703479,0.000000)

于 2016-09-18T14:41:25.623 に答える