/* Since we know the particles that are close to this one we can do collision * collision detection with the nearby particles * The collision 'mirror' reflection was taken from a paper that uses the twice * the checking distance for collision, the distance to the collision, the normal * it is similar to a perfect mirror reflection but through testing looks better * for water */ void FluidParticle::collisionDetection(FluidParticle *fluidParticles, int numParticles, float timeStep) { // Check Bounding Box float dist; for(int i = 0; i < numParticles; i++) { if(this->id != fluidParticles[i].id) { dist = glm::length(this->pos - fluidParticles[i].pos); if(dist < MAX_DISTANCE) { collisionHandle(fluidParticles[i], dist); } } } }
void DynamicsWorld::CollisionImpact( Integration::DynamicsCollisionData* collisionData ) { DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s\n", __PRETTY_FUNCTION__); DALI_ASSERT_DEBUG(collisionData->mBodyA); DALI_ASSERT_DEBUG(collisionData->mBodyB); if ( !mCollisionSignalV2.Empty() ) { BodyContainer::iterator it = mBodies.begin(); BodyContainer::iterator endIt = mBodies.end(); for( ; it != endIt; ++it ) { if( it->first->GetBody() == collisionData->mBodyA ) { BodyContainer::iterator it2 = mBodies.begin(); for( ; it2 != endIt; ++it2 ) { if( it2->first->GetBody() == collisionData->mBodyB ) { ActorPtr actorA( (*it).second ); ActorPtr actorB( (*it2).second ); DynamicsCollisionPtr collision( new DynamicsCollision ); collision->SetActorA(actorA); collision->SetActorB(actorB); collision->SetPointOnA(collisionData->mPointOnA); collision->SetPointOnB(collisionData->mPointOnB); collision->SetNormal(collisionData->mNormal); collision->SetImpactForce(collisionData->mImpact); Dali::DynamicsCollision collisionHandle( collision.Get() ); Dali::DynamicsWorld worldHandle( this ); mCollisionSignalV2.Emit( worldHandle, collisionHandle ); break; } } break; } } } }
void CDynamicSimulator::doSimulation(double dt, double currentTime) { glColor3f(0,0,0); glPointSize(3); for(int i=0; i<NPARTICLES; i++) { particle[i].simulate(dt, currentTime); } for(int i=0; i<NPARTICLES; i++) { for(int j=i+1; j<NPARTICLES; j++) { collisionHandle(particle[i], particle[j]); } } }