Ejemplo n.º 1
0
void TetrahedronSystem::calculateMass()
{
	const unsigned np = numPoints();
	const unsigned nt = numTetrahedrons();
	const float density = totalMass() / totalInitialVolume();
    const float base = 1.f/(float)np;
    unsigned i;
    float * mass = hostMass();
    for(i=0; i< np; i++) {
		if(isAnchoredPoint(i))
			mass[i] = 1e9f;
        else
			mass[i] = base;
    }
    
    Vector3F * p = (Vector3F *)hostXi();
    
    Vector3F v[4];
    unsigned a, b, c, d;
    unsigned *ind = hostTetrahedronIndices();
    float m;
    for(i=0; i<nt; i++) {
		a = ind[0];
		b = ind[1];
		c = ind[2];
		d = ind[3];
		
		v[0] = p[a];
		v[1] = p[b];
		v[2] = p[c];
		v[3] = p[d];
		
		m = density * tetrahedronVolume(v) * .25f;
		
		mass[a] += m;
		mass[b] += m;
		mass[c] += m;
		mass[d] += m;
		
		ind += 4;
	}
	/*
	for(i=0; i< m_numPoints; i++) {
	    std::cout<<" m "<<mass[i];
    }
    */
}
Ejemplo n.º 2
0
TriangleSystem::TriangleSystem(ATriangleMesh * md) 
{    
    const unsigned np = md->numPoints();
    
    create(md->numTriangles(), md->numTriangles(), np);
    
    Vector3F * p = md->points();
    Vector3F * q = (Vector3F *)hostX();
    unsigned i = 0;
    for(;i<np;i++) q[i] = p[i];
    
    Vector3F * qi = (Vector3F *)hostXi();
    for(i=0;i<np;i++) qi[i] = q[i];
    
    Vector3F * vel = (Vector3F *)hostV();
    for(i=0;i<np;i++) vel[i].setZero();
    
    unsigned * ind = (unsigned *)md->indices();
    unsigned * tris = hostTriangleIndices();
    for(i=0; i< md->numIndices(); i++)
        tris[i] = ind[i];
    
    unsigned * tetra = hostTetrahedronIndices();
    for(i=0; i< md->numTriangles(); i++) {
        tetra[i*4] = ind[i*3];
        tetra[i*4+1] = ind[i*3+1];
        tetra[i*4+2] = ind[i*3+2];
        tetra[i*4+3] = tetra[i*4+2];
    }
    
    float * mass = hostMass();
    for(i=0;i<np;i++) mass[i] = 1e20f;
	
	setNumPoints(np);
	setNumTetrahedrons(md->numTriangles());
	setNumTriangles(md->numTriangles());
}