creating a 3d plane using Frank Luna's technique

Posted by numerical25 on Stack Overflow See other posts from Stack Overflow or by numerical25
Published on 2010-04-25T17:11:00Z Indexed on 2010/04/25 17:13 UTC
Read the original article Hit count: 534

Filed under:
|
|

I am creating a 3d plane that lays on the x and z axis. and has hills that extend on the y axis. bulk of the code looks like this

float PeaksAndValleys::getHeight(float x, float z)const
{
    return 0.3f*( z*sinf(0.1f*x) + x*cosf(0.1f*z) );
}

void PeaksAndValleys::init(ID3D10Device* device, DWORD m, DWORD n, float dx)
{
    md3dDevice = device;

    mNumRows  = m;
    mNumCols  = n;

    mNumVertices = m*n;
    mNumFaces    = (m-1)*(n-1)*2;


    // Create the geometry and fill the vertex buffer. 

    std::vector<Vertex> vertices(mNumVertices);
    float halfWidth = (n-1)*dx*0.5f;
    float halfDepth = (m-1)*dx*0.5f;
    for(DWORD i = 0; i < m; ++i)
    {
        float z = halfDepth - i*dx;
        for(DWORD j = 0; j < n; ++j)
        {
            float x = -halfWidth + j*dx;

            // Graph of this function looks like a mountain range.
            float y = getHeight(x,z);

            vertices[i*n+j].pos = D3DXVECTOR3(x, y, z);

            // Color the vertex based on its height.
            if( y < -10.0f )
                vertices[i*n+j].color = BEACH_SAND;
            else if( y < 5.0f )
                vertices[i*n+j].color = LIGHT_YELLOW_GREEN;
            else if( y < 12.0f )
                vertices[i*n+j].color = DARK_YELLOW_GREEN;
            else if( y < 20.0f )
                vertices[i*n+j].color = DARKBROWN;
            else
                vertices[i*n+j].color = WHITE;
        }
    }

    D3D10_BUFFER_DESC vbd;
    vbd.Usage = D3D10_USAGE_IMMUTABLE;
    vbd.ByteWidth = sizeof(Vertex) * mNumVertices;
    vbd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
    vbd.CPUAccessFlags = 0;
    vbd.MiscFlags = 0;
    D3D10_SUBRESOURCE_DATA vinitData;
    vinitData.pSysMem = &vertices[0];
    HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mVB));


    // Create the index buffer.  The index buffer is fixed, so we only 
    // need to create and set once.

    std::vector<DWORD> indices(mNumFaces*3); // 3 indices per face

    // Iterate over each quad and compute indices.
    int k = 0;
    for(DWORD i = 0; i < m-1; ++i)
    {
        for(DWORD j = 0; j < n-1; ++j)
        {
            indices[k]   = i*n+j;
            indices[k+1] = i*n+j+1;
            indices[k+2] = (i+1)*n+j;

            indices[k+3] = (i+1)*n+j;
            indices[k+4] = i*n+j+1;
            indices[k+5] = (i+1)*n+j+1;

            k += 6; // next quad
        }
    }

    D3D10_BUFFER_DESC ibd;
    ibd.Usage = D3D10_USAGE_IMMUTABLE;
    ibd.ByteWidth = sizeof(DWORD) * mNumFaces*3;
    ibd.BindFlags = D3D10_BIND_INDEX_BUFFER;
    ibd.CPUAccessFlags = 0;
    ibd.MiscFlags = 0;
    D3D10_SUBRESOURCE_DATA iinitData;
    iinitData.pSysMem = &indices[0];
    HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mIB));
}

My question pretains to the cosf and sinf. I am formiluar with trigonometry and I understand sin, cosine, and tangent. but I am not formiluar with cosf and sinf and what they do. From looking at this example. they have alot to do with finding a y value.

© Stack Overflow or respective owner

Related posts about game-development

Related posts about c++