我正在创建一个3d平面,该平面位于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值有很大关系。

最佳答案

cosfsinf只是floatcossin版本。普通的cossin函数返回double值而不是float s。请注意,所有这些功能都以弧度而不是度为单位。

按上述方式组合,它们给出的景观看上去有点像山脉,如this plot中所示。

关于c++ - 使用Frank Luna的技术创建3d平面:sinf和cosf是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2709092/

10-08 22:11