stdmeshimporter.cpp

来自「ROBOCUP 仿真3D server 源码」· C++ 代码 · 共 437 行 · 第 1/2 页

CPP
437
字号
    mesh->SetPos(pos,gNumBoxVertices);    shared_array<float> normals(new float[gNumBoxVertices*3]);    memcpy(normals.get(),gBoxNormals,gNumBoxVertices*3*sizeof(float));    mesh->SetNormals(normals);    shared_array<float> tex(new float[gNumBoxVertices*3]);    memcpy(tex.get(), gBoxTexCoords,gNumBoxVertices*3*sizeof(float));    mesh->SetTexCoords(tex);    shared_ptr<IndexBuffer> idx(new IndexBuffer());    idx->Cache(gNumBoxFaces*3,gBoxFaces);    mesh->AddFace(idx);    return mesh;}//// unit capped cylinder//static void AddVertex(float** at, float x, float y, float z){    (**at) = x; ++(*at);    (**at) = y; ++(*at);    (**at) = z; ++(*at);}std::string StdMeshImporter::MangleName (const string& name, const ParameterList& parameter){    if (        (name != gCCylinderStr) ||        (parameter.GetSize() < 2)        )        {            return name;        }    stringstream ss;    ss << gCCylinderStr;    float radius;    if (parameter.GetValue(parameter[0],radius))        {            ss << "R=" << radius;        }    float length;    if (parameter.GetValue(parameter[1],length))        {            ss << "L=" << length;        }    return ss.str();}shared_ptr<TriMesh> StdMeshImporter::UnitCCylinder(const ParameterList& parameter){    //    // code adapted from ODE's drawstuff lib    //    // generated capped clinder with r=1 and l=1    float ccRadius = 1;    float ccLength = 1;    GetLog()->Debug()        << "(StdMeshImporter::UnitCCylinder) paramSize="        << parameter.GetSize() << "\n";    if (parameter.GetSize() >= 2)        {            parameter.GetValue(parameter[0],ccRadius);            parameter.GetValue(parameter[1],ccLength);        }    // number of sides to the cylinder (divisible by 4):    const int capped_cylinder_quality = 3;    const int n = capped_cylinder_quality*4;    int innerLoop = (n+1);    int numVertices = innerLoop * 2;    numVertices += (innerLoop * (n/4) * 2);    numVertices += (innerLoop * (n/4) * 2);    shared_array<float> pos(new float[numVertices * 3]);    shared_array<float> normals(new float[numVertices * 3]);    float* cVert = pos.get();    float* cNormal = normals.get();    int i,j;    float tmp,nx,start_nx,start_ny;    float l = ccLength * 0.5;    float a = g2PI / n;    float sa = gSin(a);    float ca = gCos(a);    // draw cylinder body    // normal vector = (0,ny,nz)    float ny = 1;    float nz = 0;    for (i=0; i<=n; ++i)        {            AddVertex(&cNormal,ny,nz,0);            AddVertex(&cVert,ny*ccRadius,nz*ccRadius,l);            AddVertex(&cNormal,ny,nz,0);            AddVertex(&cVert,ny*ccRadius,nz*ccRadius,-l);            // rotate ny,nz            tmp = ca * ny - sa * nz;            nz = sa*ny + ca*nz;            ny = tmp;        }    // draw first cylinder cap    start_nx = 0;    start_ny = 1;    for (j=0; j<(n/4); ++j)        {            // get start_n2 = rotated start_n            float start_nx2 =  ca*start_nx + sa*start_ny;            float start_ny2 = -sa*start_nx + ca*start_ny;            // get n=start_n and n2=start_n2            nx = start_nx;            ny = start_ny;            nz = 0;            float nx2 = start_nx2;            float ny2 = start_ny2;            float nz2 = 0;            for (i=0; i<=n; i++)                {                    AddVertex(&cNormal,ny2,nz2,nx2);                    AddVertex(&cVert,ny2*ccRadius,nz2*ccRadius,l+nx2*ccRadius);                    AddVertex(&cNormal,ny,nz,nx);                    AddVertex(&cVert,ny*ccRadius,nz*ccRadius,l+nx*ccRadius);                    // rotate n,n2                    tmp = ca*ny - sa*nz;                    nz = sa*ny + ca*nz;                    ny = tmp;                    tmp = ca*ny2- sa*nz2;                    nz2 = sa*ny2 + ca*nz2;                    ny2 = tmp;                }            start_nx = start_nx2;            start_ny = start_ny2;        }    // draw second cylinder cap    start_nx = 0;    start_ny = 1;    for (j=0; j<(n/4); j++)        {            // get start_n2 = rotated start_n            float start_nx2 = ca*start_nx - sa*start_ny;            float start_ny2 = sa*start_nx + ca*start_ny;            // get n=start_n and n2=start_n2            nx = start_nx; ny = start_ny; nz = 0;            float nx2 = start_nx2;            float ny2 = start_ny2;            float nz2 = 0;            for (i=0; i<=n; i++)                {                    AddVertex(&cNormal,ny,nz,nx);                    AddVertex(&cVert,ny*ccRadius,nz*ccRadius,-l+nx*ccRadius);                    AddVertex(&cNormal,ny2,nz2,nx2);                    AddVertex(&cVert,ny2*ccRadius,nz2*ccRadius,-l+nx2*ccRadius);                    // rotate n,n2                    tmp = ca*ny - sa*nz;                    nz = sa*ny + ca*nz;                    ny = tmp;                    tmp = ca*ny2- sa*nz2;                    nz2 = sa*ny2 + ca*nz2;                    ny2 = tmp;                }            start_nx = start_nx2;            start_ny = start_ny2;        }    shared_ptr<IndexBuffer> idx(new IndexBuffer());    // triangle strip -> triangles    int numFaces = (numVertices - 2);    idx->EnsureFit(numFaces*3);    for (i=0;i<numFaces;++i)        {            if (i%2)                {                    idx->Cache(i+1);                    idx->Cache(i);                    idx->Cache(i+2);                } else                    {                        idx->Cache(i);                        idx->Cache(i+1);                        idx->Cache(i+2);                    }        }    shared_ptr<TriMesh> mesh(new TriMesh());    mesh->SetPos(pos,numVertices);    mesh->SetNormals(normals);    mesh->AddFace(idx);    mesh->SetName(MangleName(gCCylinderStr,parameter));    return mesh;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?