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]; } */ }
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()); }