문제

을 구현하는 코드에서"라는 질문공 충돌 감지 및 처리"목표-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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top