Advertisement
czaffik

Sphere Collisions

Oct 29th, 2024 (edited)
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.57 KB | None | 0 0
  1. void OpenGLWidget::collisions()
  2. {
  3.     // sprawdzenie i odpowiedź zderzenia cząstki ze ścianami pojemnika:
  4.     for (auto p: particle)
  5.     {
  6.         if (p->getPosition().x() - p->getRadius() <= -1.0)
  7.         {
  8.             p->setPosition(QVector3D(p->getPosition().x() + p->getRadius(), p->getPosition().y(), p->getPosition().z()));
  9.             p->setVelocity(QVector3D(-1.0*p->getVelocity().x(), p->getVelocity().y(), p->getVelocity().z()));
  10.         }
  11.         if (p->getPosition().x() + p->getRadius() >= 1.0)
  12.         {
  13.             p->setPosition(QVector3D(p->getPosition().x() - p->getRadius(), p->getPosition().y(), p->getPosition().z()));
  14.             p->setVelocity(QVector3D(-1.0*p->getVelocity().x(), p->getVelocity().y(), p->getVelocity().z()));
  15.         }
  16.         if (p->getPosition().y() - p->getRadius() <= -1.0)
  17.         {
  18.             p->setPosition(QVector3D(p->getPosition().x(), p->getPosition().y() + p->getRadius(), p->getPosition().z()));
  19.             p->setVelocity(QVector3D(p->getVelocity().x(), -1.0*p->getVelocity().y(), p->getVelocity().z()));
  20.         }
  21.         if (p->getPosition().y() + p->getRadius() >= 1.0)
  22.         {
  23.             p->setPosition(QVector3D(p->getPosition().x(), p->getPosition().y() - p->getRadius(), p->getPosition().z()));
  24.             p->setVelocity(QVector3D(p->getVelocity().x(), -1.0*p->getVelocity().y(), p->getVelocity().z()));
  25.         }
  26.         if (p->getPosition().z() - p->getRadius() <= -1.0)
  27.         {
  28.             p->setPosition(QVector3D(p->getPosition().x(), p->getPosition().y(), p->getPosition().z() + p->getRadius()));
  29.             p->setVelocity(QVector3D(p->getVelocity().x(), p->getVelocity().y(), -1.0*p->getVelocity().z()));
  30.         }
  31.         if (p->getPosition().z() + p->getRadius() >= 1.0)
  32.         {
  33.             p->setPosition(QVector3D(p->getPosition().x(), p->getPosition().y(), p->getPosition().z() - p->getRadius()));
  34.             p->setVelocity(QVector3D(p->getVelocity().x(), p->getVelocity().y(), -1.0*p->getVelocity().z()));
  35.         }
  36.     }
  37.  
  38.     // sprawdzenie i odpowiedź zderzenia cząstki z cząstką:
  39.     float ctol = 0.0001;
  40.     float fCr = 1.0;
  41.     for (int i = 0; i < particle.size()-1; ++i)
  42.     {
  43.         for (int j = i+1; j < particle.size(); ++j)
  44.         {
  45.             float r = particle[i]->getRadius() + particle[j]->getRadius();
  46.             QVector3D d = particle[i]->getPosition() - particle[j]->getPosition();
  47.             float s = d.length() - 2*r;
  48.             d.normalize();
  49.             QVector3D collisionNormal = d;
  50.             QVector3D relativeVelocity = particle[i]->getVelocity() - particle[j]->getVelocity();
  51.  
  52.             float Vrn = QVector3D::dotProduct(relativeVelocity, collisionNormal);
  53.  
  54.             if ((qFabs(s) <= ctol) && (Vrn < 0.0) || s < -ctol)
  55.             {
  56.                 particle[i]->setPosition(particle[i]->getPosition() - (s)*(QVector3D::dotProduct(collisionNormal, particle[i]->getVelocity()))*particle[i]->getVelocity());
  57.                 particle[j]->setPosition(particle[j]->getPosition() - (s)*(QVector3D::dotProduct(collisionNormal, particle[j]->getVelocity()))*particle[j]->getVelocity());
  58.  
  59.                 float jk = (-(1.0 + fCr)*(QVector3D::dotProduct(relativeVelocity, collisionNormal)))/((QVector3D::dotProduct(collisionNormal, collisionNormal)*(1.0/particle[i]->getMass() + 1.0/particle[j]->getMass())));
  60.                 particle[i]->setVelocity(particle[i]->getVelocity() + (jk*collisionNormal)/particle[i]->getMass());
  61.                 particle[j]->setVelocity(particle[j]->getVelocity() - (jk*collisionNormal)/particle[j]->getMass());
  62.             }
  63.         }
  64.     }
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement