引力和碰撞
Gravitational attraction and collision
我制作了一个简单的程序来模拟圆形物体在重力和碰撞环境中与圆形表面的行为。
我的问题与重力的应用有关:每当一个物体非常靠近吸引子时,它就会开始重新获得高度,我认为导致这个问题的原因是,假设球以非常大的速度接触地面低速,我的程序应用重力,如果它会接触,反转力并再次将其发送到空中。
我尝试在球达到足够低的速度后将其停止,但总体效果不尽人意(它永远不会慢到使它看起来不好看)
这是代码,您认为哪里有误?由于我只列出了部分代码并且它非常复杂,所以我不希望得到具体的响应,但是您认为问题 通常 可能在哪里?
我的猜测是我不尊重 kinetic/potential 能量关系,但我也不知道如何使它正确:/
void update(ArrayList<Attracter>a) {
pos.add(acceleration);
println(acceleration.mag());
for (Attracter ar : a)
if (PVector.dist(pos, ar.pos)<ar.size/2+size/2) {
//send the compenetrated body back
float difference=((ar.size/2+size/2)-PVector.dist(pos, ar.pos)+1);
pos.sub(acceleration.copy().normalize().mult(difference));
//calculate the new acceleration
PVector perpendicular= PVector.sub(pos,ar.pos).normalize(); //perpendicolare
float angle=perpendicular.rotate(-PI/2).heading();//angolo dellatangente
perpendicular.rotate(-angle); //normalizzo l'angolo
acceleration.rotate(-angle); //normalizzo l'accellerazione
PVector newAcceleration= PVector.fromAngle(perpendicular.heading()-acceleration.heading());
acceleration=newAcceleration.setMag(acceleration.mag());
acceleration.rotate(angle); //denormalizzo l'accellerazione
//push the body forward
pos.add(acceleration.copy().normalize().mult(difference));
acceleration.mult(0.9);
}
}
删除difference calculation
中的+1
,即尝试替换
float difference=((ar.size/2+size/2)-PVector.dist(pos, ar.pos)+1);
和
float difference=((ar.size/2+size/2)-PVector.dist(pos, ar.pos));
我制作了一个简单的程序来模拟圆形物体在重力和碰撞环境中与圆形表面的行为。
我的问题与重力的应用有关:每当一个物体非常靠近吸引子时,它就会开始重新获得高度,我认为导致这个问题的原因是,假设球以非常大的速度接触地面低速,我的程序应用重力,如果它会接触,反转力并再次将其发送到空中。
我尝试在球达到足够低的速度后将其停止,但总体效果不尽人意(它永远不会慢到使它看起来不好看)
这是代码,您认为哪里有误?由于我只列出了部分代码并且它非常复杂,所以我不希望得到具体的响应,但是您认为问题 通常 可能在哪里? 我的猜测是我不尊重 kinetic/potential 能量关系,但我也不知道如何使它正确:/
void update(ArrayList<Attracter>a) {
pos.add(acceleration);
println(acceleration.mag());
for (Attracter ar : a)
if (PVector.dist(pos, ar.pos)<ar.size/2+size/2) {
//send the compenetrated body back
float difference=((ar.size/2+size/2)-PVector.dist(pos, ar.pos)+1);
pos.sub(acceleration.copy().normalize().mult(difference));
//calculate the new acceleration
PVector perpendicular= PVector.sub(pos,ar.pos).normalize(); //perpendicolare
float angle=perpendicular.rotate(-PI/2).heading();//angolo dellatangente
perpendicular.rotate(-angle); //normalizzo l'angolo
acceleration.rotate(-angle); //normalizzo l'accellerazione
PVector newAcceleration= PVector.fromAngle(perpendicular.heading()-acceleration.heading());
acceleration=newAcceleration.setMag(acceleration.mag());
acceleration.rotate(angle); //denormalizzo l'accellerazione
//push the body forward
pos.add(acceleration.copy().normalize().mult(difference));
acceleration.mult(0.9);
}
}
删除difference calculation
中的+1
,即尝试替换
float difference=((ar.size/2+size/2)-PVector.dist(pos, ar.pos)+1);
和
float difference=((ar.size/2+size/2)-PVector.dist(pos, ar.pos));