void KinectSkeletonRigger::AutoRig() { if (m_m.vertices.size() <= 0 || m_skel.get() == NULL) { return; } cout << "autorigging..."; Debugging::setOutStream(cout); KinectSkeleton tmp_skel = *m_skel; m_po = autorig(tmp_skel, m_m); cout << "DONE" << endl; if(m_po.attachment != NULL) { // m_display_mesh = m_po.attachment->deform(m_m,m_transforms); my_weights.resize(m_m.vertices.size()); for (int i=0; i<m_m.vertices.size(); i++) { my_weights[i] = m_po.attachment->getWeights(i); } } }
void process(const vector<string> &args, MyWindow *w) { int i; // 读入输入参数的信息,初始化skeleton为humanskeleton ArgData a = processArgs(args); Debugging::setOutStream(cout); Mesh m(a.filename); if(m.vertices.size() == 0) { cout << "Error reading file. Aborting." << endl; exit(0); return; } for(i = 0; i < (int)m.vertices.size(); ++i) m.vertices[i].pos = a.meshTransform * m.vertices[i].pos; // 将坐标空间中的点调整到[0, 1]之间 m.normalizeBoundingBox(); m.computeVertexNormals(); Skeleton given = a.skeleton; given.scale(a.skelScale * 0.01); for(i = 1; i < (int)given.fGraph().verts.size(); ++i) { w->addOriginLines(LineSegment(given.fGraph().verts[i], given.fGraph().verts[given.fPrev()[i]], Vector3(.0, .5, 0.5), 4.)); } w->addOriginPoints(given.fGraph().verts); w->setCIdx(given.cfMapV); if(a.stopAtMesh) { //if early bailout w->addMesh(new StaticDisplayMesh(m)); return; } PinocchioOutput o; if(!a.noFit) { //do everything o = autorig(given, m); } else { //skip the fitting step--assume the skeleton is already correct for the mesh TreeType *distanceField = constructDistanceField(m); VisTester<TreeType> *tester = new VisTester<TreeType>(distanceField); o.embedding = a.skeleton.fGraph().verts; for(i = 0; i < (int)o.embedding.size(); ++i) o.embedding[i] = m.toAdd + o.embedding[i] * m.scale; o.attachment = new Attachment(m, a.skeleton, o.embedding, tester); delete tester; delete distanceField; } if(o.embedding.size() == 0) { cout << "Error embedding" << endl; exit(0); } if(a.motionname.size() > 0) { w->addMesh(new DefMesh(m, given, o.embedding, *(o.attachment), new Motion(a.motionname))); } else { w->addMesh(new StaticDisplayMesh(m)); w->addSphere(o.spheres); w->addMatchPoint(o.embedding); w->addDiscreteEmbedV(o.discreteEmbedding); for (i = 0; i < (int)o.embeddingIdx.size(); ++i) { w->addEmbeddingV(o.ptGraph.verts[o.embeddingIdx[i]]); } for (i = 1; i < (int)o.ptGraph.edges.size(); ++i) { vector<int> edge = o.ptGraph.edges[i]; for (int j = 0; j < (int)edge.size(); ++j) { if (edge[j] < i) { w->addExtractLines( LineSegment(o.ptGraph.verts[i], o.ptGraph.verts[edge[j]], Vector3(0, 1.0000, 0.4980), 2) ); } } } for (i = 0; i < (int)o.limbVerts.size(); ++i) { w->addLimbVerts(o.ptGraph.verts[i]); } for(i = 1; i < (int)o.embedding.size(); ++i) { //LineSegment(const Vector3 &inP1, const Vector3 &inP2,const Vector3 &inColor , double inThickness = 1.) w->addLine(LineSegment(o.embedding[i], o.embedding[given.fPrev()[i]], Vector3(.5, .5, 0), 4.)); } } //output skeleton embedding for(i = 0; i < (int)o.embedding.size(); ++i) o.embedding[i] = (o.embedding[i] - m.toAdd) / m.scale; ofstream os("skeleton.out"); for(i = 0; i < (int)o.embedding.size(); ++i) { os << i << " " << o.embedding[i][0] << " " << o.embedding[i][1] << " " << o.embedding[i][2] << " " << a.skeleton.fPrev()[i] << endl; } //output attachment std::ofstream astrm("attachment.out"); for(i = 0; i < (int)m.vertices.size(); ++i) { Vector<double, -1> v = o.attachment->getWeights(i); for(int j = 0; j < v.size(); ++j) { double d = floor(0.5 + v[j] * 10000.) / 10000.; astrm << d << " "; } astrm << endl; } delete o.attachment; }
void process(const vector<string> &args, MyWindow *w) { int i; ArgData a = processArgs(args); Debugging::setOutStream(cout); Mesh m(a.filename); if(m.vertices.size() == 0) { cout << "Error reading file. Aborting." << endl; exit(0); return; } for(i = 0; i < (int)m.vertices.size(); ++i) m.vertices[i].pos = a.meshTransform * m.vertices[i].pos; m.normalizeBoundingBox(); m.computeVertexNormals(); Skeleton given = a.skeleton; given.scale(a.skelScale * 0.7); if(a.stopAtMesh) { //if early bailout w->addMesh(new StaticDisplayMesh(m)); return; } PinocchioOutput o; if(!a.noFit) { //do everything o = autorig(given, m); } else { //skip the fitting step--assume the skeleton is already correct for the mesh TreeType *distanceField = constructDistanceField(m); VisTester<TreeType> *tester = new VisTester<TreeType>(distanceField); o.embedding = a.skeleton.fGraph().verts; for(i = 0; i < (int)o.embedding.size(); ++i) o.embedding[i] = m.toAdd + o.embedding[i] * m.scale; o.attachment = new Attachment(m, a.skeleton, o.embedding, tester); delete tester; delete distanceField; } if(o.embedding.size() == 0) { cout << "Error embedding" << endl; exit(0); } if(a.motionname.size() > 0) { w->addMesh(new DefMesh(m, given, o.embedding, *(o.attachment), new Motion(a.motionname))); } else { w->addMesh(new StaticDisplayMesh(m)); for(i = 1; i < (int)o.embedding.size(); ++i) { w->addLine(LineSegment(o.embedding[i], o.embedding[given.fPrev()[i]], Vector3(.5, .5, 0), 4.)); } } //output skeleton embedding for(i = 0; i < (int)o.embedding.size(); ++i) o.embedding[i] = (o.embedding[i] - m.toAdd) / m.scale; ofstream os("skeleton.out"); for(i = 0; i < (int)o.embedding.size(); ++i) { os << i << " " << o.embedding[i][0] << " " << o.embedding[i][1] << " " << o.embedding[i][2] << " " << a.skeleton.fPrev()[i] << endl; } //output attachment std::ofstream astrm("attachment.out"); for(i = 0; i < (int)m.vertices.size(); ++i) { Vector<double, -1> v = o.attachment->getWeights(i); for(int j = 0; j < v.size(); ++j) { double d = floor(0.5 + v[j] * 10000.) / 10000.; astrm << d << " "; } astrm << endl; } delete o.attachment; }