0

私は C++/OpenGL で 3D マップ ジェネレーター プラットフォームに取り組んでおり、Perlin の Noise で仕上げた後、いくつかの 3D モデルを画面にロードする必要がありました。以前に試したことはありませんでしたが、それについて読んだ後、COLLADA のモデル形式を使用することにしました。私が最初にしたことは、TinyXML を介して XML ファイルを読み取り、それをコード内の理解可能なクラスに変換することでした。問題なくすべてにアクセスできます。ここまでは順調でしたが、XML の情報を 3D 静的モデルに適切に変換しようとしたときに問題が発生しました。私は多くのチュートリアルを読みましたが、COLLADA の「本質」を理解していなかったと思い、ここで助けを求めています。私の「.dae」ファイルは、Blender で作成された単純な球で構成されています。私が何をするかは問題ではありません。

http://s2.postimg.org/4fdz2fpl4/test.jpg

確かに私は正しい座標をとっていないか、少なくとも正しく実装していません。 これがまさに私がテストしている COLLADA ファイルです。要するに、私がやっていることは次のとおりです。

1 - 最初に「polylist」にアクセスし、「p」の値を取得します。この場合、セマンティックが VERTEX である ID (この場合は「ID2-mesh-vertices」) も取得します。

2 - 「頂点」にアクセスし、セマンティックが POSITION であるソース ID を取得します。この場合は「#ID2-mesh-positions」です。

3 - ソース「#ID2-mesh-positions」にアクセスし、float 値を取得します

4 - その後、ソースの float 値内にある頂点 X、Y、Z のインデックスをそれぞれ取得するために、3 から 3 までの「p」値をループし始めました (「technique_common」に従って)。たとえば、コードが何をするか =>

  • 0 0 1 = {X -> 0.4330127;Y -> 0.4330127; Z -> 0.25}
  • 1 2 2 = {X -> 0.25;Y -> 0; Z -> 0}
  • 1 1 0 = {X -> 0.25;Y -> 0.25; Z -> 0.4330127}

単純な球を取得できないため、明らかに私は非常に間違ったことをしています。

4

2 に答える 2

0

*

<input semantic="VERTEX" source="#ID2-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#ID2-mesh-normals" offset="1"/>

これは、頂点ごとに、参照されたソースに 2 つのインデックスが突っ込んでいることを示しています。0 0は最初のセット、1 1は 2 番目、2 2は 3 番目のセットです。最初の polylist の値は 3 であるため (実際にはすべてそうです)、これが最初の三角形を構成します。

現在、これらのインデックスは float 配列のソース アクセサーを通過しています...

<accessor source="#ID2-mesh-normals-array" count="266" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>

これは、インデックスに関連付けられた法線を読み取るには、配列を 3 つの要素でまたがる必要があり、各ベクトルは 3 つの float (X、Y、Z) で構成されていることを示しています。ストライドは各頂点の要素数である必要はありませんが、多くの場合そうであることに注意してください。

したがって、その例を結論付けるには、法線配列のインデックス 2 を読み取るには、 でインデックス付けされた要素を読み取ってX_index=index*stride=6, Y_index=X_index+1=7, Z_index=X_index+2=8、法線を見つける必要があります。(X,Y,Z) = (-0.2561113 0 -0.8390759 -0.4953154)

はい、これは、頂点ごとに複数のインデックスがあることを意味します。これは、OpenGL がネイティブにサポートしていないものです。参考資料として、それらのさまざまな質問を参照してください。

複数のインデックスを持つメッシュのレンダリング

glDrawElements を使用して tex 座標配列と頂点配列に異なるインデックスを使用する方法

3 つのインデックス バッファ

于 2013-11-05T08:42:08.567 に答える
0

collada de-indexer を使用して .dae を前処理し、頂点ごとに複数のインデックスを削除します。その間に、前処理で三角形に変換して、ローダーをさらに簡素化します。 https://collada.org/mediawiki/index.php/COLLADA_Refinery

于 2013-11-15T20:08:42.707 に答える