使用Frank Luna的技术创建一个三维平面:什么是sinf和cosf?

时间:2010-04-25 17:11:01

标签: c++ c

我正在创建一个位于x和z轴上的三维平面,并且具有在y轴上延伸的山丘。大部分代码如下所示:

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));
}

我的问题与cosf和sinf有关。我熟悉三角学,我理解罪,余弦和切线,但我不熟悉cosf和sinf以及他们做了什么。从这个例子来看,它们与查找y值有很大关系。

1 个答案:

答案 0 :(得分:8)

cosfsinf只是floatcos的{​​{1}}版本。普通sincos函数返回sin值而不是double s。请注意,所有这些函数都以弧度为单位,而不是度数。

在上面的方式中,他们给出的景观看起来有点像山脉,如this plot