2011-08-26 1 views
0

나는 충돌이 표준화 거리 (포스트 충돌) - 자바 스크립트

감지 된 후 충돌이 감지 그래서

do_shapes_collide: function(shape1,shape2) 
{ 
    var reach1 = shape1.radius + shape1.velocity() + vr.o.border_width; 
    var reach2 = shape2.radius + shape2.velocity() + vr.o.border_width; 

    var distance = vr.distance(shape1, shape2); 

    return distance < reach1 + reach2; 

}, 

우리가 결정하고 나면 두 볼 사이의 거리를 정상화하기 위해 노력하고있어 이 구가 충돌하고 있습니다. 서로 거리를 재설정해야합니다 ... 포인트/슬로프 수식 등을 사용하여 대수학 수업을하는 중입니다.

필요한 거리가 있습니다. 그들 사이에 존재하는 것 (내가 생각하는 것) 충돌 각.

충돌 각도에 x/y를 설정해야합니다. 내가 shape의 X와 Y를 설정하는 이곳에서 무엇을해야하는지에 빈 그리기

...

if (vr.do_shapes_collide(shape, next_shape)) 
{ 
    var req_distance = shape.radius + next_shape.radius + (vr.o.border_width * 2); 
    var slope = (shape.y - next_shape.y)/(shape.x - next_shape.x); 
    shape.x = 
    shape.y = 
} 

답변

3

생각해 벡터. 두 모양이 겹쳐져 있다면, 하나의 중심에서 다른 중심의 중심까지 벡터가 생깁니다 (이것은 속도가 그들의 위치에 추가 된 후에 만 ​​의미가 있습니다.) :

shape에서 next_shape에 벡터의
var diff = { 
    x: next_shape.x - shape.x, 
    y: next_shape.y - shape.y 
}; 

. 그리고 모양이 떨어져 있어야 할 필요가있는 것보다 규모가 작습니다 (짧습니다). 그래서 모양 지금

var diff_magnitude = Math.sqrt(diff.x*diff.x + diff.y*diff.y); 
var overlap = (req_distance - diff_magnitude)/2; // each shape needs to move this distance 

이동 경기에 diff 벡터의 크기를 조절하는 거리/크기

diff.x = overlap * diff.x/diff_magnitude; 
diff.y = overlap * diff.y/diff_magnitude; 

에게 마지막으로 한 방향으로 하나 개의 도형을 이동하는 데 필요한 양, 다른 형태를 찾을 수 반대 방향으로

shape.x -= diff.x; 
shape.y -= diff.y; 
next_shape.x += diff.x; 
next_shape.y += diff.y; 

이제 두 모양이 서로 대립해야합니다.

또한 속도가 긍정/부정적인 방향 인 diff으로 설정되기를 원할 것입니다. 따라서 속도가 유지된다면 충돌 후 궤도에서 계속 진행할 수 있습니다.

실제로는 서로 모양을 "바운스"하지 않지만 겹치기 시작한 후에 존재하는 겹침을 해결할 수있을만큼 멀리 이동합니다. 그래서 다소 단순합니다. 그러나 충돌 탐지 및 충돌 대응을위한보다 정확한 방법을 제공하는 수많은 소스가 있습니다.

+0

성도 여러분, 저는 제 대답을 할뿐만 아니라 진실로 이해합니다. – jondavidjohn