void Grid::insertParticles(btFluidParticles& particles) { if (particles.size() == 0) return; m_particles = &particles; for(int i = 0; i < particles.size(); ++i) { const btVector3& position = particles.m_pos[i]; CellPosition pos = getCellPosition(position); m_data[pos.x][pos.y][pos.z].indices.push_back(i); } }
void btFluidSphSolver::integratePositionsSingleFluid(const btFluidSphParametersGlobal& FG, btFluidParticles& particles) { BT_PROFILE("btFluidSphSolver::integratePositionsSingleFluid()"); //Velocity is at simulation scale; divide by simulation scale to convert to world scale btScalar timeStepDivSimScale = FG.m_timeStep / FG.m_simulationScale; //Leapfrog integration //p(t+1) = p(t) + v(t+1/2)*dt for(int i = 0; i < particles.size(); ++i) particles.m_pos[i] += particles.m_vel[i] * timeStepDivSimScale; }
float Potential(mpVector p, const btFluidParticles &particles) { btVector3 pos(p.x, p.y, p.z); float val = Constant.m_particleMass * Constant.W_Poly6(btVector3(0, 0, 0)); for (int i = 0; i < particles.size(); i++) { btVector3 r = particles.m_pos[i] - pos ; btScalar rSquared = r.length2(); if(Constant.m_hSquared > rSquared) { btScalar tmp = Constant.m_particleMass * Constant.W_Poly6(r); val += tmp; } } return val; }