2014-02-23 5 views
0

내 문제는 모양에 상당한 양의 각운동량 (시각적으로 눈에 띄는 것)이 생기면 충돌이 더 이상 작동하지 않는다는 것입니다. 그것은 충돌하고, 속도가 느려지지만, 탄력성이 지시 할 때 리바운드하지 않으며, 한 번에 '충격적'도 아니며, 정체 될 때까지 서서히 속도를 줄입니다. 어떤 각속도가없는 경우 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); 
    } 
} 

, 그럼 아무 문제가 발생하지 :

public Vec2 getVelocityAt(Vec2 p) { 
    return getLinearVelocity().add(new Vec2(-getAngularVelocity() * p.getY(), getAngularVelocity() * p.getX())); 
} 

나는 여기 방정식을 다음있어, 문제가 바로 위의 코드 관련이 상당히 확실 해요 더 높은 각속도에 의해 더 발음된다. 나는 포인트 함수에서의 속도가 이슈의 근원이라고 생각하지만 왜 그런지는 확실하지 않다. 나는 많은 것을 발견하지 못하고 디버깅을 해왔다. 수학에 대한 오해라고 생각한다. 아무도 내가 뭘 잘못했는지 알아?

랩 벡터 대량의 중심에서
vap1 = va1 + ωa1 × rap 

이 몸 쪽을 가리 키도록 : 나는 절에서 첫 공식 찾고 있어요

답변

1

2 치수 페이지의 강체에 대한 충돌의 물리학 당신은 연결 a, 이것이 랩을 사용하는 것이라면 랩은 p에서 접하지 않습니다. 오히려 당신은 t = (p in world) - (CM in world)을 원할 것입니다.

+0

그러나 내 각속도는 벡터가 아니라 이중입니다. 그것은 독립적 인 구성 요소입니다. 내가 어떻게 설정했는지는 그것을위한 크로스 제품이어야한다. 각속도를 기준으로 질량 중심에 대한 선형 속도를 계산해야합니까? – user2507230

+0

죄송합니다. 내 실수로 인해 교차 상품을 작성한 지 오래되었습니다.} 2D로되어있어 각속도가 ang 속도와 동일한 표준 z 축입니다. 방금 더 조심스럽게 보았습니다. 문제는 괜찮습니다. 문제는 다른 곳에서 발생합니다. 나는 다시 시작했다. – Schollii

+0

va1은 선형 속도이며 add 문에 포함 된 코드에서 wa1과 rap1을 교차시킵니다. 나는 랩의 잘못된 순서로 빼는 것 같아. 편집 : 오. 나는 바보, 고마워. – user2507230