c++ - Ball to Ball Collision resolution Stick together
问题描述
If have the following code which simulates a ball to Ball collision. My problem is, that the balls bounce against each other. I want to have the balls stick together like snow particles. Does anyone know how to do that?
/**
* Rotates coordinate system for velocities
*
* Takes velocities and alters them as if the coordinate system they're on was rotated
*
* @param Object | velocity | The velocity of an individual particle
* @param Float | angle | The angle of collision between two objects in radians
* @return Object | The altered x and y velocities after the coordinate system has been rotated
*/
glm::vec3 rotateVel(glm::vec3 vel, float angle) {
glm::vec3 rotatedVelocities = {
vel.x * std::cos(angle) - vel.y * std::sin(angle),
vel.x * std::sin(angle) + vel.y * std::cos(angle),
0
};
return rotatedVelocities;
}
/**
* Swaps out two colliding particles' x and y velocities after running through
* an elastic collision reaction equation
*
* @param Object | particle | A particle object with x and y coordinates, plus velocity
* @param Object | otherParticle | A particle object with x and y coordinates, plus velocity
* @return Null | Does not return a value
*/
void resolveCollision(Particle& particle, Particle& otherParticle) {
float xVelocityDiff = particle.speed.x - otherParticle.speed.x;
float yVelocityDiff = particle.speed.y - otherParticle.speed.y;
float xDist = otherParticle.pos.x - particle.pos.x;
float yDist = otherParticle.pos.y - particle.pos.y;
// Prevent accidental overlap of particles
if (xVelocityDiff * xDist + yVelocityDiff * yDist >= 0) {
// Grab angle between the two colliding particles
float angle = -std::atan2(otherParticle.pos.y - particle.pos.y, otherParticle.pos.x - particle.pos.x);
// Store mass in var for better readability in collision equation
float m1 = particle.mass;
float m2 = otherParticle.mass;
// Velocity before equation
glm::vec3 u1 = rotateVel(particle.speed, angle);
glm::vec3 u2 = rotateVel(otherParticle.speed, angle);
// Velocity after 1d collision equation
glm::vec3 v1(u1.x * (m1 - m2) / (m1 + m2) + u2.x * 2 * m2 / (m1 + m2),
u1.y,
0.0);
glm::vec3 v2(u2.x * (m1 - m2) / (m1 + m2) + u1.x * 2 * m2 / (m1 + m2),
u2.y,
0.0);
// Final velocity after rotating axis back to original location
glm::vec3 vFinal1 = rotateVel(v1, -angle);
glm::vec3 vFinal2 = rotateVel(v2, -angle);
// Swap particle velocities for realistic bounce effect
particle.speed.x = vFinal1.x *0.5;
particle.speed.y = vFinal1.y * 0.5;
otherParticle.speed.x = vFinal2.x * 0.5;
otherParticle.speed.y = vFinal2.y * 0.5;
}
}
I understand the code but don't know where to change it to get the result I want.
解决方案
void resolveCollision(Particle& particle, Particle& otherParticle) {
float xVelocityDiff = particle.speed.x - otherParticle.speed.x;
float yVelocityDiff = particle.speed.y - otherParticle.speed.y;
float xDist = otherParticle.pos.x - particle.pos.x;
float yDist = otherParticle.pos.y - particle.pos.y;
// Prevent accidental overlap of particles
if (xVelocityDiff * xDist + yVelocityDiff * yDist >= 0) {
// Grab angle between the two colliding particles
float angle = -std::atan2(otherParticle.pos.y - particle.pos.y, otherParticle.pos.x - particle.pos.x);
// Store mass in var for better readability in collision equation
float m1 = particle.mass;
float m2 = otherParticle.mass;
// Velocity before equation
glm::vec3 u1 = rotateVel(particle.speed, angle);
glm::vec3 u2 = rotateVel(otherParticle.speed, angle);
// Velocity after 1d collision equation
glm::vec3 v1(u1.x * (m1 - m2) / (m1 + m2) + u2.x * 2 * m2 / (m1 + m2),
u1.y,
0.0);
glm::vec3 v2(u2.x * (m1 - m2) / (m1 + m2) + u1.x * 2 * m2 / (m1 + m2),
u2.y,
0.0);
// Final velocity after rotating axis back to original location
glm::vec3 vFinal1 = rotateVel(v1, -angle);
glm::vec3 vFinal2 = rotateVel(v2, -angle);
// Swap particle velocities for realistic bounce effect
particle.speed.x = vFinal1.x;
particle.speed.y = vFinal1.y;
otherParticle.speed.x = vFinal1.x;
otherParticle.speed.y = vFinal1.y;
}
}
This solution worked for me.
推荐阅读
- javascript - 如何编写高阶函数以在 JavaScript 中提供控制流?
- c# - 如何在控制台上的 x 坐标上移动字符串的所有字符
- python-3.x - 为什么我的 while 函数不能在 Python 上运行?
- sql-server - 在 grails 3.3.9 中提供默认的辅助排序列
- python - 在 python 中验证数据的最佳方法是什么?
- erlang - Tsung 中用于动态替换的模块的 Erlang 代码放在哪里
- css - 如何为不同的伪类复制材质 UI 样式?
- c# - 如何使用 .net SDK (c#) 创建 Azure 搜索索引器以从 Azure Blob 存储中提取数据
- javascript - 如何检查项目是否已经在 LocalStorage 中
- mysql - 在 Where 条件中使用带有 AND 语句的 if 或 CASE WHEN