したがって、私の問題は、形状がかなりの量の角運動量 (視覚的に目立つもの) を取得すると、衝突が機能しなくなることです。それは衝突し、減速しますが、弾力性が指示するようにはね返らず、1 回のパスで「衝動」することもありません。代わりに、停滞するまで徐々に減速します。
public Vec2 getVelocityAt(Vec2 p) {
return getLinearVelocity().add(new Vec2(-getAngularVelocity() * p.getY(), getAngularVelocity() * p.getX()));
}
問題が上記のコードに直接関連していることはかなり確信しています。ここの方程式に従っています: http://www.myphysicslab.com/collision.html
public boolean checkBounds() {
if(bX1 == bX2 || bY1 == bY2) {
return false;
}
double xa = 0D;
double ya = 0D;
int a = 0;
boolean hC = false;
double xn = 0D;
double yn = 0D;
for(double[] vertex : this.getShape().getVerticies()) {
if(vertex[0] >= bX2) {
xa += vertex[0];
ya += vertex[1];
a++;
hC = true;
xn -= 1D;
}
if(vertex[0] <= bX1) {
xa += vertex[0];
ya += vertex[1];
a++;
hC = true;
xn += 1D;
}
if(vertex[1] >= bY2) {
xa += vertex[0];
ya += vertex[1];
a++;
hC = true;
yn -= 1D;
}
if(vertex[1] <= bY1) {
xa += vertex[0];
ya += vertex[1];
a++;
hC = true;
yn += 1D;
}
}
if(hC) {
Vec2 n = new Vec2(xn, yn).uscale();
Vec2 cp = new Vec2(xa / a, ya / a);
Vec2 rap = cp.sub(getShape().getCM());
Vec2 va = getVelocityAt(rap);
Vec2 rva = va;
Vec2 rvb = Vec2.ZERO_VEC.sub(va);
double pj = -(1D + getElasticity()) * rva.dot(n);
double j = pj / (1 / getShape().getMass() + Math.pow(rap.cross(n), 2D) / getShape().getMass());
applyForce(new AppliedForce(n.scale(j), rap, getShape().getMass()));
}
return hC;
}
public void applyForce(AppliedForce... f) {
for(AppliedForce vec : f) {
Vec2 a = vec.getForce().divide(getShape().getMass());
applyLinearAcceleration(a);
double aa = a.relativeCosine(getShape().getTangent(vec.getOffsetCM())) * a.getMagnitude() / getShape().getMass();
applyAngularAcceleration(aa);
}
}
角速度がない場合、問題は発生せず、角速度が高いほど顕著になります。ポイント関数での速度が問題の根源だと思いますが、その理由は定かではありません。私はデバッグを行いましたが、あまり見つけられませんでした。これは数学の誤解であると思います。誰かが私が間違ったことを知っていますか?