网站的文案,哪里有网站推广优化,企业 做网站,怎么经营团购网站本教程中#xff0c;我们新建2个model class#xff0c;SphereModelClass以及CylinderModelClass,分别用来表示球形和锥形物体。 程序执行后的界面如下#xff1a; 线框模式界面如下#xff1a; 从线框模式可以看出#xff0c;球形是由三个因素决定#xff1a;半径、经度…本教程中我们新建2个model classSphereModelClass以及CylinderModelClass,分别用来表示球形和锥形物体。 程序执行后的界面如下 线框模式界面如下 从线框模式可以看出球形是由三个因素决定半径、经度线、纬度线。 在SphereModelClass.cpp中我们看到初始化顶点缓冲和索引缓冲的函数为InitializeBuffers(ID3D11Device* device, float radius, int numSlices, int numStacks)它多了三个参数分别表示半径、经度切片的数量、纬度切面的数量。具体构建球形顶点的操作在函数buildStacks(vertices, indices)中主要就是把经纬度切片的数目转化成球坐标系中的角度求出球坐标系中顶点再转化到笛卡尔坐标系中。 代码如下 void SphereModelClass::buildStacks(VertexList vertices, IndexList indices) { float phiStep PI/m_NumStacks; int numRings m_NumStacks-1; // 对于每个纬度环计算顶点. for(int i 1; i numRings; i) { float phi i*phiStep; // 环上的顶点 float thetaStep 2.0f*PI/m_NumSlices; for(int j 0; j m_NumSlices; j) { float theta j*thetaStep; VertexType v; // 球坐标到笛卡尔坐标的转化 v.position.x m_Radius*sinf(phi)*cosf(theta); v.position.y m_Radius*cosf(phi); v.position .z m_Radius*sinf(phi)*sinf(theta); D3DXVec3Normalize(v.normal, v.position); //球的纹理坐标 v.texture.x theta / (2.0f*PI); v.texture.y phi / PI; v.Kd D3DXVECTOR4(0.2, 0.2, 0.1,1.0); v.Ks D3DXVECTOR4(0.2, 0.2, 0.2,1.0); vertices.push_back( v ); } } // 球的极点: 会出现纹理坐标扭曲 VertexType t1; t1.position D3DXVECTOR3(0.0f, -m_Radius, 0.0f); t1.normal D3DXVECTOR3(0.0f, -1.0f, 0.0f); t1.texture D3DXVECTOR2(0.0f, 1.0f); t1.Kd D3DXVECTOR4(0.2, 0.2, 0.1,1.0); t1.Ks D3DXVECTOR4(0.2, 0.2, 0.2,1.0); vertices.push_back( t1 ); t1.position D3DXVECTOR3(0.0f, m_Radius, 0.0f); t1.normal D3DXVECTOR3(0.0f, 1.0f, 0.0f); t1.texture D3DXVECTOR2(0.0f, 0.0f); vertices.push_back(t1 ); int northPoleIndex (int)vertices.size()-1; int southPoleIndex (int)vertices.size()-2; int numRingVertices m_NumSlices1; // 计算索引(不考虑极点) for(int i 0; i m_NumStacks-2; i) { for(int j 0; j m_NumSlices; j) { indices.push_back(i*numRingVertices j); indices.push_back(i*numRingVertices j1); indices.push_back((i1)*numRingVertices j); indices.push_back((i1)*numRingVertices j); indices.push_back(i*numRingVertices j1); indices.push_back((i1)*numRingVertices j1); } } //北极点索引 for(int i 0; i m_NumSlices; i) { indices.push_back(northPoleIndex); indices.push_back(i1); indices.push_back(i); } //南极点索引 int baseIndex (numRings-1)*numRingVertices; for(int i 0; i m_NumSlices; i) { indices.push_back(southPoleIndex); indices.push_back(baseIndexi); indices.push_back(baseIndexi1); } } 在CylinderModelClass.cpp中我们看到InitializeBuffers(ID3D11Device* device, float topRadius, float bottomRadius, float height, int numSlices, int numStacks),它多出了5个参数分别表示锥体的顶部圆半径、底部圆半径高度、经度切片的数量、纬度切片的数量。 具体计算顶点缓冲和索引缓冲由个函数组成这三个函数的具体代码请参考源文件 buildStacks(vertices, indices); buildTopCap(vertices, indices); buildBottomCap(vertices, indices); 完整的代码请参考 工程文件myTutorialD3D11_50 代码下载 http://files.cnblogs.com/mikewolf2002/d3d1150-58.zip http://files.cnblogs.com/mikewolf2002/pictures.zip