1

高さマップをロードするプログラムがあり、次に三角形リスト メソッドを使用して頂点を配列に並べ替えます。私の質問は、それを三角形ストリップに変更するにはどうすればよいですか? 私はそれを1つのストリップにしたいので、最初の行は左から右、2番目の行は右から左など、forループを使用してこれを行います。

これまでのtrianlge listメソッドの私のコード(高さマップローダーまたは頂点数の定義は表示されず、法線計算機も表示されますが、それを適応させるのに助けは必要ありません):

for( int l = 0; l < m_HeightMapLength; ++l )
{
    for( int w = 0; w < m_HeightMapWidth; ++w )
    {   
        if( w < m_HeightMapWidth-1 && l < m_HeightMapLength-1 )
        {
            /*v0 = m_pHeightMap[mapIndex];
            v1 = m_pHeightMap[mapIndex+m_HeightMapWidth];
            v2 = m_pHeightMap[mapIndex+1];
            v3 = m_pHeightMap[mapIndex+m_HeightMapWidth+1];

            D3DXVECTOR3 vA = v0 - v1;
            D3DXVECTOR3 vB = v1 - v2;
            D3DXVECTOR3 vC = v3 - v1;

            D3DXVECTOR3 vN1;
            D3DXVec3Cross(&vN1, &vA, &vB);
            D3DXVECTOR3 vN2;
            D3DXVec3Cross(&vN2, &vB, &vC);*/

            //D3DXVec3Normalize( &vN1, &vN1);
            //D3DXVec3Normalize( &vN2, &vN2);

            //T Left, Bot Left, T Right, T Right, Bot Left, Bot Right
            //m_pMapVtxs[i++] = Vertex_Pos3fColour4ubNormal3f(D3DXVECTOR3( m_pHeightMap[mapIndex].x, m_pHeightMap[mapIndex].y,  m_pHeightMap[mapIndex].z), MAP_COLOUR, D3DXVECTOR3(vN1.x, vN1.y, vN1.z));
            //m_pMapVtxs[i++] = Vertex_Pos3fColour4ubNormal3f(D3DXVECTOR3( m_pHeightMap[mapIndex + m_HeightMapWidth].x, m_pHeightMap[mapIndex + m_HeightMapWidth].y,  m_pHeightMap[mapIndex + m_HeightMapWidth].z), MAP_COLOUR, D3DXVECTOR3(vN1.x, vN1.y, vN1.z));
            //m_pMapVtxs[i++] = Vertex_Pos3fColour4ubNormal3f(D3DXVECTOR3( m_pHeightMap[mapIndex+1].x, m_pHeightMap[mapIndex+1].y,  m_pHeightMap[mapIndex+1].z), MAP_COLOUR, D3DXVECTOR3(vN1.x, vN1.y, vN1.z));
            //m_pMapVtxs[i++] = Vertex_Pos3fColour4ubNormal3f(D3DXVECTOR3( m_pHeightMap[mapIndex+1].x, m_pHeightMap[mapIndex+1].y,  m_pHeightMap[mapIndex+1].z), MAP_COLOUR, D3DXVECTOR3(vN2.x,  vN2.y, vN2.z));
            //m_pMapVtxs[i++] = Vertex_Pos3fColour4ubNormal3f(D3DXVECTOR3( m_pHeightMap[mapIndex + m_HeightMapWidth].x, m_pHeightMap[mapIndex + m_HeightMapWidth].y,  m_pHeightMap[mapIndex + m_HeightMapWidth].z), MAP_COLOUR, D3DXVECTOR3(vN2.x,  vN2.y, vN2.z));
            //m_pMapVtxs[i++] = Vertex_Pos3fColour4ubNormal3f(D3DXVECTOR3( m_pHeightMap[mapIndex + m_HeightMapWidth+1].x, m_pHeightMap[mapIndex + m_HeightMapWidth+1].y,  m_pHeightMap[mapIndex + m_HeightMapWidth+1].z), MAP_COLOUR, D3DXVECTOR3(vN2.x,  vN2.y, vN2.z));

mapIndex++;

forループは、それをストリップに変更するための私の主な問題です。私はすでに頂点を紙にマップしているので、それが私の主な問題です。洞察は大歓迎です。

4

1 に答える 1

2

m_pHeightMapは3Dベクトルだと思います。

ストリップは次のようになります。

+--+--+--+--+
|/ |/ |/ |/ |
+--+--+--+--+
| \| \| \| \|
+--+--+--+--+

左下隅から始めて、右に進み、次に1行上に進み、左に進みます。しかし、最初に単一行のストリップを定義する方法を見てみましょう。

for(int x = 0; i < m_HeightMapWidth; ++x)
{
    add m_pHeightMap[x + y * m_HeightMapWidth]; //bottom vertex
    add m_pHeightMap[x + (y + 1) * m_HeightMapWidth]; //top vertex
}

これは2行ごとに機能します。最後の頂点は、行の右上の頂点になります。そこで、縮退した三角形を追加する必要があります。これは面積が0の三角形であり、行が分離されます。それで:

add m_pHeightMap[m_HeightMapWidth + m_HeightMapWidth - 1]; //once again the last vertex

そして、その上の行では、頂点を右から左に追加します。

for(int x = m_HeightMapWidth - 1; i >= 0; --x)
{
    add m_pHeightMap[x + y * m_HeightMapWidth]; //bottom vertex
    add m_pHeightMap[x + (y + 1 ) * m_HeightMapWidth]; //top vertex
}

最初の頂点は、すでに2回追加した頂点であることに注意してください。3回追加すると、三角形の方向が保持されます。

そして、これを各行に対して行います。だから一緒に:

for(int y = 0; y < m_HeightMapHeight - 1; ++y)
{
    if(y % 2 == 0)
    {
        for(int x = 0; i < m_HeightMapWidth; ++x)
        {
            add m_pHeightMap[x + y * m_HeightMapWidth]; //bottom vertex
            add m_pHeightMap[x + (y + 1) * m_HeightMapWidth]; //top vertex
        }
        add m_pHeightMap[(y + 2) * m_HeightMapWidth - 1]; //once again the last vertex
    }
    else
    {
        for(int x = m_HeightMapWidth - 1; i >= 0; --x)
        {
            add m_pHeightMap[x + y * m_HeightMapWidth]; //bottom vertex
            add m_pHeightMap[x + (y + 1 ) * m_HeightMapWidth]; //top vertex
        }
        add m_pHeightMap[(y + 1) * m_HeightMapWidth]; //once again the last vertex
    }
}

*コードはテストされていません

于 2012-10-29T18:37:51.550 に答える