Mesh クラスの汎用プログラムを作成しようとしていました。(メッシュを変形するには CPU 変換が必要です。質問を考えている場合に備えて、GPU でこれを実行しないのはそのためです)
にMesh<T>
は、3D シェイプの頂点と、面のタイアップ (頂点を結合して三角形を作るもの) が含まれています。
頂点のタイプは次のとおりT
です。一部のタイプのモデルには PNCT タイプ (位置、法線、色、texcoord) があり、他は単なる PC (位置、色) です。
struct VertexPNCT {
Vector3 pos, normal ;
Vector4 color ;
Vector2 tex ;
} ;
struct VertexPC {
Vector3 pos ;
Vector4 color ;
} ;
もちろん、すべての頂点には位置があります。
しかし、ここに私の問題があります。
Mesh<T>
メソッドを実装する必要がありtransform
ます。もちろん、すべての頂点形式には位置があり、名前が一貫している場合 ( .pos
)、メソッドは正常に機能します。
すべての頂点には確実に位置があるため、常に構造体でそのメンバー.pos
を呼び出すと、次のようにテンプレート化されたクラスにVertex*
メソッドを追加できます。.transform
Mesh<T>
void transform( Matrix4& mat )
{
each vertex
vertex.pos = mat * vertex.pos ; // transform it
}
ここに問題があります。 頂点フォーマットに法線が含まれている場合、その法線も変換する必要があります (「法線マトリックス」によって)。テンプレートに「if ステートメント」がありますか? 頂点の種類ごとにテンプレートの特殊.transform
化メソッドを作成する必要があります (基本的に、法線のあるものと法線のないものの 2 つのカテゴリに分けられます)。
ここでテンプレートを誤用しましたか? 「プログラミングボート」を見逃しましたか?
私が本当に論理的にやりたいことは次のとおりです。
void transform( Matrix4& mat )
{
each vertex in vertices
{
vertex.pos = mat * vertex.pos ; // transform it
#ifdef vertex.normal
vertex.normal = mat * vertex.normal ; // transform normal as well*
#endif
}
}
* 変換にスケールがないことを前提としています (その場合、「通常のマトリックス」を使用する必要はありません)