2010-04-25 66 views
0

我正在创建一个位于x和z轴上的3d平面,并且有在y轴上延伸的小丘。大部分代码如下所示:使用Frank Luna的技术创建一个3d平面:什么是sinf和cosf?

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值有很大关系。

+0

如果您没有安装联机帮助页,您可以在系统上简单检查一下“man cosf”,或者搜索“man cosf”的Google搜索,就可以回答这个问题。就此而言,即使Google搜索“sinf”也会在第一个条目中找到答案,而搜索“cosf”会将其作为第三个条目。另外,如果你的问题是“什么是罪和cosf?”在问题的标题中提及它们是有用的。 – 2010-04-25 17:38:54

回答

8

cosfsinf只是和sinfloat版本。正常cossin函数返回double值而不是float s。请注意,所有这些函数都以弧度表示,而不是度数。

结合上面的方式,他们给出了一个看起来有点像山脉的景观,如this plot