Ejemplo n.º 1
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());
}
Ejemplo n.º 2
0
TetrahedronSystem::TetrahedronSystem() 
{
	m_hostTetrahedronVicinityInd = new BaseBuffer;
	m_hostTetrahedronVicinityStart = new BaseBuffer;
	m_hostElementValue = new BaseBuffer;
	create(NTET, NTET * 4, NPNT);
	m_hostElementValue->create(NTET * 4);
    
	float * hv = &hostV()[0];
	
	unsigned i, j;
	float vy = 3.95f;
	float vrx, vry, vrz, vr, vs;
	for(j=0; j < GRDH; j++) {
		for(i=0; i<GRDW; i++) {
		    vs = 1.75f + RandomF01() * 1.5f;
			Vector3F base(9.3f * i, 9.3f * j, 0.f * j);
			Vector3F right = base + Vector3F(1.75f, 0.f, 0.f) * vs;
			Vector3F front = base + Vector3F(0.f, 0.f, 1.75f) * vs;
			Vector3F top = base + Vector3F(0.f, 1.75f, 0.f) * vs;
			if((j&1)==0) {
			    right.y = top.y-.1f;
			}
			else {
			    base.x -= .085f * vs;
			}
			
			vrx = 0.725f * (RandomF01() - .5f);
			vry = 1.f  * (RandomF01() + 1.f)  * vy;
			vrz = 0.732f * (RandomF01() - .5f);
			vr = 0.13f * RandomF01();
			
			addPoint(&base.x);
			hv[0] = vrx + vr;
			hv[1] = vry;
			hv[2] = vrz - vr;
			hv+=3;
			addPoint(&right.x);
			hv[0] = vrx - vr;
			hv[1] = vry;
			hv[2] = vrz + vr;
			hv+=3;
			addPoint(&top.x);
			hv[0] = vrx + vr;
			hv[1] = vry;
			hv[2] = vrz + vr;
			hv+=3;
			addPoint(&front.x);
			hv[0] = vrx - vr;
			hv[1] = vry;
			hv[2] = vrz - vr;
			hv+=3;

			unsigned b = (j * GRDW + i) * 4;
			addTetrahedron(b, b+1, b+2, b+3);		
		}
		vy = -vy;
	}
	setTotalMass(100.f);
    setInitialTotalMass(100.f);
    calculateMass();
    createL2Vicinity();
}