공 충돌-상당한 이익을 속도에 따라 충돌
-
23-08-2019 - |
문제
을 구현하는 코드에서"라는 질문공 충돌 감지 및 처리"목표-C.그러나 공기에 충돌하는 각도로 자신의 속도가 크게 증가합니다.의 모든 벡터 수학을 사용하여 수행됩 cocos2d-아이폰, 헤더와 함께 CGPointExtension.h.의 원인은 무엇이 원하지 않는 가속?
다음은 예의 증가 속도:
입력:
질량==12.56637
속도합니다.x==1.73199439
속도합니다.y==-10.5695238
공입니다.질량==12.56637
공입니다.속도합니다.x==6.04341078
공입니다.속도합니다.y==14.2686739
출력:
질량==12.56637
속도합니다.x==110.004326
속도합니다.y==-10.5695238
공입니다.질량==12.56637
공입니다.속도합니다.x==-102.22892
공입니다.속도합니다.y==-72.4030228
#import "CGPointExtension.h"
#define RESTITUTION_CONSTANT (0.75) //elasticity of the system
- (void) resolveCollision:(Ball*) ball
{
// get the mtd (minimum translation distance)
CGPoint delta = ccpSub(position, ball.position);
float d = ccpLength(delta);
// minimum translation distance to push balls apart after intersecting
CGPoint mtd = ccpMult(delta, (((radius + ball.radius)-d)/d));
// resolve intersection --
// inverse mass quantities
float im1 = 1 / [self mass];
float im2 = 1 / [ball mass];
// push-pull them apart based off their mass
position = ccpAdd(position, ccpMult(mtd, (im1 / (im1 + im2))));
ball.position = ccpSub(ball.position, ccpMult(mtd, (im2 / (im1 + im2))));
// impact speed
CGPoint v = ccpSub(velocity, ball.velocity);
float vn = ccpDot(v,ccpNormalize(mtd));
// sphere intersecting but moving away from each other already
if (vn > 0.0f) return;
// collision impulse
float i = (-(1.0f + RESTITUTION_CONSTANT) * vn) / ([self mass] + [ball mass]);
CGPoint impulse = ccpMult(mtd, i);
// change in momentum
velocity = ccpAdd(velocity, ccpMult(impulse, im1));
ball.velocity = ccpSub(ball.velocity, ccpMult(impulse, im2));
}
해결책
나는 누가 썼는 원본 볼 바운스 코드를 참조됩니다.는 경우 다운로드 고 시도하는 코드는,당신은 그것을 볼 수 있습니다.
다음 코드는 올바른(는 방법 당신은 원래 있었다):
// collision impulse
float i = (-(1.0f + RESTITUTION_CONSTANT) * vn) / (im1 + im2);
CGPoint impulse = ccpMult(mtd, i);
이것은 매우 일반적인 물리 코드고 당신은 그것을 볼 수 있습니다 거의 정확히 구현되는 다음과 같이에서 다음 예제:
이것은 정확한지,그리고 그것~지 않~만들기 CoR1.0 같은 다른 사람을 제안합니다.이것을 계산하는 상대적 임펄스 벡터를 기반으로 질량 계수의 배상.
을 무시하는 마찰,간단한 1d 예제는 다음과 같습니다:
J = -Vr(1+e) / {1/m1 + 1/m2}
전자입니다 CoR,Vr 입니다 당신의 속도의 정상화와 J 스칼라 값의 충격 속도합니다.
계획인 경우에도 고급이 사용할 것을 제안 하나의 많은 물리학 라이브러리는 이미 거기에있다.면 내가 사용하는 코드를 위한 몇 가지 볼 때 그러나 나사적으로 그것을 시작하는 초크.사 Box2D 물리 엔진 과 그 해석할 수 있 처리 더 많은 공과 그것은 훨씬 더 정확합니다.
어쨌든,나는 당신의 코드고 먼저 눈에 보이는 미세한(그것은 꽤 충실한 번역).그것은 아마도 작은 미묘한 오류가의 잘못된 값을 전달되는,또는 벡터 수학 문제입니다.
나는 아무것도 몰라요 아이폰 개발에 관한 그러나 내가 제안하는 것이 중단점을 설정에서 최고의하는 방법과 모니터링 각 단계는 결과 값을 찾아 어디에 타격입니다.는지 확인 MTD 제대로 계산한 영향을 속도,etc.,etc 표시될 때까지는 큰 증가를 받고 소개합니다.
보고서와 함께 다시 값의 각 단계에서는 방법을 우리는 우리가 무엇을 참조하십시오.
다른 팁
원래 포스터의 원본 코드와 주석을 검토 한 후 코드는 동일하게 보이므로 원본이 올바른 구현 인 경우 잘못된 벡터 라이브러리 또는 무시되지 않은 변수를 의심합니다.
배상 계수에 1.0을 추가하는 이유는 무엇입니까?
에서: http://en.wikipedia.org/wiki/coefficient_of_restition
COR은 일반적으로 범위 [0,1]의 숫자입니다. 질적으로, 1은 완벽하게 탄성 충돌을 나타내고, 0은 완벽하게 비탄성 충돌을 나타냅니다. 한 명보다 큰 COR은 이론적으로 가능하며, 육상 광산이 함께 던져지고 폭발하는 것과 같은 운동 에너지를 생성하는 충돌을 나타냅니다.
또 다른 문제는 이것입니다.
/ (im1 + im2)
당신은 접촉 벡터를 따라 충동을 얻기 위해 질량의 역수의 합으로 나누고 있습니다. 아마도 질량 자체의 합으로 나누어야 할 것입니다. 이것은 당신의 충동을 확대합니다 ( "그녀가 말한 것").
이 라인에서 :
CGPoint impulse = ccpMult(mtd, i);
MTD는 정규화되어야합니다. 오류는 원래 코드에서 MTD가 이전 줄에서 정규화되었지만 코드에서는 정규화 되었기 때문에 발생했습니다. 다음과 같은 작업을 수행하여 고칠 수 있습니다.
CGPoint impulse = ccpMult(ccpNormalize(mtd), i);