void Cterrain::makeMesh(){ int nVertex=(int)markmat.size()*(int)markmat[0].size(); int nStep=3+2+3+2; float *vertexArray=new float[nVertex*nStep]; //填充vertexArray for(int i=0;i<(int)markmat.size();i++){ for(int j=0;j<(int)markmat[i].size();j++){ float x,y,z; x=m_range.getMinX()+j*gridSize; y=landMat[min(i,(int)landMat.size()-1)][min(j,(int)landMat[0].size()-1)]; z=m_range.getMinZ()+i*gridSize; *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+0)=x; *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+1)=y; *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+2)=z; *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+3)=m_uvScale*j/(int)markmat[0].size(); *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+4)=m_uvScale*i/(int)markmat.size(); *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+5)=normalMat[min(i,(int)landMat.size()-1)][min(j,(int)landMat[0].size()-1)].x(); *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+6)=normalMat[min(i,(int)landMat.size()-1)][min(j,(int)landMat[0].size()-1)].y(); *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+7)=normalMat[min(i,(int)landMat.size()-1)][min(j,(int)landMat[0].size()-1)].z(); *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+8)=(x-m_range.getMinX())/m_range.getSpanX();//alpha map texCoord s *(vertexArray+i*(int)markmat[0].size()*(3+2+3+2)+j*(3+2+3+2)+9)=(z-m_range.getMinZ())/m_range.getSpanZ();//alpha map texCoord t } } this->getModel()->getMeshByIndex(0)->getMeshData()->vlist.clear(); for(int i=0;i<nVertex;i++){ Cc3dVertex vertex; vertex.setPos(vertexArray+i*nStep); vertex.setTexCoord(vertexArray+i*nStep+3); vertex.setNorm(vertexArray+i*nStep+3+2); vertex.setTexCoord2(vertexArray+i*nStep+3+2+3); this->getModel()->getMeshByIndex(0)->getMeshData()->vlist.push_back(vertex); } //释放vertexArray delete []vertexArray; }
Cc3dMeshData*genSampleCubeWithCode(float cx,float cy,float cz,float dx,float dy,float dz, float k_s, float k_t, int cubUVMode) //用代码生成示例立方体 //cx,cy,cz为中心 //dx,dy,dz分别为x,y,z方向上的边心距 { Cc3dMeshData*meshData=new Cc3dMeshData(); meshData->init(); meshData->autorelease(); meshData->vlist.reserve(8); meshData->IDtriList.reserve(12); //----生成顶点数据 Cc3dVertex tv; //前面 tv.setPos(Cc3dVector3(cx-dx, cy-dy,cz+dz));tv.setTexCoord(Cc3dVector2(0, 0));tv.setNorm(Cc3dVector3(0, 0, 1));//0 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy-dy,cz+dz));tv.setTexCoord(Cc3dVector2(1, 0));tv.setNorm(Cc3dVector3(0, 0, 1));//1 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy+dy, cz+dz));tv.setTexCoord(Cc3dVector2(1, 1));tv.setNorm(Cc3dVector3(0, 0, 1));//2 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx-dx, cy+dy, cz+dz));tv.setTexCoord(Cc3dVector2(0, 1));tv.setNorm(Cc3dVector3(0, 0, 1));//3 meshData->vlist.push_back(tv); //后面 tv.setPos(Cc3dVector3(cx-dx, cy-dy,cz -dz));tv.setTexCoord(Cc3dVector2(0, 0));tv.setNorm(Cc3dVector3(0, 0, -1));//4 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy-dy, cz-dz));tv.setTexCoord(Cc3dVector2(1, 0));tv.setNorm(Cc3dVector3(0, 0, -1));//5 meshData->vlist.push_back(tv); tv.setPos(Cc3dVector3(cx+dx, cy+dy, cz-dz));tv.setTexCoord(Cc3dVector2(1, 1));tv.setNorm(Cc3dVector3(0, 0, -1));//6 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, 0, -1);//7 meshData->vlist.push_back(tv); //上面 tv.setPos(cx-dx, cy+dy, cz+dz);tv.setTexCoord(0, 0);tv.setNorm(0, 1, 0);//8 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(0, 1, 0);//9 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz-dz);tv.setTexCoord(1, 1);tv.setNorm(0, 1, 0);//10 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, 1, 0);//11 meshData->vlist.push_back(tv); //下面 tv.setPos(cx-dx, cy-dy, cz+dz);tv.setTexCoord(0, 0);tv.setNorm(0, -1, 0);//12 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy-dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(0, -1, 0);//13 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy-dy, cz-dz);tv.setTexCoord(1, 1);tv.setNorm(0, -1, 0);//14 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy-dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(0, -1, 0);//15 meshData->vlist.push_back(tv); //左面 tv.setPos(cx-dx, cy-dy,cz -dz);tv.setTexCoord(0, 0);tv.setNorm(-1, 0, 0);//16 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy-dy, cz+dz);tv.setTexCoord(1, 0);tv.setNorm(-1, 0, 0);//17 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz+dz);tv.setTexCoord(1, 1);tv.setNorm(-1, 0, 0);//18 meshData->vlist.push_back(tv); tv.setPos(cx-dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(-1, 0, 0);//19 meshData->vlist.push_back(tv); //右面 tv.setPos(cx+dx, cy-dy, cz-dz);tv.setTexCoord(0, 0);tv.setNorm(1, 0, 0);//20 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy-dy,cz+ dz);tv.setTexCoord(1, 0);tv.setNorm(1, 0, 0);//21 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz+dz);tv.setTexCoord(1, 1);tv.setNorm(1, 0, 0);//22 meshData->vlist.push_back(tv); tv.setPos(cx+dx, cy+dy, cz-dz);tv.setTexCoord(0, 1);tv.setNorm(1, 0, 0);//23 meshData->vlist.push_back(tv); //----生成索引三角形 Cc3dIDTriangle tIDtri; //前面 tIDtri.setvID(0, 1, 2); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(0, 2, 3); meshData->IDtriList.push_back(tIDtri); //后面 tIDtri.setvID(4, 6, 5); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(4, 7, 6); meshData->IDtriList.push_back(tIDtri); //上面 tIDtri.setvID(8, 9, 10); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(8, 10, 11); meshData->IDtriList.push_back(tIDtri); //下面 tIDtri.setvID(12, 14, 13); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(12, 15, 14); meshData->IDtriList.push_back(tIDtri); //左面 tIDtri.setvID(16, 17, 18); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(16, 18, 19); meshData->IDtriList.push_back(tIDtri); //右面 tIDtri.setvID(20, 22, 21); meshData->IDtriList.push_back(tIDtri); tIDtri.setvID(20, 23, 22); meshData->IDtriList.push_back(tIDtri); //----重新计算各三角形各顶点的uv int nv=(int)meshData->vlist.size(); vector<bool> markList(nv);//标记各顶点是否已经重计算过uv,避免多次计算(多次计算可能导致出错),初始全0 int nIDtri=(int)meshData->IDtriList.size(); for(int i=0;i<nIDtri;i++){ Cc3dIDTriangle&IDtri=meshData->IDtriList[i]; //重新计算IDtri各顶点的uv switch(cubUVMode) { case cubUVMode_FITFACE: { //将IDtri中未mark的顶点的uv分别乘以k_s,k_t for(int j=0;j<3;j++){ int vID=IDtri.vID[j];//顶点号 if(markList[vID]==false){//未计算过 //重新计算 Cc3dVertex&v=meshData->vlist[vID]; Cc3dVector2 texCoord=v.getTexCoord(); texCoord.setx(texCoord.x()*k_s); texCoord.sety(texCoord.y()*k_t); v.setTexCoord(texCoord); markList[vID]=true;//标记为已计算 } } }break; case cubUVMode_UNIFORM: { //将IDtri各顶点的uv,重新按顶点坐标来计算,并以k_s,k_t放缩 //判断IDtri的类型 const int type_LR=0;//左或右 const int type_UD=1;//上或下 const int type_FB=2;//前或后 int type=0; Cc3dVector3 norm=meshData->vlist[IDtri.vID[0]].getNorm(); if(fabsf(fabsf(norm.x())-1)<0.01){//左面或右面 type=type_LR; }else if(fabsf(fabsf(norm.y())-1)<0.01){//上面或下面 type=type_UD; }else{//前面或后面 type=type_FB; }//得到type for(int j=0;j<3;j++){ int vID=IDtri.vID[j];//顶点号 if(markList[vID]==false){//未计算过 //重新计算 Cc3dVertex&v=meshData->vlist[vID]; switch (type) { case type_LR:{ //用yz Cc3dVector2 texCoord(v.getPos().y()*k_s,v.getPos().z()*k_t); v.setTexCoord(texCoord); }break; case type_UD:{ //用xz Cc3dVector2 texCoord(v.getPos().x()*k_s,v.getPos().z()*k_t); v.setTexCoord(texCoord); }break; case type_FB:{ //用xy Cc3dVector2 texCoord(v.getPos().x()*k_s,v.getPos().y()*k_t); v.setTexCoord(texCoord); }break; } //标记为已计算 markList[vID]=true; } } }break; default: cout<<"error:未知的cubUV映射类型!"<<endl; assert(false); break; } } return meshData; }