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);
		}
	}		
}
Example #2
0
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;
}
Example #3
0
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;
}