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 + -
显示快捷键?