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